1
// Skipped under Miri: these tests compile+run wasm via wasmtime, whose
2
// Cranelift backend refuses to run under Miri.
3
#![cfg(not(miri))]
4

            
5
use nms::interpreter::Interpreter;
6
use scripting::nomiscript::{Fraction, Value};
7

            
8
#[test]
9
1
fn test_eval_nil() {
10
1
    let mut interp = Interpreter::new(false).unwrap();
11
1
    let results = interp.eval("nil").unwrap();
12
1
    assert_eq!(results, vec![Value::Nil]);
13
1
}
14

            
15
#[test]
16
1
fn test_eval_bool() {
17
1
    let mut interp = Interpreter::new(false).unwrap();
18
1
    assert_eq!(interp.eval("t").unwrap(), vec![Value::T]);
19
1
    assert_eq!(interp.eval("T").unwrap(), vec![Value::T]);
20
1
}
21

            
22
#[test]
23
1
fn test_eval_empty_list_is_nil() {
24
1
    let mut interp = Interpreter::new(false).unwrap();
25
1
    assert_eq!(interp.eval("()").unwrap(), vec![Value::Nil]);
26
1
}
27

            
28
#[test]
29
1
fn test_eval_number() {
30
1
    let mut interp = Interpreter::new(false).unwrap();
31
1
    let results = interp.eval("0.75").unwrap();
32
1
    assert_eq!(results, vec![Value::Number(Fraction::new(3, 4))]);
33
1
}
34

            
35
#[test]
36
1
fn test_eval_integer() {
37
1
    let mut interp = Interpreter::new(false).unwrap();
38
1
    let results = interp.eval("42").unwrap();
39
1
    assert_eq!(results, vec![Value::Number(Fraction::from_integer(42))]);
40
1
}
41

            
42
#[test]
43
1
fn test_eval_string() {
44
1
    let mut interp = Interpreter::new(false).unwrap();
45
1
    assert_eq!(
46
1
        interp.eval(r#""hello""#).unwrap(),
47
1
        vec![Value::String("hello".to_string())]
48
    );
49
1
}
50

            
51
#[test]
52
1
fn test_eval_empty_string() {
53
1
    let mut interp = Interpreter::new(false).unwrap();
54
1
    assert_eq!(
55
1
        interp.eval(r#""""#).unwrap(),
56
1
        vec![Value::String(String::new())]
57
    );
58
1
}
59

            
60
#[test]
61
1
fn test_eval_string_with_unicode() {
62
1
    let mut interp = Interpreter::new(false).unwrap();
63
1
    assert_eq!(
64
1
        interp.eval(r#""日本語""#).unwrap(),
65
1
        vec![Value::String("日本語".to_string())]
66
    );
67
1
}
68

            
69
#[test]
70
1
fn test_eval_empty() {
71
1
    let mut interp = Interpreter::new(false).unwrap();
72
1
    let results = interp.eval("").unwrap();
73
1
    assert!(results.is_empty());
74
1
}
75

            
76
#[test]
77
1
fn test_eval_revision() {
78
1
    let mut interp = Interpreter::new(false).unwrap();
79
1
    let results = interp.eval("revision").unwrap();
80
1
    assert_eq!(results.len(), 1);
81
1
    match &results[0] {
82
1
        Value::String(s) => {
83
1
            assert!(!s.is_empty());
84
7
            assert!(s.chars().all(|c| c.is_ascii_hexdigit()));
85
        }
86
        _ => panic!("expected string, got {:?}", results[0]),
87
    }
88
1
}
89

            
90
#[test]
91
1
fn test_eval_undefined_symbol() {
92
1
    let mut interp = Interpreter::new(false).unwrap();
93
1
    let result = interp.eval("unknown");
94
1
    assert!(result.is_err());
95
1
}
96

            
97
#[test]
98
1
fn test_eval_debug_call() {
99
1
    let mut interp = Interpreter::new(false).unwrap();
100
1
    let results = interp.eval(r#"(debug "hello")"#).unwrap();
101
1
    assert_eq!(results, vec![Value::Nil]);
102
1
}
103

            
104
#[test]
105
1
fn test_eval_debug_variadic() {
106
1
    let mut interp = Interpreter::new(false).unwrap();
107
1
    let results = interp.eval(r#"(debug "hello" revision 1 2 3)"#).unwrap();
108
1
    assert_eq!(results, vec![Value::Nil]);
109
1
}
110

            
111
#[test]
112
1
fn test_eval_debug_no_args() {
113
1
    let mut interp = Interpreter::new(false).unwrap();
114
1
    let results = interp.eval("(debug)").unwrap();
115
1
    assert_eq!(results, vec![Value::Nil]);
116
1
}