• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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