• 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) => {
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