]> mj.ucw.cz Git - libucw.git/blob - ucw-json/json-test.t
Build: Silenced few -Wimplicit-fallthrough warnings.
[libucw.git] / ucw-json / json-test.t
1 # Tests for the JSON library
2 # (c) 2015 Martin Mares <mj@ucw.cz>
3
4 ### Literals ###
5
6 Name:   Null
7 Run:    ../obj/ucw-json/json-test -rw
8 In:     null
9 Out:    null
10
11 Name:   True
12 In:     true
13 Out:    true
14
15 Name:   False
16 In:     false
17 Out:    false
18
19 Name:   Invalid literal 1
20 In:     lomikel
21 Exit:   1
22 Err:    ERROR: Invalid literal name at line 1:8
23
24 Name:   Invalid literal 2
25 In:     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
26 Exit:   1
27 Err:    ERROR: Invalid literal name at line 1:101
28
29 ### Numbers ###
30
31 Name:   Plain number
32 In:     42
33 Out:    42
34
35 Name:   Negative number
36 In:     -42
37 Out:    -42
38
39 Name:   Zero number
40 In:     0
41 Out:    0
42
43 # The largest number guaranteed to be precise by RFC 7159
44 Name:   Large number
45 In:     9007199254740991
46 Out:    9007199254740991
47
48 Name:   Fractional number 1
49 In:     12345.54321
50 Out:    12345.54321
51
52 Name:   Fractional number 2
53 In:     0.333333333
54 Out:    0.333333333
55
56 Name:   Number in scientific notation 1
57 In:     3.14159e20
58 Out:    3.14159e+20
59
60 Name:   Number in scientific notation 2
61 In:     3.14159e+20
62 Out:    3.14159e+20
63
64 Name:   Number in scientific notation 3
65 In:     3.14159e-20
66 Out:    3.14159e-20
67
68 Name:   No leading zero allowed
69 In:     01234
70 Exit:   1
71 Err:    ERROR: Malformed number: leading zero at line 1:2
72
73 Name:   Bare sign is not a number
74 In:     -
75 Exit:   1
76 Err:    ERROR: Malformed number: just minus at line 1:2
77
78 Name:   No leading decimal point allowed
79 In:     .1234
80 Exit:   1
81 Err:    ERROR: Numbers must start with a digit at line 1:1
82
83 Name:   Digits after decimal point required
84 In:     1234.
85 Exit:   1
86 Err:    ERROR: Malformed number: no digits after decimal point at line 1:6
87
88 Name:   Exponent part must be non-empty 1
89 In:     1e
90 Exit:   1
91 Err:    ERROR: Malformed number: empty exponent at line 1:3
92
93 Name:   Exponent part must be non-empty 2
94 In:     1e+
95 Exit:   1
96 Err:    ERROR: Malformed number: empty exponent at line 1:4
97
98 Name:   Number out of range
99 In:     1e3000000
100 Exit:   1:
101 Err:    ERROR: Number out of range at line 1:10
102
103 ### Strings ###
104
105 Name:   Plain string
106 In:     "foo"
107 Out:    "foo"
108
109 Name:   Empty string
110 In:     ""
111 Out:    ""
112
113 Name:   UTF-8 string
114 In:     "šelmička"
115 Out:    "šelmička"
116
117 Name:   Unterminated string
118 In:     "infinity
119 Exit:   1
120 Err:    ERROR: Unterminated string at line 1:10
121
122 Name:   Multi-line string
123 In:     "infi
124         nity"
125 Exit:   1
126 Err:    ERROR: Unterminated string at line 1:6
127
128 # Some characters are written as \uXXXX on output, which is correct
129 Name:   Escaped characters
130 In:     "\"\\\/\b\f\n\r\t"
131 Out:    "\"\\/\u0008\u000c\n\r\t"
132
133 Name:   Improper escaped characters
134 In:     "\a"
135 Exit:   1
136 Err:    ERROR: Invalid backslash sequence in string at line 1:3
137
138 Name:   Unicode escapes
139 In:     "\u0041\u010d\u010D\u0001"
140 Out:    "Ačč\u0001"
141
142 Name:   Improper Unicode escapes 1
143 In:     "\u"
144 Exit:   1
145 Err:    ERROR: Invalid Unicode escape sequence at line 1:4
146
147 Name:   Improper Unicode escapes 2
148 In:     "\u
149 Exit:   1
150 Err:    ERROR: Invalid Unicode escape sequence at line 1:4
151
152 Name:   Improper Unicode escapes 3
153 In:     "\uABCZ"
154 Exit:   1
155 Err:    ERROR: Invalid Unicode escape sequence at line 1:7
156
157 ### Unicode magic ###
158
159 # TAB is forbidden
160 Name:   Control characters 1
161 Run:    ../obj/ucw-json/json-test -RW
162 In:     "<09>"
163 Exit:   1
164 Err:    ERROR: Invalid control character in string at line 1:2
165
166 # Surprisingly, DEL is not
167 Name:   Control characters 2
168 In:     "<7f>"
169 Out:    "<7f>"<0a>
170
171 # U+31234
172 Name:   UTF-8 outside BMP
173 In:     "<f0><b1><88><b4>"
174 Out:    "<f0><b1><88><b4>"<0a>
175
176 Name:   Private use characters in BMP
177 In:     "<ef><80><80>"
178 Exit:   1
179 Err:    ERROR: Invalid private-use character in string at line 1:2
180
181 Name:   UTF-8 outside BMP
182 In:     "<f0><b1><88><b4>"
183 Out:    "<f0><b1><88><b4>"<0a>
184
185 Name:   Private use characters outside BMP
186 In:     "<f3><b0><80><80>"
187 Exit:   1
188 Err:    ERROR: Invalid private-use character in string at line 1:2
189
190 # U+FF0000
191 Name:   UTF-8 outside UCS
192 In:     "<f8><bf><b0><80><80>"
193 Exit:   1
194 Err:    ERROR: Invalid non-Unicode character in string at line 1:2
195
196 # U+D800
197 Name:   UTF-8 surrogate 1
198 In:     "<ed><a0><80>"
199 Exit:   1
200 Err:    ERROR: Invalid surrogate character in string at line 1:2
201
202 # U+DC00
203 Name:   UTF-8 surrogate 2
204 In:     "<ed><b0><80>"
205 Exit:   1
206 Err:    ERROR: Invalid surrogate character in string at line 1:2
207
208 # Denormalized U+07FF
209 Name:   UTF-8 denormalized
210 In:     "<c1><bf>"
211 Exit:   1
212 Err:    ERROR: Malformed UTF-8 character at line 1:1
213
214 # U+FEFF
215 Name:   UTF-8 BOM
216 In:     <ef><bb><bf>
217 Exit:   1
218 Err:    ERROR: Misplaced byte-order mark, complain in Redmond at line 1:1
219
220 Name:   Escaped NUL
221 In:     "\u0000"
222 Exit:   1
223 Err:    ERROR: Zero bytes in strings are not supported at line 1:7
224
225 Name:   Escaped surrogate
226 In:     "\udaff\udcba"
227 Out:    "<f3><8f><b2><ba>"<0a>
228
229 Name:   Escaped surrogate malformation 1
230 In:     "\udaff"
231 Exit:   1
232 Err:    ERROR: Escaped high surrogate codepoint must be followed by a low surrogate codepoint at line 1:8
233
234 Name:   Escaped surrogate malformation 2
235 In:     "\udcff"
236 Exit:   1
237 Err:    ERROR: Invalid escaped surrogate codepoint at line 1:7
238
239 Name:   Escaped low private-use character
240 In:     "\uedac"
241 Exit:   1
242 Err:    ERROR: Invalid escaped private-use character at line 1:7
243
244 Name:   Escaped high private-use character
245 In:     "\udbff\udc00"
246 Exit:   1
247 Err:    ERROR: Invalid escaped private-use character at line 1:13
248
249 # Switch back to normal mode
250 Name:   Invalid ASCII character
251 Run:    ../obj/ucw-json/json-test -rw
252 In:     @
253 Exit:   1
254 Err:    ERROR: Invalid character at line 1:1
255
256 ### Arrays ###
257
258 Name:   Empty array
259 In:     []
260 Out:    []
261
262 Name:   One-element array
263 In:     [1]
264 Out:    [ 1 ]
265
266 Name:   Two-element array
267 In:     [1,2]
268 Out:    [ 1, 2 ]
269
270 Name:   Nested arrays
271 In:     [[1,2],["a","b"]]
272 Out:    [ [ 1, 2 ], [ "a", "b" ] ]
273
274 Name:   Multi-line array
275 In:     [
276         "a",    null,false
277         ,false
278         ]
279 Out:    [ "a", null, false, false ]
280
281 Name:   Unterminated array 1
282 In:     [1,2
283 Exit:   1
284 Err:    ERROR: Comma or right bracket expected at line 2:0
285
286 Name:   Unterminated array 2
287 In:     [1,2,
288 Exit:   1
289 Err:    ERROR: Unterminated array at line 2:0
290
291 Name:   Extra comma not allowed
292 In:     [1,2,]
293 Exit:   1
294 Err:    ERROR: Misplaced end of array at line 1:6
295
296 Name:   Solitary comma not allowed
297 In:     ,
298 Exit:   1
299 Err:    ERROR: Misplaced comma at line 1:1
300
301 Name:   Deeply nested array
302 In:     [[[[[[[[[[]]]]]]]]]]
303 Out:    [ [ [ [ [ [ [ [ [ [] ] ] ] ] ] ] ] ] ]
304
305 Name:   Deeply unclosed array
306 In:     [[[[[[[[[[]
307 Exit:   1
308 Err:    ERROR: Comma or right bracket expected at line 2:0
309
310 Name:   Missing comma
311 In:     [1 2]
312 Exit:   1
313 Err:    ERROR: Comma or right bracket expected at line 1:5
314
315 ### Objects ###
316
317 Name:   Empty object
318 In:     {}
319 Out:    {}
320
321 Name:   One-entry object
322 In:     {"a":"b"}
323 Out:    { "a": "b" }
324
325 Name:   Two-entry object
326 In:     {"a":1,"b":2}
327 Out:    { "a": 1, "b": 2 }
328
329 Name:   Nested objects
330 In:     {
331                 "a": [1,2],
332                 "b": { "x": true, "y": false }
333         }
334 Out:    { "a": [ 1, 2 ], "b": { "x": true, "y": false } }
335
336 Name:   Unterminated object 1
337 In:     {
338 Exit:   1
339 Err:    ERROR: Unterminated object at line 2:0
340
341 Name:   Unterminated object 2
342 In:     { "a"
343 Exit:   1
344 Err:    ERROR: Colon expected at line 2:0
345
346 Name:   Unterminated object 3
347 In:     { "a":
348 Exit:   1
349 Err:    ERROR: Unterminated object at line 2:0
350
351 Name:   Unterminated object 4
352 In:     { "a":1,
353 Exit:   1
354 Err:    ERROR: Unterminated object at line 2:0
355
356 Name:   Extra comma not allowed in objects
357 In:     { "a":1, }
358 Exit:   1
359 Err:    ERROR: Misplaced end of object at line 1:10
360
361 Name:   Non-string key
362 In:     {1:2}
363 Exit:   1
364 Err:    ERROR: Object key must be a string at line 1:3
365
366 Name:   Repeated key
367 In:     {"a":1, "a":2}
368 Exit:   1
369 Err:    ERROR: Key already set at line 1:14
370
371 Name:   Missing object comma
372 In:     {"a":1 "b":2}
373 Exit:   1
374 Err:    ERROR: Comma expected at line 1:10
375
376 ### Top-level problems ###
377
378 Name:   Empty input
379 Exit:   1
380 Err:    ERROR: Empty input at line 1:0
381
382 Name:   Multiple values
383 In:     1 2
384 Exit:   1
385 Err:    ERROR: Only one top-level value allowed at line 1:4
386
387 ### Streaming interface ###
388
389 Name:   Streaming
390 Run:    ../obj/ucw-json/json-test -s
391 In:     123 [true, false] "Rincewind"
392 Out:    123
393         [ true, false ]
394         "Rincewind"