1
use crate::ast::Expr;
2

            
3
use super::Reader;
4

            
5
6
fn reader_error(input: &str) -> String {
6
6
    Reader::parse(input)
7
6
        .err()
8
6
        .map(|e| e.to_string())
9
6
        .unwrap_or_else(|| panic!("{input:?} must be a reader error"))
10
6
}
11

            
12
#[test]
13
1
fn scheme_true_is_a_reader_error() {
14
3
    for input in ["#t", "#T", "(if #t 1 2)"] {
15
3
        let message = reader_error(input);
16
3
        assert!(
17
3
            message.contains("#t is not nomiscript syntax; use t"),
18
            "{input:?}: {message}"
19
        );
20
    }
21
1
}
22

            
23
#[test]
24
1
fn scheme_false_is_a_reader_error() {
25
3
    for input in ["#f", "#F", "'#f"] {
26
3
        let message = reader_error(input);
27
3
        assert!(
28
3
            message.contains("#f is not nomiscript syntax; use nil"),
29
            "{input:?}: {message}"
30
        );
31
    }
32
1
}
33

            
34
#[test]
35
1
fn empty_parens_read_as_nil() {
36
1
    assert_eq!(Reader::parse("()").unwrap().exprs, vec![Expr::Nil]);
37
1
    assert_eq!(Reader::parse("( )").unwrap().exprs, vec![Expr::Nil]);
38
1
    assert_eq!(Reader::parse("'()").unwrap().exprs, vec![Expr::Nil]);
39
1
    assert_eq!(Reader::parse("'t").unwrap().exprs, vec![Expr::T]);
40
1
}
41

            
42
#[test]
43
1
fn a_symbol_that_starts_with_nil_is_one_symbol() {
44
1
    assert_eq!(
45
1
        Reader::parse("nilly nil-x").unwrap().exprs,
46
1
        vec![Expr::Symbol("NILLY".into()), Expr::Symbol("NIL-X".into())]
47
    );
48
1
}