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::Bool(true)]);
19
1
    assert_eq!(interp.eval("#T").unwrap(), vec![Value::Bool(true)]);
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_false_is_nil() {
30
1
    let mut interp = Interpreter::new(false).unwrap();
31
1
    assert_eq!(interp.eval("#f").unwrap(), vec![Value::Nil]);
32
1
    assert_eq!(interp.eval("#F").unwrap(), vec![Value::Nil]);
33
1
}
34

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

            
42
#[test]
43
1
fn test_eval_integer() {
44
1
    let mut interp = Interpreter::new(false).unwrap();
45
1
    let results = interp.eval("42").unwrap();
46
1
    assert_eq!(results, vec![Value::Number(Fraction::from_integer(42))]);
47
1
}
48

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

            
58
#[test]
59
1
fn test_eval_empty_string() {
60
1
    let mut interp = Interpreter::new(false).unwrap();
61
1
    assert_eq!(
62
1
        interp.eval(r#""""#).unwrap(),
63
1
        vec![Value::String(String::new())]
64
    );
65
1
}
66

            
67
#[test]
68
1
fn test_eval_string_with_unicode() {
69
1
    let mut interp = Interpreter::new(false).unwrap();
70
1
    assert_eq!(
71
1
        interp.eval(r#""日本語""#).unwrap(),
72
1
        vec![Value::String("日本語".to_string())]
73
    );
74
1
}
75

            
76
#[test]
77
1
fn test_eval_empty() {
78
1
    let mut interp = Interpreter::new(false).unwrap();
79
1
    let results = interp.eval("").unwrap();
80
1
    assert!(results.is_empty());
81
1
}
82

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

            
97
#[test]
98
1
fn test_eval_undefined_symbol() {
99
1
    let mut interp = Interpreter::new(false).unwrap();
100
1
    let result = interp.eval("unknown");
101
1
    assert!(result.is_err());
102
1
}
103

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

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

            
118
#[test]
119
1
fn test_eval_debug_no_args() {
120
1
    let mut interp = Interpreter::new(false).unwrap();
121
1
    let results = interp.eval("(debug)").unwrap();
122
1
    assert_eq!(results, vec![Value::Nil]);
123
1
}