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) => {
7 let input = stringify!($lit);
8 let expected = ByteLit {
9 raw: input,
10 value: $lit,
11 };
12
13 assert_parse_ok_eq(input, ByteLit::parse(input), expected.clone(), "ByteLit::parse");
14 assert_parse_ok_eq(input, Literal::parse(input), Literal::Byte(expected), "Literal::parse");
15 assert_eq!(ByteLit::parse(input).unwrap().value(), $lit);
16 assert_roundtrip(expected.to_owned(), input);
17 };
18 }
19
20
21 // ===== Actual tests ============================================================================
22
23 #[test]
alphanumeric()24 fn alphanumeric() {
25 check!(b'a');
26 check!(b'b');
27 check!(b'y');
28 check!(b'z');
29 check!(b'A');
30 check!(b'B');
31 check!(b'Y');
32 check!(b'Z');
33
34 check!(b'0');
35 check!(b'1');
36 check!(b'8');
37 check!(b'9');
38 }
39
40 #[test]
special_chars()41 fn special_chars() {
42 check!(b' ');
43 check!(b'!');
44 check!(b'"');
45 check!(b'#');
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 }
74
75 #[test]
quote_escapes()76 fn quote_escapes() {
77 check!(b'\'');
78 check!(b'\"');
79 }
80
81 #[test]
ascii_escapes()82 fn ascii_escapes() {
83 check!(b'\n');
84 check!(b'\r');
85 check!(b'\t');
86 check!(b'\\');
87 check!(b'\0');
88
89 check!(b'\x00');
90 check!(b'\x01');
91 check!(b'\x0c');
92 check!(b'\x0D');
93 check!(b'\x13');
94 check!(b'\x30');
95 check!(b'\x30');
96 check!(b'\x4B');
97 check!(b'\x6b');
98 check!(b'\x7F');
99 check!(b'\x7f');
100 }
101
102 #[test]
byte_escapes()103 fn byte_escapes() {
104 check!(b'\x80');
105 check!(b'\x8a');
106 check!(b'\x8C');
107 check!(b'\x99');
108 check!(b'\xa0');
109 check!(b'\xAd');
110 check!(b'\xfe');
111 check!(b'\xFe');
112 check!(b'\xfF');
113 check!(b'\xFF');
114 }
115
116 #[test]
invald_escapes()117 fn invald_escapes() {
118 assert_err!(ByteLit, r"b'\a'", UnknownEscape, 2..4);
119 assert_err!(ByteLit, r"b'\y'", UnknownEscape, 2..4);
120 assert_err!(ByteLit, r"b'\", UnterminatedByteLiteral, None);
121 assert_err!(ByteLit, r"b'\x'", UnterminatedEscape, 2..4);
122 assert_err!(ByteLit, r"b'\x1'", UnterminatedEscape, 2..5);
123 assert_err!(ByteLit, r"b'\xaj'", InvalidXEscape, 2..6);
124 assert_err!(ByteLit, r"b'\xjb'", InvalidXEscape, 2..6);
125 }
126
127 #[test]
unicode_escape_not_allowed()128 fn unicode_escape_not_allowed() {
129 assert_err!(ByteLit, r"b'\u{0}'", UnicodeEscapeInByteLiteral, 2..4);
130 assert_err!(ByteLit, r"b'\u{00}'", UnicodeEscapeInByteLiteral, 2..4);
131 assert_err!(ByteLit, r"b'\u{b}'", UnicodeEscapeInByteLiteral, 2..4);
132 assert_err!(ByteLit, r"b'\u{B}'", UnicodeEscapeInByteLiteral, 2..4);
133 assert_err!(ByteLit, r"b'\u{7e}'", UnicodeEscapeInByteLiteral, 2..4);
134 assert_err!(ByteLit, r"b'\u{E4}'", UnicodeEscapeInByteLiteral, 2..4);
135 assert_err!(ByteLit, r"b'\u{e4}'", UnicodeEscapeInByteLiteral, 2..4);
136 assert_err!(ByteLit, r"b'\u{fc}'", UnicodeEscapeInByteLiteral, 2..4);
137 assert_err!(ByteLit, r"b'\u{Fc}'", UnicodeEscapeInByteLiteral, 2..4);
138 assert_err!(ByteLit, r"b'\u{fC}'", UnicodeEscapeInByteLiteral, 2..4);
139 assert_err!(ByteLit, r"b'\u{FC}'", UnicodeEscapeInByteLiteral, 2..4);
140 assert_err!(ByteLit, r"b'\u{b10}'", UnicodeEscapeInByteLiteral, 2..4);
141 assert_err!(ByteLit, r"b'\u{B10}'", UnicodeEscapeInByteLiteral, 2..4);
142 assert_err!(ByteLit, r"b'\u{0b10}'", UnicodeEscapeInByteLiteral, 2..4);
143 assert_err!(ByteLit, r"b'\u{2764}'", UnicodeEscapeInByteLiteral, 2..4);
144 assert_err!(ByteLit, r"b'\u{1f602}'", UnicodeEscapeInByteLiteral, 2..4);
145 assert_err!(ByteLit, r"b'\u{1F602}'", UnicodeEscapeInByteLiteral, 2..4);
146 }
147
148 #[test]
parse_err()149 fn parse_err() {
150 assert_err!(ByteLit, r"b''", EmptyByteLiteral, None);
151 assert_err!(ByteLit, r"b' ''", OverlongByteLiteral, 3..4);
152
153 assert_err!(ByteLit, r"b'", UnterminatedByteLiteral, None);
154 assert_err!(ByteLit, r"b'a", UnterminatedByteLiteral, None);
155 assert_err!(ByteLit, r"b'\n", UnterminatedByteLiteral, None);
156 assert_err!(ByteLit, r"b'\x35", UnterminatedByteLiteral, None);
157
158 assert_err!(ByteLit, r"b'ab'", OverlongByteLiteral, 3..4);
159 assert_err!(ByteLit, r"b'a _'", OverlongByteLiteral, 3..5);
160 assert_err!(ByteLit, r"b'\n3'", OverlongByteLiteral, 4..5);
161
162 assert_err!(ByteLit, r"", Empty, None);
163
164 assert_err!(ByteLit, r"b'''", UnescapedSingleQuote, 2);
165 assert_err!(ByteLit, r"b''''", UnescapedSingleQuote, 2);
166
167 assert_err!(ByteLit, "b'\n'", UnescapedSpecialWhitespace, 2);
168 assert_err!(ByteLit, "b'\t'", UnescapedSpecialWhitespace, 2);
169 assert_err!(ByteLit, "b'\r'", UnescapedSpecialWhitespace, 2);
170
171 assert_err!(ByteLit, "b'న'", NonAsciiInByteLiteral, 2);
172 assert_err!(ByteLit, "b'犬'", NonAsciiInByteLiteral, 2);
173 assert_err!(ByteLit, "b'��'", NonAsciiInByteLiteral, 2);
174 }
175