v
Зеркало из https://github.com/vlang/v
1module json2
2
3fn test_str() {
4mut sc := Scanner{
5text: '"test"'.bytes()
6}
7tok := sc.scan()
8assert tok.kind == .str_
9assert tok.lit.len == 4
10assert tok.lit.bytestr() == 'test'
11}
12
13fn test_str_valid_unicode_escape() {
14mut sc := Scanner{
15text: r'"\u0048"'.bytes()
16}
17tok := sc.scan()
18assert tok.kind == .str_
19assert tok.lit.len == 1
20assert tok.lit.bytestr() == 'H'
21}
22
23fn test_str_valid_unicode_escape_2() {
24mut sc := Scanner{
25text: r'"\u2714"'.bytes()
26}
27tok := sc.scan()
28assert tok.kind == .str_
29assert tok.lit.len == 3
30assert tok.lit.bytestr() == '✔'
31}
32
33fn test_str_invalid_escape() {
34mut sc := Scanner{
35text: r'"\z"'.bytes()
36}
37tok := sc.scan()
38assert tok.kind == .error
39assert tok.lit.bytestr() == 'invalid backslash escape'
40}
41
42fn test_str_invalid_must_be_escape() {
43for ch in important_escapable_chars {
44mut sc := Scanner{
45text: [u8(`"`), `t`, ch, `"`]
46}
47tok := sc.scan()
48assert tok.kind == .error
49assert tok.lit.bytestr() == 'character must be escaped with a backslash'
50}
51}
52
53fn test_str_invalid_unicode_escape() {
54mut sc := Scanner{
55text: r'"\u010G"'.bytes()
56}
57tok := sc.scan()
58assert tok.kind == .error
59assert tok.lit.bytestr() == '`G` is not a hex digit'
60}
61
62fn test_str_invalid_unicode_escape_len() {
63mut sc := Scanner{
64text: r'"\u001"'.bytes()
65}
66tok := sc.scan()
67assert tok.kind == .error
68assert tok.lit.bytestr() == 'unicode escape must have 4 hex digits'
69}
70
71fn test_str_invalid_uppercase_u() {
72mut sc := Scanner{
73text: r'"\U0000"'.bytes()
74}
75tok := sc.scan()
76assert tok.kind == .error
77assert tok.lit.bytestr() == 'unicode endpoints must be in lowercase `u`'
78}
79
80fn test_str_missing_closing_bracket() {
81mut sc := Scanner{
82text: '"incomplete'.bytes()
83}
84tok := sc.scan()
85assert tok.kind == .error
86assert tok.lit.bytestr() == 'missing double quotes in string closing'
87}
88
89fn test_int() {
90mut sc := Scanner{
91text: '10'.bytes()
92}
93tok := sc.scan()
94assert tok.kind == .int_
95assert tok.lit.len == 2
96assert tok.lit.bytestr() == '10'
97}
98
99fn test_int_negative() {
100mut sc := Scanner{
101text: '-10'.bytes()
102}
103tok := sc.scan()
104assert tok.kind == .int_
105assert tok.lit.len == 3
106assert tok.lit.bytestr() == '-10'
107}
108
109fn test_float() {
110mut sc := Scanner{
111text: '123.400'.bytes()
112}
113tok := sc.scan()
114assert tok.kind == .float
115assert tok.lit.len == 7
116assert tok.lit.bytestr() == '123.400'
117}
118
119fn test_float_negative() {
120mut sc := Scanner{
121text: '-123.400'.bytes()
122}
123tok := sc.scan()
124assert tok.kind == .float
125assert tok.lit.len == 8
126assert tok.lit.bytestr() == '-123.400'
127}
128
129fn test_int_exp() {
130mut sc := Scanner{
131text: '1E22'.bytes()
132}
133tok := sc.scan()
134assert tok.kind == .int_
135assert tok.lit.len == 4
136assert tok.lit.bytestr() == '1E22'
137}
138
139fn test_int_exp_negative() {
140mut sc := Scanner{
141text: '1E-2'.bytes()
142}
143tok := sc.scan()
144assert tok.kind == .int_
145assert tok.lit.len == 4
146assert tok.lit.bytestr() == '1E-2'
147}
148
149fn test_int_exp_positive() {
150mut sc := Scanner{
151text: '1E+2'.bytes()
152}
153tok := sc.scan()
154assert tok.kind == .int_
155assert tok.lit.len == 4
156assert tok.lit.bytestr() == '1E+2'
157}
158
159fn test_float_exp() {
160mut sc := Scanner{
161text: '123.456e78'.bytes()
162}
163tok := sc.scan()
164assert tok.kind == .float
165assert tok.lit.len == 10
166assert tok.lit.bytestr() == '123.456e78'
167}
168
169fn test_float_exp_negative() {
170mut sc := Scanner{
171text: '20.56e-5'.bytes()
172}
173tok := sc.scan()
174assert tok.kind == .float
175assert tok.lit.len == 8
176assert tok.lit.bytestr() == '20.56e-5'
177}
178
179fn test_float_exp_positive() {
180mut sc := Scanner{
181text: '20.56e+5'.bytes()
182}
183tok := sc.scan()
184assert tok.kind == .float
185assert tok.lit.len == 8
186assert tok.lit.bytestr() == '20.56e+5'
187}
188
189fn test_number_with_space() {
190mut sc := Scanner{
191text: ' 4'.bytes()
192}
193tok := sc.scan()
194assert tok.kind == .int_
195assert tok.lit.len == 1
196assert tok.lit.bytestr() == '4'
197}
198
199fn test_number_invalid_leading_zero() {
200mut sc := Scanner{
201text: '0010'.bytes()
202}
203tok := sc.scan()
204assert tok.kind == .error
205assert tok.lit.bytestr() == 'leading zeroes in a number are not allowed'
206}
207
208fn test_number_invalid_leading_zero_negative() {
209mut sc := Scanner{
210text: '-0010'.bytes()
211}
212tok := sc.scan()
213assert tok.kind == .error
214assert tok.lit.bytestr() == 'leading zeroes in a number are not allowed'
215}
216
217fn test_number_invalid_start_char() {
218mut sc := Scanner{
219text: '+1'.bytes()
220}
221tok := sc.scan()
222assert tok.kind == .error
223assert tok.lit.bytestr() == 'invalid token `+`'
224}
225
226fn test_number_invalid_char() {
227mut sc := Scanner{
228text: '122x'.bytes()
229}
230sc.scan()
231tok := sc.scan()
232assert tok.kind == .error
233assert tok.lit.bytestr() == 'invalid token `x`'
234}
235
236fn test_number_invalid_char_float() {
237mut sc := Scanner{
238text: '122x.1'.bytes()
239}
240sc.scan()
241tok := sc.scan()
242assert tok.kind == .error
243assert tok.lit.bytestr() == 'invalid token `x`'
244}
245
246fn test_number_invalid_multiple_dot() {
247mut sc := Scanner{
248text: '122.108.10'.bytes()
249}
250sc.scan()
251tok := sc.scan()
252assert tok.kind == .error
253assert tok.lit.bytestr() == 'invalid token `.`'
254}
255
256fn test_number_invalid_exp() {
257mut sc := Scanner{
258text: '0.3e'.bytes()
259}
260tok := sc.scan()
261assert tok.kind == .error
262assert tok.lit.bytestr() == 'invalid exponent'
263}
264
265fn test_number_invalid_exp_with_sign() {
266mut sc := Scanner{
267text: '0.3e+'.bytes()
268}
269tok := sc.scan()
270assert tok.kind == .error
271assert tok.lit.bytestr() == 'invalid exponent'
272}
273
274fn test_number_invalid_zero_exp() {
275mut sc := Scanner{
276text: '0e'.bytes()
277}
278tok := sc.scan()
279assert tok.kind == .error
280assert tok.lit.bytestr() == 'invalid exponent'
281}
282
283fn test_number_invalid_dot_exp() {
284mut sc := Scanner{
285text: '0.e'.bytes()
286}
287tok := sc.scan()
288assert tok.kind == .error
289assert tok.lit.bytestr() == 'invalid float'
290}
291
292fn test_number_invalid_double_exp() {
293mut sc := Scanner{
294text: '2eE'.bytes()
295}
296sc.scan()
297tok := sc.scan()
298assert tok.kind == .error
299assert tok.lit.bytestr() == 'invalid token `E`'
300}
301
302fn test_null() {
303mut sc := Scanner{
304text: 'null'.bytes()
305}
306tok := sc.scan()
307assert tok.kind == .null
308assert tok.lit.len == 4
309assert tok.lit.bytestr() == 'null'
310}
311
312fn test_bool_true() {
313mut sc := Scanner{
314text: 'true'.bytes()
315}
316tok := sc.scan()
317assert tok.kind == .bool_
318assert tok.lit.len == 4
319assert tok.lit.bytestr() == 'true'
320}
321
322fn test_bool_false() {
323mut sc := Scanner{
324text: 'false'.bytes()
325}
326tok := sc.scan()
327assert tok.kind == .bool_
328assert tok.lit.len == 5
329assert tok.lit.bytestr() == 'false'
330}
331
332fn test_json_with_whitespace_start() {
333mut sc := Scanner{
334text: ' \n \n\t {'.bytes()
335}
336tok := sc.scan()
337eprintln(tok)
338assert tok.kind == .lcbr
339assert tok.lit.len == 0
340}
341
342fn test_json_with_whitespace_end() {
343mut sc := Scanner{
344text: '} \n\t'.bytes()
345}
346tok := sc.scan()
347assert tok.kind == .rcbr
348tok2 := sc.scan()
349eprintln(tok2)
350assert tok2.kind == .eof
351}
352