1 | [{
|
2 | "comment": "Dot syntax",
|
3 | "given": {"type": "object"},
|
4 | "cases": [
|
5 | {
|
6 | "expression": "foo.bar",
|
7 | "result": null
|
8 | },
|
9 | {
|
10 | "expression": "foo.1",
|
11 | "error": "syntax"
|
12 | },
|
13 | {
|
14 | "expression": "foo.-11",
|
15 | "error": "syntax"
|
16 | },
|
17 | {
|
18 | "expression": "foo",
|
19 | "result": null
|
20 | },
|
21 | {
|
22 | "expression": "foo.",
|
23 | "error": "syntax"
|
24 | },
|
25 | {
|
26 | "expression": "foo.",
|
27 | "error": "syntax"
|
28 | },
|
29 | {
|
30 | "expression": ".foo",
|
31 | "error": "syntax"
|
32 | },
|
33 | {
|
34 | "expression": "foo..bar",
|
35 | "error": "syntax"
|
36 | },
|
37 | {
|
38 | "expression": "foo.bar.",
|
39 | "error": "syntax"
|
40 | },
|
41 | {
|
42 | "expression": "foo[.]",
|
43 | "error": "syntax"
|
44 | }
|
45 | ]
|
46 | },
|
47 | {
|
48 | "comment": "Simple token errors",
|
49 | "given": {"type": "object"},
|
50 | "cases": [
|
51 | {
|
52 | "expression": ".",
|
53 | "error": "syntax"
|
54 | },
|
55 | {
|
56 | "expression": ":",
|
57 | "error": "syntax"
|
58 | },
|
59 | {
|
60 | "expression": ",",
|
61 | "error": "syntax"
|
62 | },
|
63 | {
|
64 | "expression": "]",
|
65 | "error": "syntax"
|
66 | },
|
67 | {
|
68 | "expression": "[",
|
69 | "error": "syntax"
|
70 | },
|
71 | {
|
72 | "expression": "}",
|
73 | "error": "syntax"
|
74 | },
|
75 | {
|
76 | "expression": "{",
|
77 | "error": "syntax"
|
78 | },
|
79 | {
|
80 | "expression": ")",
|
81 | "error": "syntax"
|
82 | },
|
83 | {
|
84 | "expression": "(",
|
85 | "error": "syntax"
|
86 | },
|
87 | {
|
88 | "expression": "a[",
|
89 | "error": "syntax"
|
90 | },
|
91 | {
|
92 | "expression": "a]",
|
93 | "error": "syntax"
|
94 | },
|
95 | {
|
96 | "expression": "a][",
|
97 | "error": "syntax"
|
98 | }
|
99 | ]
|
100 | },
|
101 | {
|
102 | "comment": "Wildcard syntax",
|
103 | "given": {"type": "object"},
|
104 | "cases": [
|
105 | {
|
106 | "expression": "*",
|
107 | "result": ["object"]
|
108 | },
|
109 | {
|
110 | "expression": "*.*",
|
111 | "result": []
|
112 | },
|
113 | {
|
114 | "expression": "*.foo",
|
115 | "result": []
|
116 | },
|
117 | {
|
118 | "expression": "*[0]",
|
119 | "result": []
|
120 | },
|
121 | {
|
122 | "expression": ".*",
|
123 | "error": "syntax"
|
124 | },
|
125 | {
|
126 | "expression": "*foo",
|
127 | "error": "syntax"
|
128 | },
|
129 | {
|
130 | "expression": "*0",
|
131 | "error": "syntax"
|
132 | },
|
133 | {
|
134 | "expression": "foo[*]bar",
|
135 | "error": "syntax"
|
136 | },
|
137 | {
|
138 | "expression": "foo[*]*",
|
139 | "error": "syntax"
|
140 | }
|
141 | ]
|
142 | },
|
143 | {
|
144 | "comment": "Flatten syntax",
|
145 | "given": {"type": "object"},
|
146 | "cases": [
|
147 | {
|
148 | "expression": "[]",
|
149 | "result": null
|
150 | }
|
151 | ]
|
152 | },
|
153 | {
|
154 | "comment": "Simple bracket syntax",
|
155 | "given": {"type": "object"},
|
156 | "cases": [
|
157 | {
|
158 | "expression": "[0]",
|
159 | "result": null
|
160 | },
|
161 | {
|
162 | "expression": "[*]",
|
163 | "result": null
|
164 | },
|
165 | {
|
166 | "expression": "*.[0]",
|
167 | "error": "syntax"
|
168 | },
|
169 | {
|
170 | "expression": "*.[\"0\"]",
|
171 | "result": [[null]]
|
172 | },
|
173 | {
|
174 | "expression": "[*].bar",
|
175 | "result": null
|
176 | },
|
177 | {
|
178 | "expression": "[*][0]",
|
179 | "result": null
|
180 | },
|
181 | {
|
182 | "expression": "foo[#]",
|
183 | "error": "syntax"
|
184 | }
|
185 | ]
|
186 | },
|
187 | {
|
188 | "comment": "Multi-select list syntax",
|
189 | "given": {"type": "object"},
|
190 | "cases": [
|
191 | {
|
192 | "expression": "foo[0]",
|
193 | "result": null
|
194 | },
|
195 | {
|
196 | "comment": "Valid multi-select of a list",
|
197 | "expression": "foo[0, 1]",
|
198 | "error": "syntax"
|
199 | },
|
200 | {
|
201 | "expression": "foo.[0]",
|
202 | "error": "syntax"
|
203 | },
|
204 | {
|
205 | "expression": "foo.[*]",
|
206 | "result": null
|
207 | },
|
208 | {
|
209 | "comment": "Multi-select of a list with trailing comma",
|
210 | "expression": "foo[0, ]",
|
211 | "error": "syntax"
|
212 | },
|
213 | {
|
214 | "comment": "Multi-select of a list with trailing comma and no close",
|
215 | "expression": "foo[0,",
|
216 | "error": "syntax"
|
217 | },
|
218 | {
|
219 | "comment": "Multi-select of a list with trailing comma and no close",
|
220 | "expression": "foo.[a",
|
221 | "error": "syntax"
|
222 | },
|
223 | {
|
224 | "comment": "Multi-select of a list with extra comma",
|
225 | "expression": "foo[0,, 1]",
|
226 | "error": "syntax"
|
227 | },
|
228 | {
|
229 | "comment": "Multi-select of a list using an identifier index",
|
230 | "expression": "foo[abc]",
|
231 | "error": "syntax"
|
232 | },
|
233 | {
|
234 | "comment": "Multi-select of a list using identifier indices",
|
235 | "expression": "foo[abc, def]",
|
236 | "error": "syntax"
|
237 | },
|
238 | {
|
239 | "comment": "Multi-select of a list using an identifier index",
|
240 | "expression": "foo[abc, 1]",
|
241 | "error": "syntax"
|
242 | },
|
243 | {
|
244 | "comment": "Multi-select of a list using an identifier index with trailing comma",
|
245 | "expression": "foo[abc, ]",
|
246 | "error": "syntax"
|
247 | },
|
248 | {
|
249 | "comment": "Valid multi-select of a hash using an identifier index",
|
250 | "expression": "foo.[abc]",
|
251 | "result": null
|
252 | },
|
253 | {
|
254 | "comment": "Valid multi-select of a hash",
|
255 | "expression": "foo.[abc, def]",
|
256 | "result": null
|
257 | },
|
258 | {
|
259 | "comment": "Multi-select of a hash using a numeric index",
|
260 | "expression": "foo.[abc, 1]",
|
261 | "error": "syntax"
|
262 | },
|
263 | {
|
264 | "comment": "Multi-select of a hash with a trailing comma",
|
265 | "expression": "foo.[abc, ]",
|
266 | "error": "syntax"
|
267 | },
|
268 | {
|
269 | "comment": "Multi-select of a hash with extra commas",
|
270 | "expression": "foo.[abc,, def]",
|
271 | "error": "syntax"
|
272 | },
|
273 | {
|
274 | "comment": "Multi-select of a hash using number indices",
|
275 | "expression": "foo.[0, 1]",
|
276 | "error": "syntax"
|
277 | }
|
278 | ]
|
279 | },
|
280 | {
|
281 | "comment": "Multi-select hash syntax",
|
282 | "given": {"type": "object"},
|
283 | "cases": [
|
284 | {
|
285 | "comment": "No key or value",
|
286 | "expression": "a{}",
|
287 | "error": "syntax"
|
288 | },
|
289 | {
|
290 | "comment": "No closing token",
|
291 | "expression": "a{",
|
292 | "error": "syntax"
|
293 | },
|
294 | {
|
295 | "comment": "Not a key value pair",
|
296 | "expression": "a{foo}",
|
297 | "error": "syntax"
|
298 | },
|
299 | {
|
300 | "comment": "Missing value and closing character",
|
301 | "expression": "a{foo:",
|
302 | "error": "syntax"
|
303 | },
|
304 | {
|
305 | "comment": "Missing closing character",
|
306 | "expression": "a{foo: 0",
|
307 | "error": "syntax"
|
308 | },
|
309 | {
|
310 | "comment": "Missing value",
|
311 | "expression": "a{foo:}",
|
312 | "error": "syntax"
|
313 | },
|
314 | {
|
315 | "comment": "Trailing comma and no closing character",
|
316 | "expression": "a{foo: 0, ",
|
317 | "error": "syntax"
|
318 | },
|
319 | {
|
320 | "comment": "Missing value with trailing comma",
|
321 | "expression": "a{foo: ,}",
|
322 | "error": "syntax"
|
323 | },
|
324 | {
|
325 | "comment": "Accessing Array using an identifier",
|
326 | "expression": "a{foo: bar}",
|
327 | "error": "syntax"
|
328 | },
|
329 | {
|
330 | "expression": "a{foo: 0}",
|
331 | "error": "syntax"
|
332 | },
|
333 | {
|
334 | "comment": "Missing key-value pair",
|
335 | "expression": "a.{}",
|
336 | "error": "syntax"
|
337 | },
|
338 | {
|
339 | "comment": "Not a key-value pair",
|
340 | "expression": "a.{foo}",
|
341 | "error": "syntax"
|
342 | },
|
343 | {
|
344 | "comment": "Missing value",
|
345 | "expression": "a.{foo:}",
|
346 | "error": "syntax"
|
347 | },
|
348 | {
|
349 | "comment": "Missing value with trailing comma",
|
350 | "expression": "a.{foo: ,}",
|
351 | "error": "syntax"
|
352 | },
|
353 | {
|
354 | "comment": "Valid multi-select hash extraction",
|
355 | "expression": "a.{foo: bar}",
|
356 | "result": null
|
357 | },
|
358 | {
|
359 | "comment": "Valid multi-select hash extraction",
|
360 | "expression": "a.{foo: bar, baz: bam}",
|
361 | "result": null
|
362 | },
|
363 | {
|
364 | "comment": "Trailing comma",
|
365 | "expression": "a.{foo: bar, }",
|
366 | "error": "syntax"
|
367 | },
|
368 | {
|
369 | "comment": "Missing key in second key-value pair",
|
370 | "expression": "a.{foo: bar, baz}",
|
371 | "error": "syntax"
|
372 | },
|
373 | {
|
374 | "comment": "Missing value in second key-value pair",
|
375 | "expression": "a.{foo: bar, baz:}",
|
376 | "error": "syntax"
|
377 | },
|
378 | {
|
379 | "comment": "Trailing comma",
|
380 | "expression": "a.{foo: bar, baz: bam, }",
|
381 | "error": "syntax"
|
382 | },
|
383 | {
|
384 | "comment": "Nested multi select",
|
385 | "expression": "{\"\\\\\":{\" \":*}}",
|
386 | "result": {"\\": {" ": ["object"]}}
|
387 | }
|
388 | ]
|
389 | },
|
390 | {
|
391 | "comment": "Or expressions",
|
392 | "given": {"type": "object"},
|
393 | "cases": [
|
394 | {
|
395 | "expression": "foo || bar",
|
396 | "result": null
|
397 | },
|
398 | {
|
399 | "expression": "foo ||",
|
400 | "error": "syntax"
|
401 | },
|
402 | {
|
403 | "expression": "foo.|| bar",
|
404 | "error": "syntax"
|
405 | },
|
406 | {
|
407 | "expression": " || foo",
|
408 | "error": "syntax"
|
409 | },
|
410 | {
|
411 | "expression": "foo || || foo",
|
412 | "error": "syntax"
|
413 | },
|
414 | {
|
415 | "expression": "foo.[a || b]",
|
416 | "result": null
|
417 | },
|
418 | {
|
419 | "expression": "foo.[a ||]",
|
420 | "error": "syntax"
|
421 | },
|
422 | {
|
423 | "expression": "\"foo",
|
424 | "error": "syntax"
|
425 | }
|
426 | ]
|
427 | },
|
428 | {
|
429 | "comment": "Filter expressions",
|
430 | "given": {"type": "object"},
|
431 | "cases": [
|
432 | {
|
433 | "expression": "foo[?bar==`baz`]",
|
434 | "result": null
|
435 | },
|
436 | {
|
437 | "expression": "foo[? bar == `baz` ]",
|
438 | "result": null
|
439 | },
|
440 | {
|
441 | "expression": "foo[ ?bar==`baz`]",
|
442 | "error": "syntax"
|
443 | },
|
444 | {
|
445 | "expression": "foo[?bar==]",
|
446 | "error": "syntax"
|
447 | },
|
448 | {
|
449 | "expression": "foo[?==]",
|
450 | "error": "syntax"
|
451 | },
|
452 | {
|
453 | "expression": "foo[?==bar]",
|
454 | "error": "syntax"
|
455 | },
|
456 | {
|
457 | "expression": "foo[?bar==baz?]",
|
458 | "error": "syntax"
|
459 | },
|
460 | {
|
461 | "expression": "foo[?a.b.c==d.e.f]",
|
462 | "result": null
|
463 | },
|
464 | {
|
465 | "expression": "foo[?bar==`[0, 1, 2]`]",
|
466 | "result": null
|
467 | },
|
468 | {
|
469 | "expression": "foo[?bar==`[\"a\", \"b\", \"c\"]`]",
|
470 | "result": null
|
471 | },
|
472 | {
|
473 | "comment": "Literal char not escaped",
|
474 | "expression": "foo[?bar==`[\"foo`bar\"]`]",
|
475 | "error": "syntax"
|
476 | },
|
477 | {
|
478 | "comment": "Literal char escaped",
|
479 | "expression": "foo[?bar==`[\"foo\\`bar\"]`]",
|
480 | "result": null
|
481 | },
|
482 | {
|
483 | "comment": "Unknown comparator",
|
484 | "expression": "foo[?bar<>baz]",
|
485 | "error": "syntax"
|
486 | },
|
487 | {
|
488 | "comment": "Unknown comparator",
|
489 | "expression": "foo[?bar^baz]",
|
490 | "error": "syntax"
|
491 | },
|
492 | {
|
493 | "expression": "foo[bar==baz]",
|
494 | "error": "syntax"
|
495 | },
|
496 | {
|
497 | "comment": "Quoted identifier in filter expression no spaces",
|
498 | "expression": "[?\"\\\\\">`\"foo\"`]",
|
499 | "result": null
|
500 | },
|
501 | {
|
502 | "comment": "Quoted identifier in filter expression with spaces",
|
503 | "expression": "[?\"\\\\\" > `\"foo\"`]",
|
504 | "result": null
|
505 | }
|
506 | ]
|
507 | },
|
508 | {
|
509 | "comment": "Filter expression errors",
|
510 | "given": {"type": "object"},
|
511 | "cases": [
|
512 | {
|
513 | "expression": "bar.`anything`",
|
514 | "error": "syntax"
|
515 | },
|
516 | {
|
517 | "expression": "bar.`\"anything\"`",
|
518 | "error": "syntax"
|
519 | },
|
520 | {
|
521 | "expression": "bar.baz.noexists.`literal`",
|
522 | "error": "syntax"
|
523 | },
|
524 | {
|
525 | "comment": "Literal wildcard projection",
|
526 | "expression": "foo[*].`literal`",
|
527 | "error": "syntax"
|
528 | },
|
529 | {
|
530 | "expression": "foo[*].name.`literal`",
|
531 | "error": "syntax"
|
532 | },
|
533 | {
|
534 | "expression": "foo[].name.`literal`",
|
535 | "error": "syntax"
|
536 | },
|
537 | {
|
538 | "expression": "foo[].name.`literal`.`subliteral`",
|
539 | "error": "syntax"
|
540 | },
|
541 | {
|
542 | "comment": "Projecting a literal onto an empty list",
|
543 | "expression": "foo[*].name.noexist.`literal`",
|
544 | "error": "syntax"
|
545 | },
|
546 | {
|
547 | "expression": "foo[].name.noexist.`literal`",
|
548 | "error": "syntax"
|
549 | },
|
550 | {
|
551 | "expression": "twolen[*].`foo`",
|
552 | "error": "syntax"
|
553 | },
|
554 | {
|
555 | "comment": "Two level projection of a literal",
|
556 | "expression": "twolen[*].threelen[*].`bar`",
|
557 | "error": "syntax"
|
558 | },
|
559 | {
|
560 | "comment": "Two level flattened projection of a literal",
|
561 | "expression": "twolen[].threelen[].`bar`",
|
562 | "error": "syntax"
|
563 | }
|
564 | ]
|
565 | },
|
566 | {
|
567 | "comment": "Identifiers",
|
568 | "given": {"type": "object"},
|
569 | "cases": [
|
570 | {
|
571 | "expression": "foo",
|
572 | "result": null
|
573 | },
|
574 | {
|
575 | "expression": "\"foo\"",
|
576 | "result": null
|
577 | },
|
578 | {
|
579 | "expression": "\"\\\\\"",
|
580 | "result": null
|
581 | }
|
582 | ]
|
583 | },
|
584 | {
|
585 | "comment": "Literals",
|
586 | "given": {"type": "object"},
|
587 | "cases": [
|
588 | {
|
589 | "expression": "`foo`",
|
590 | "result": "foo"
|
591 | },
|
592 | {
|
593 | "comment": "Literal with leading whitespace",
|
594 | "expression": "` {\"foo\": true}`",
|
595 | "result": {"foo": true}
|
596 | },
|
597 | {
|
598 | "comment": "Literal with trailing whitespace",
|
599 | "expression": "`{\"foo\": true} `",
|
600 | "result": {"foo": true}
|
601 | },
|
602 | {
|
603 | "comment": "Literal on RHS of subexpr not allowed",
|
604 | "expression": "foo.`bar`",
|
605 | "error": "syntax"
|
606 | }
|
607 | ]
|
608 | },
|
609 | {
|
610 | "comment": "Combined syntax",
|
611 | "given": [],
|
612 | "cases": [
|
613 | {
|
614 | "expression": "*||*|*|*",
|
615 | "result": null
|
616 | },
|
617 | {
|
618 | "expression": "*[]||[*]",
|
619 | "result": []
|
620 | },
|
621 | {
|
622 | "expression": "[*.*]",
|
623 | "result": [null]
|
624 | }
|
625 | ]
|
626 | }
|
627 | ]
|