summaryrefslogtreecommitdiffstats
path: root/third_party/rust/litrs/src/byte/tests.rs
blob: 3cf16b5fc2b27f1d46662368df720f57a7d9deb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
use crate::{ByteLit, Literal, test_util::{assert_parse_ok_eq, assert_roundtrip}};

// ===== Utility functions =======================================================================

macro_rules! check {
    ($lit:literal) => { check!($lit, stringify!($lit), "") };
    ($lit:literal, $input:expr, $suffix:literal) => {
        let input = $input;
        let expected = ByteLit {
            raw: input,
            start_suffix: input.len() - $suffix.len(),
            value: $lit,
        };

        assert_parse_ok_eq(input, ByteLit::parse(input), expected.clone(), "ByteLit::parse");
        assert_parse_ok_eq(input, Literal::parse(input), Literal::Byte(expected), "Literal::parse");
        let lit = ByteLit::parse(input).unwrap();
        assert_eq!(lit.value(), $lit);
        assert_eq!(lit.suffix(), $suffix);
        assert_roundtrip(expected.to_owned(), input);
    };
}


// ===== Actual tests ============================================================================

#[test]
fn alphanumeric() {
    check!(b'a');
    check!(b'b');
    check!(b'y');
    check!(b'z');
    check!(b'A');
    check!(b'B');
    check!(b'Y');
    check!(b'Z');

    check!(b'0');
    check!(b'1');
    check!(b'8');
    check!(b'9');
}

#[test]
fn special_chars() {
    check!(b' ');
    check!(b'!');
    check!(b'"');
    check!(b'#');
    check!(b'$');
    check!(b'%');
    check!(b'&');
    check!(b'(');
    check!(b')');
    check!(b'*');
    check!(b'+');
    check!(b',');
    check!(b'-');
    check!(b'.');
    check!(b'/');
    check!(b':');
    check!(b';');
    check!(b'<');
    check!(b'=');
    check!(b'>');
    check!(b'?');
    check!(b'@');
    check!(b'[');
    check!(b']');
    check!(b'^');
    check!(b'_');
    check!(b'`');
    check!(b'{');
    check!(b'|');
    check!(b'}');
    check!(b'~');
}

#[test]
fn quote_escapes() {
    check!(b'\'');
    check!(b'\"');
}

#[test]
fn ascii_escapes() {
    check!(b'\n');
    check!(b'\r');
    check!(b'\t');
    check!(b'\\');
    check!(b'\0');

    check!(b'\x00');
    check!(b'\x01');
    check!(b'\x0c');
    check!(b'\x0D');
    check!(b'\x13');
    check!(b'\x30');
    check!(b'\x30');
    check!(b'\x4B');
    check!(b'\x6b');
    check!(b'\x7F');
    check!(b'\x7f');
}

#[test]
fn byte_escapes() {
    check!(b'\x80');
    check!(b'\x8a');
    check!(b'\x8C');
    check!(b'\x99');
    check!(b'\xa0');
    check!(b'\xAd');
    check!(b'\xfe');
    check!(b'\xFe');
    check!(b'\xfF');
    check!(b'\xFF');
}

#[test]
fn suffixes() {
    check!(b'a', r##"b'a'peter"##, "peter");
    check!(b'#', r##"b'#'peter"##, "peter");
    check!(b'\n', r##"b'\n'peter"##, "peter");
    check!(b'\'', r##"b'\''peter"##, "peter");
    check!(b'\"', r##"b'\"'peter"##, "peter");
    check!(b'\xFF', r##"b'\xFF'peter"##, "peter");
}

#[test]
fn invald_escapes() {
    assert_err!(ByteLit, r"b'\a'", UnknownEscape, 2..4);
    assert_err!(ByteLit, r"b'\y'", UnknownEscape, 2..4);
    assert_err!(ByteLit, r"b'\", UnterminatedEscape, 2..3);
    assert_err!(ByteLit, r"b'\x'", UnterminatedEscape, 2..5);
    assert_err!(ByteLit, r"b'\x1'", InvalidXEscape, 2..6);
    assert_err!(ByteLit, r"b'\xaj'", InvalidXEscape, 2..6);
    assert_err!(ByteLit, r"b'\xjb'", InvalidXEscape, 2..6);
}

#[test]
fn unicode_escape_not_allowed() {
    assert_err!(ByteLit, r"b'\u{0}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{00}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{b}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{B}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{7e}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{E4}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{e4}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{fc}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{Fc}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{fC}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{FC}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{b10}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{B10}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{0b10}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{2764}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{1f602}'", UnicodeEscapeInByteLiteral, 2..4);
    assert_err!(ByteLit, r"b'\u{1F602}'", UnicodeEscapeInByteLiteral, 2..4);
}

#[test]
fn parse_err() {
    assert_err!(ByteLit, r"b''", EmptyByteLiteral, None);
    assert_err!(ByteLit, r"b' ''", UnexpectedChar, 4..5);

    assert_err!(ByteLit, r"b'", UnterminatedByteLiteral, None);
    assert_err!(ByteLit, r"b'a", UnterminatedByteLiteral, None);
    assert_err!(ByteLit, r"b'\n", UnterminatedByteLiteral, None);
    assert_err!(ByteLit, r"b'\x35", UnterminatedByteLiteral, None);

    assert_err!(ByteLit, r"b'ab'", OverlongByteLiteral, None);
    assert_err!(ByteLit, r"b'a _'", OverlongByteLiteral, None);
    assert_err!(ByteLit, r"b'\n3'", OverlongByteLiteral, None);

    assert_err!(ByteLit, r"", Empty, None);

    assert_err!(ByteLit, r"b'''", UnescapedSingleQuote, 2);
    assert_err!(ByteLit, r"b''''", UnescapedSingleQuote, 2);

    assert_err!(ByteLit, "b'\n'", UnescapedSpecialWhitespace, 2);
    assert_err!(ByteLit, "b'\t'", UnescapedSpecialWhitespace, 2);
    assert_err!(ByteLit, "b'\r'", UnescapedSpecialWhitespace, 2);

    assert_err!(ByteLit, "b'న'", NonAsciiInByteLiteral, 2);
    assert_err!(ByteLit, "b'犬'", NonAsciiInByteLiteral, 2);
    assert_err!(ByteLit, "b'🦊'", NonAsciiInByteLiteral, 2);
}