1
use ron::de::{from_str, Error, Position, Span, SpannedError as RonErr};
2

            
3
#[test]
4
4
fn test_simple() {
5
4
    assert_eq!(
6
4
        from_str(
7
4
            "/*
8
4
 * We got a hexadecimal number here!
9
4
 *
10
4
 */0x507"
11
        ),
12
        Ok(0x507)
13
    );
14
4
}
15

            
16
#[test]
17
4
fn test_nested() {
18
4
    assert_eq!(
19
4
        from_str(
20
4
            "/*
21
4
        /* quite * some * nesting * going * on * /* here /* (yeah, maybe a bit too much) */ */ */
22
4
    */
23
4
    // The actual value comes.. /*
24
4
    // very soon, these are just checks that */
25
4
    // multi-line comments don't trigger in line comments /*
26
4
\"THE VALUE\" /* This is the value /* :) */ */
27
4
    "
28
        ),
29
4
        Ok("THE VALUE".to_owned())
30
    );
31
4
}
32

            
33
#[test]
34
4
fn test_unclosed() {
35
4
    assert_eq!(
36
4
        from_str::<String>("\"hi\" /*"),
37
        Err(RonErr {
38
            code: Error::UnclosedBlockComment,
39
            span: Span {
40
                start: Position { line: 1, col: 6 },
41
                end: Position { line: 1, col: 8 }
42
            }
43
        })
44
    );
45
4
    assert_eq!(
46
4
        from_str::<String>(
47
4
            "/*
48
4
        /* quite * some * nesting * going * on * /* here /* (yeah, maybe a bit too much) */ */ */
49
4
    */
50
4
    // The actual value comes.. /*
51
4
    // very soon, these are just checks that */
52
4
    // multi-line comments don't trigger in line comments /*
53
4
/* Unfortunately, this comment won't get closed :(
54
4
\"THE VALUE (which is invalid)\"
55
4
"
56
        ),
57
        Err(RonErr {
58
            code: Error::UnclosedBlockComment,
59
            span: Span {
60
                start: Position { line: 7, col: 3 },
61
                end: Position { line: 9, col: 1 }
62
            }
63
        })
64
    );
65
4
}
66

            
67
#[test]
68
4
fn test_unexpected_byte() {
69
4
    assert_eq!(
70
4
        from_str::<u8>("42 /q"),
71
        Err(RonErr {
72
            code: Error::UnexpectedChar('q'),
73
            span: Span {
74
                start: Position { line: 1, col: 4 },
75
                end: Position { line: 1, col: 6 },
76
            }
77
        })
78
    );
79
4
}
80

            
81
#[test]
82
4
fn test_comment_after_literal_in_newtype_lookahead() {
83
    #[derive(Debug, PartialEq, serde::Deserialize)]
84
    enum Cmd {
85
        Echo(Msg),
86
    }
87

            
88
    #[derive(Debug, PartialEq, serde::Deserialize)]
89
    #[serde(untagged)]
90
    enum Msg {
91
        One(ron::Value),
92
        Many(Vec<ron::Value>),
93
    }
94

            
95
    #[derive(Debug, PartialEq, serde::Deserialize)]
96
    #[serde(untagged)]
97
    enum Untagged {
98
        Cmd(Cmd),
99
    }
100

            
101
    // A comment directly after a literal must not be scanned as code
102
12
    for (ron, inner) in [
103
4
        ("\"hi\"", ron::Value::String(String::from("hi"))),
104
4
        ("'h'", ron::Value::Char('h')),
105
4
        ("b\"hi\"", ron::Value::Bytes(b"hi".to_vec())),
106
4
    ] {
107
12
        let expected = Cmd::Echo(Msg::One(inner));
108

            
109
36
        for comment in ["", "/*,x*/", "// note\n"] {
110
36
            let ron = format!("Echo({}{})", ron, comment);
111

            
112
36
            assert_eq!(
113
36
                from_str::<Cmd>(&format!("#![enable(unwrap_variant_newtypes)] {}", ron)).as_ref(),
114
36
                Ok(&expected),
115
                "{}",
116
                ron,
117
            );
118
36
            assert_eq!(
119
36
                from_str::<Untagged>(&ron)
120
36
                    .map(|Untagged::Cmd(cmd)| cmd)
121
36
                    .as_ref(),
122
36
                Ok(&expected),
123
                "{}",
124
                ron,
125
            );
126
        }
127
    }
128
4
}