1 use crate::{ByteLit, Literal, test_util::{assert_parse_ok_eq, assert_roundtrip}};
2
3 // ===== Utility functions =======================================================================
4
5 macro_rules! check {
6 ($lit:literal) => { check!($lit, stringify!($lit), "") };
7 ($lit:literal, $input:expr, $suffix:literal) => {
8 let input = $input;
9 let expected = ByteLit {
10 raw: input,
11 start_suffix: input.len() - $suffix.len(),
12 value: $lit,
13 };
14
15 assert_parse_ok_eq(input, ByteLit::parse(input), expected.clone(), "ByteLit::parse");
16 assert_parse_ok_eq(input, Literal::parse(input), Literal::Byte(expected), "Literal::parse");
17 let lit = ByteLit::parse(input).unwrap();
18 assert_eq!(lit.value(), $lit);
19 assert_eq!(lit.suffix(), $suffix);
20 assert_roundtrip(expected.to_owned(), input);
21 };
22 }
23
24
25 // ===== Actual tests ============================================================================
26
27 #[test]
alphanumeric()28 fn alphanumeric() {
29 check!(b'a');
30 check!(b'b');
31 check!(b'y');
32 check!(b'z');
33 check!(b'A');
34 check!(b'B');
35 check!(b'Y');
36 check!(b'Z');
37
38 check!(b'0');
39 check!(b'1');
40 check!(b'8');
41 check!(b'9');
42 }
43
44 #[test]
special_chars()45 fn special_chars() {
46 check!(b' ');
47 check!(b'!');
48 check!(b'"');
49 check!(b'#');
50 check!(b'$');
51 check!(b'%');
52 check!(b'&');
53 check!(b'(');
54 check!(b')');
55 check!(b'*');
56 check!(b'+');
57 check!(b',');
58 check!(b'-');
59 check!(b'.');
60 check!(b'/');
61 check!(b':');
62 check!(b';');
63 check!(b'<');
64 check!(b'=');
65 check!(b'>');
66 check!(b'?');
67 check!(b'@');
68 check!(b'[');
69 check!(b']');
70 check!(b'^');
71 check!(b'_');
72 check!(b'`');
73 check!(b'{');
74 check!(b'|');
75 check!(b'}');
76 check!(b'~');
77 }
78
79 #[test]
quote_escapes()80 fn quote_escapes() {
81 check!(b'\'');
82 check!(b'\"');
83 }
84
85 #[test]
ascii_escapes()86 fn ascii_escapes() {
87 check!(b'\n');
88 check!(b'\r');
89 check!(b'\t');
90 check!(b'\\');
91 check!(b'\0');
92
93 check!(b'\x00');
94 check!(b'\x01');
95 check!(b'\x0c');
96 check!(b'\x0D');
97 check!(b'\x13');
98 check!(b'\x30');
99 check!(b'\x30');
100 check!(b'\x4B');
101 check!(b'\x6b');
102 check!(b'\x7F');
103 check!(b'\x7f');
104 }
105
106 #[test]
byte_escapes()107 fn byte_escapes() {
108 check!(b'\x80');
109 check!(b'\x8a');
110 check!(b'\x8C');
111 check!(b'\x99');
112 check!(b'\xa0');
113 check!(b'\xAd');
114 check!(b'\xfe');
115 check!(b'\xFe');
116 check!(b'\xfF');
117 check!(b'\xFF');
118 }
119
120 #[test]
suffixes()121 fn suffixes() {
122 check!(b'a', r##"b'a'peter"##, "peter");
123 check!(b'#', r##"b'#'peter"##, "peter");
124 check!(b'\n', r##"b'\n'peter"##, "peter");
125 check!(b'\'', r##"b'\''peter"##, "peter");
126 check!(b'\"', r##"b'\"'peter"##, "peter");
127 check!(b'\xFF', r##"b'\xFF'peter"##, "peter");
128 }
129
130 #[test]
invald_escapes()131 fn invald_escapes() {
132 assert_err!(ByteLit, r"b'\a'", UnknownEscape, 2..4);
133 assert_err!(ByteLit, r"b'\y'", UnknownEscape, 2..4);
134 assert_err!(ByteLit, r"b'\", UnterminatedEscape, 2..3);
135 assert_err!(ByteLit, r"b'\x'", UnterminatedEscape, 2..5);
136 assert_err!(ByteLit, r"b'\x1'", InvalidXEscape, 2..6);
137 assert_err!(ByteLit, r"b'\xaj'", InvalidXEscape, 2..6);
138 assert_err!(ByteLit, r"b'\xjb'", InvalidXEscape, 2..6);
139 }
140
141 #[test]
unicode_escape_not_allowed()142 fn unicode_escape_not_allowed() {
143 assert_err!(ByteLit, r"b'\u{0}'", UnicodeEscapeInByteLiteral, 2..4);
144 assert_err!(ByteLit, r"b'\u{00}'", UnicodeEscapeInByteLiteral, 2..4);
145 assert_err!(ByteLit, r"b'\u{b}'", UnicodeEscapeInByteLiteral, 2..4);
146 assert_err!(ByteLit, r"b'\u{B}'", UnicodeEscapeInByteLiteral, 2..4);
147 assert_err!(ByteLit, r"b'\u{7e}'", UnicodeEscapeInByteLiteral, 2..4);
148 assert_err!(ByteLit, r"b'\u{E4}'", UnicodeEscapeInByteLiteral, 2..4);
149 assert_err!(ByteLit, r"b'\u{e4}'", UnicodeEscapeInByteLiteral, 2..4);
150 assert_err!(ByteLit, r"b'\u{fc}'", UnicodeEscapeInByteLiteral, 2..4);
151 assert_err!(ByteLit, r"b'\u{Fc}'", UnicodeEscapeInByteLiteral, 2..4);
152 assert_err!(ByteLit, r"b'\u{fC}'", UnicodeEscapeInByteLiteral, 2..4);
153 assert_err!(ByteLit, r"b'\u{FC}'", UnicodeEscapeInByteLiteral, 2..4);
154 assert_err!(ByteLit, r"b'\u{b10}'", UnicodeEscapeInByteLiteral, 2..4);
155 assert_err!(ByteLit, r"b'\u{B10}'", UnicodeEscapeInByteLiteral, 2..4);
156 assert_err!(ByteLit, r"b'\u{0b10}'", UnicodeEscapeInByteLiteral, 2..4);
157 assert_err!(ByteLit, r"b'\u{2764}'", UnicodeEscapeInByteLiteral, 2..4);
158 assert_err!(ByteLit, r"b'\u{1f602}'", UnicodeEscapeInByteLiteral, 2..4);
159 assert_err!(ByteLit, r"b'\u{1F602}'", UnicodeEscapeInByteLiteral, 2..4);
160 }
161
162 #[test]
parse_err()163 fn parse_err() {
164 assert_err!(ByteLit, r"b''", EmptyByteLiteral, None);
165 assert_err!(ByteLit, r"b' ''", UnexpectedChar, 4..5);
166
167 assert_err!(ByteLit, r"b'", UnterminatedByteLiteral, None);
168 assert_err!(ByteLit, r"b'a", UnterminatedByteLiteral, None);
169 assert_err!(ByteLit, r"b'\n", UnterminatedByteLiteral, None);
170 assert_err!(ByteLit, r"b'\x35", UnterminatedByteLiteral, None);
171
172 assert_err!(ByteLit, r"b'ab'", OverlongByteLiteral, None);
173 assert_err!(ByteLit, r"b'a _'", OverlongByteLiteral, None);
174 assert_err!(ByteLit, r"b'\n3'", OverlongByteLiteral, None);
175
176 assert_err!(ByteLit, r"", Empty, None);
177
178 assert_err!(ByteLit, r"b'''", UnescapedSingleQuote, 2);
179 assert_err!(ByteLit, r"b''''", UnescapedSingleQuote, 2);
180
181 assert_err!(ByteLit, "b'\n'", UnescapedSpecialWhitespace, 2);
182 assert_err!(ByteLit, "b'\t'", UnescapedSpecialWhitespace, 2);
183 assert_err!(ByteLit, "b'\r'", UnescapedSpecialWhitespace, 2);
184
185 assert_err!(ByteLit, "b'న'", NonAsciiInByteLiteral, 2);
186 assert_err!(ByteLit, "b'犬'", NonAsciiInByteLiteral, 2);
187 assert_err!(ByteLit, "b''", NonAsciiInByteLiteral, 2);
188 }
189