1[{
2 "given":
3 {
4 "foo": -1,
5 "zero": 0,
6 "numbers": [-1, 3, 4, 5],
7 "array": [-1, 3, 4, 5, "a", "100"],
8 "strings": ["a", "b", "c"],
9 "decimals": [1.01, 1.2, -1.5],
10 "str": "Str",
11 "false": false,
12 "empty_list": [],
13 "empty_hash": {},
14 "objects": {"foo": "bar", "bar": "baz"},
15 "null_key": null
16 },
17 "cases": [
18 {
19 "expression": "abs(foo)",
20 "result": 1
21 },
22 {
23 "expression": "abs(foo)",
24 "result": 1
25 },
26 {
27 "expression": "abs(str)",
28 "error": "invalid-type"
29 },
30 {
31 "expression": "abs(array[1])",
32 "result": 3
33 },
34 {
35 "expression": "abs(array[1])",
36 "result": 3
37 },
38 {
39 "expression": "abs(`false`)",
40 "error": "invalid-type"
41 },
42 {
43 "expression": "abs(`-24`)",
44 "result": 24
45 },
46 {
47 "expression": "abs(`-24`)",
48 "result": 24
49 },
50 {
51 "expression": "abs(`1`, `2`)",
52 "error": "invalid-arity"
53 },
54 {
55 "expression": "abs()",
56 "error": "invalid-arity"
57 },
58 {
59 "expression": "unknown_function(`1`, `2`)",
60 "error": "unknown-function"
61 },
62 {
63 "expression": "avg(numbers)",
64 "result": 2.75
65 },
66 {
67 "expression": "avg(array)",
68 "error": "invalid-type"
69 },
70 {
71 "expression": "avg('abc')",
72 "error": "invalid-type"
73 },
74 {
75 "expression": "avg(foo)",
76 "error": "invalid-type"
77 },
78 {
79 "expression": "avg(@)",
80 "error": "invalid-type"
81 },
82 {
83 "expression": "avg(strings)",
84 "error": "invalid-type"
85 },
86 {
87 "expression": "ceil(`1.2`)",
88 "result": 2
89 },
90 {
91 "expression": "ceil(decimals[0])",
92 "result": 2
93 },
94 {
95 "expression": "ceil(decimals[1])",
96 "result": 2
97 },
98 {
99 "expression": "ceil(decimals[2])",
100 "result": -1
101 },
102 {
103 "expression": "ceil('string')",
104 "error": "invalid-type"
105 },
106 {
107 "expression": "contains('abc', 'a')",
108 "result": true
109 },
110 {
111 "expression": "contains('abc', 'd')",
112 "result": false
113 },
114 {
115 "expression": "contains(`false`, 'd')",
116 "error": "invalid-type"
117 },
118 {
119 "expression": "contains(strings, 'a')",
120 "result": true
121 },
122 {
123 "expression": "contains(decimals, `1.2`)",
124 "result": true
125 },
126 {
127 "expression": "contains(decimals, `false`)",
128 "result": false
129 },
130 {
131 "expression": "ends_with(str, 'r')",
132 "result": true
133 },
134 {
135 "expression": "ends_with(str, 'tr')",
136 "result": true
137 },
138 {
139 "expression": "ends_with(str, 'Str')",
140 "result": true
141 },
142 {
143 "expression": "ends_with(str, 'SStr')",
144 "result": false
145 },
146 {
147 "expression": "ends_with(str, 'foo')",
148 "result": false
149 },
150 {
151 "expression": "ends_with(str, `0`)",
152 "error": "invalid-type"
153 },
154 {
155 "expression": "floor(`1.2`)",
156 "result": 1
157 },
158 {
159 "expression": "floor('string')",
160 "error": "invalid-type"
161 },
162 {
163 "expression": "floor(decimals[0])",
164 "result": 1
165 },
166 {
167 "expression": "floor(foo)",
168 "result": -1
169 },
170 {
171 "expression": "floor(str)",
172 "error": "invalid-type"
173 },
174 {
175 "expression": "length('abc')",
176 "result": 3
177 },
178 {
179 "expression": "length('✓foo')",
180 "result": 4
181 },
182 {
183 "expression": "length('')",
184 "result": 0
185 },
186 {
187 "expression": "length(@)",
188 "result": 12
189 },
190 {
191 "expression": "length(strings[0])",
192 "result": 1
193 },
194 {
195 "expression": "length(str)",
196 "result": 3
197 },
198 {
199 "expression": "length(array)",
200 "result": 6
201 },
202 {
203 "expression": "length(objects)",
204 "result": 2
205 },
206 {
207 "expression": "length(`false`)",
208 "error": "invalid-type"
209 },
210 {
211 "expression": "length(foo)",
212 "error": "invalid-type"
213 },
214 {
215 "expression": "length(strings[0])",
216 "result": 1
217 },
218 {
219 "expression": "max(numbers)",
220 "result": 5
221 },
222 {
223 "expression": "max(decimals)",
224 "result": 1.2
225 },
226 {
227 "expression": "max(strings)",
228 "result": "c"
229 },
230 {
231 "expression": "max(abc)",
232 "error": "invalid-type"
233 },
234 {
235 "expression": "max(array)",
236 "error": "invalid-type"
237 },
238 {
239 "expression": "max(decimals)",
240 "result": 1.2
241 },
242 {
243 "expression": "max(empty_list)",
244 "result": null
245 },
246 {
247 "expression": "merge(`{}`)",
248 "result": {}
249 },
250 {
251 "expression": "merge(`{}`, `{}`)",
252 "result": {}
253 },
254 {
255 "expression": "merge(`{\"a\": 1}`, `{\"b\": 2}`)",
256 "result": {"a": 1, "b": 2}
257 },
258 {
259 "expression": "merge(`{\"a\": 1}`, `{\"a\": 2}`)",
260 "result": {"a": 2}
261 },
262 {
263 "expression": "merge(`{\"a\": 1, \"b\": 2}`, `{\"a\": 2, \"c\": 3}`, `{\"d\": 4}`)",
264 "result": {"a": 2, "b": 2, "c": 3, "d": 4}
265 },
266 {
267 "expression": "min(numbers)",
268 "result": -1
269 },
270 {
271 "expression": "min(decimals)",
272 "result": -1.5
273 },
274 {
275 "expression": "min(abc)",
276 "error": "invalid-type"
277 },
278 {
279 "expression": "min(array)",
280 "error": "invalid-type"
281 },
282 {
283 "expression": "min(empty_list)",
284 "result": null
285 },
286 {
287 "expression": "min(decimals)",
288 "result": -1.5
289 },
290 {
291 "expression": "min(strings)",
292 "result": "a"
293 },
294 {
295 "expression": "type('abc')",
296 "result": "string"
297 },
298 {
299 "expression": "type(`1.0`)",
300 "result": "number"
301 },
302 {
303 "expression": "type(`2`)",
304 "result": "number"
305 },
306 {
307 "expression": "type(`true`)",
308 "result": "boolean"
309 },
310 {
311 "expression": "type(`false`)",
312 "result": "boolean"
313 },
314 {
315 "expression": "type(`null`)",
316 "result": "null"
317 },
318 {
319 "expression": "type(`[0]`)",
320 "result": "array"
321 },
322 {
323 "expression": "type(`{\"a\": \"b\"}`)",
324 "result": "object"
325 },
326 {
327 "expression": "type(@)",
328 "result": "object"
329 },
330 {
331 "expression": "sort(keys(objects))",
332 "result": ["bar", "foo"]
333 },
334 {
335 "expression": "keys(foo)",
336 "error": "invalid-type"
337 },
338 {
339 "expression": "keys(strings)",
340 "error": "invalid-type"
341 },
342 {
343 "expression": "keys(`false`)",
344 "error": "invalid-type"
345 },
346 {
347 "expression": "sort(values(objects))",
348 "result": ["bar", "baz"]
349 },
350 {
351 "expression": "keys(empty_hash)",
352 "result": []
353 },
354 {
355 "expression": "values(foo)",
356 "error": "invalid-type"
357 },
358 {
359 "expression": "join(', ', strings)",
360 "result": "a, b, c"
361 },
362 {
363 "expression": "join(', ', strings)",
364 "result": "a, b, c"
365 },
366 {
367 "expression": "join(',', `[\"a\", \"b\"]`)",
368 "result": "a,b"
369 },
370 {
371 "expression": "join(',', `[\"a\", 0]`)",
372 "error": "invalid-type"
373 },
374 {
375 "expression": "join(', ', str)",
376 "error": "invalid-type"
377 },
378 {
379 "expression": "join('|', strings)",
380 "result": "a|b|c"
381 },
382 {
383 "expression": "join(`2`, strings)",
384 "error": "invalid-type"
385 },
386 {
387 "expression": "join('|', decimals)",
388 "error": "invalid-type"
389 },
390 {
391 "expression": "join('|', decimals[].to_string(@))",
392 "result": "1.01|1.2|-1.5"
393 },
394 {
395 "expression": "join('|', empty_list)",
396 "result": ""
397 },
398 {
399 "expression": "reverse(numbers)",
400 "result": [5, 4, 3, -1]
401 },
402 {
403 "expression": "reverse(array)",
404 "result": ["100", "a", 5, 4, 3, -1]
405 },
406 {
407 "expression": "reverse(`[]`)",
408 "result": []
409 },
410 {
411 "expression": "reverse('')",
412 "result": ""
413 },
414 {
415 "expression": "reverse('hello world')",
416 "result": "dlrow olleh"
417 },
418 {
419 "expression": "starts_with(str, 'S')",
420 "result": true
421 },
422 {
423 "expression": "starts_with(str, 'St')",
424 "result": true
425 },
426 {
427 "expression": "starts_with(str, 'Str')",
428 "result": true
429 },
430 {
431 "expression": "starts_with(str, 'String')",
432 "result": false
433 },
434 {
435 "expression": "starts_with(str, `0`)",
436 "error": "invalid-type"
437 },
438 {
439 "expression": "sum(numbers)",
440 "result": 11
441 },
442 {
443 "expression": "sum(decimals)",
444 "result": 0.71
445 },
446 {
447 "expression": "sum(array)",
448 "error": "invalid-type"
449 },
450 {
451 "expression": "sum(array[].to_number(@))",
452 "result": 111
453 },
454 {
455 "expression": "sum(`[]`)",
456 "result": 0
457 },
458 {
459 "expression": "to_array('foo')",
460 "result": ["foo"]
461 },
462 {
463 "expression": "to_array(`0`)",
464 "result": [0]
465 },
466 {
467 "expression": "to_array(objects)",
468 "result": [{"foo": "bar", "bar": "baz"}]
469 },
470 {
471 "expression": "to_array(`[1, 2, 3]`)",
472 "result": [1, 2, 3]
473 },
474 {
475 "expression": "to_array(false)",
476 "result": [false]
477 },
478 {
479 "expression": "to_string('foo')",
480 "result": "foo"
481 },
482 {
483 "expression": "to_string(`1.2`)",
484 "result": "1.2"
485 },
486 {
487 "expression": "to_string(`[0, 1]`)",
488 "result": "[0,1]"
489 },
490 {
491 "expression": "to_number('1.0')",
492 "result": 1.0
493 },
494 {
495 "expression": "to_number('1.1')",
496 "result": 1.1
497 },
498 {
499 "expression": "to_number('4')",
500 "result": 4
501 },
502 {
503 "expression": "to_number('notanumber')",
504 "result": null
505 },
506 {
507 "expression": "to_number(`false`)",
508 "result": null
509 },
510 {
511 "expression": "to_number(`null`)",
512 "result": null
513 },
514 {
515 "expression": "to_number(`[0]`)",
516 "result": null
517 },
518 {
519 "expression": "to_number(`{\"foo\": 0}`)",
520 "result": null
521 },
522 {
523 "expression": "\"to_string\"(`1.0`)",
524 "error": "syntax"
525 },
526 {
527 "expression": "sort(numbers)",
528 "result": [-1, 3, 4, 5]
529 },
530 {
531 "expression": "sort(strings)",
532 "result": ["a", "b", "c"]
533 },
534 {
535 "expression": "sort(decimals)",
536 "result": [-1.5, 1.01, 1.2]
537 },
538 {
539 "expression": "sort(array)",
540 "error": "invalid-type"
541 },
542 {
543 "expression": "sort(abc)",
544 "error": "invalid-type"
545 },
546 {
547 "expression": "sort(empty_list)",
548 "result": []
549 },
550 {
551 "expression": "sort(@)",
552 "error": "invalid-type"
553 },
554 {
555 "expression": "not_null(unknown_key, str)",
556 "result": "Str"
557 },
558 {
559 "expression": "not_null(unknown_key, foo.bar, empty_list, str)",
560 "result": []
561 },
562 {
563 "expression": "not_null(unknown_key, null_key, empty_list, str)",
564 "result": []
565 },
566 {
567 "expression": "not_null(all, expressions, are_null)",
568 "result": null
569 },
570 {
571 "expression": "not_null()",
572 "error": "invalid-arity"
573 },
574 {
575 "description": "function projection on single arg function",
576 "expression": "numbers[].to_string(@)",
577 "result": ["-1", "3", "4", "5"]
578 },
579 {
580 "description": "function projection on single arg function",
581 "expression": "array[].to_number(@)",
582 "result": [-1, 3, 4, 5, 100]
583 }
584 ]
585}, {
586 "given":
587 {
588 "foo": [
589 {"b": "b", "a": "a"},
590 {"c": "c", "b": "b"},
591 {"d": "d", "c": "c"},
592 {"e": "e", "d": "d"},
593 {"f": "f", "e": "e"}
594 ]
595 },
596 "cases": [
597 {
598 "description": "function projection on variadic function",
599 "expression": "foo[].not_null(f, e, d, c, b, a)",
600 "result": ["b", "c", "d", "e", "f"]
601 }
602 ]
603}, {
604 "given":
605 {
606 "people": [
607 {"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
608 {"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
609 {"age": 30, "age_str": "30", "bool": true, "name": "c"},
610 {"age": 50, "age_str": "50", "bool": false, "name": "d"},
611 {"age": 10, "age_str": "10", "bool": true, "name": 3}
612 ]
613 },
614 "cases": [
615 {
616 "description": "sort by field expression",
617 "expression": "sort_by(people, &age)",
618 "result": [
619 {"age": 10, "age_str": "10", "bool": true, "name": 3},
620 {"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
621 {"age": 30, "age_str": "30", "bool": true, "name": "c"},
622 {"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
623 {"age": 50, "age_str": "50", "bool": false, "name": "d"}
624 ]
625 },
626 {
627 "expression": "sort_by(people, &age_str)",
628 "result": [
629 {"age": 10, "age_str": "10", "bool": true, "name": 3},
630 {"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
631 {"age": 30, "age_str": "30", "bool": true, "name": "c"},
632 {"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
633 {"age": 50, "age_str": "50", "bool": false, "name": "d"}
634 ]
635 },
636 {
637 "description": "sort by function expression",
638 "expression": "sort_by(people, &to_number(age_str))",
639 "result": [
640 {"age": 10, "age_str": "10", "bool": true, "name": 3},
641 {"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
642 {"age": 30, "age_str": "30", "bool": true, "name": "c"},
643 {"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
644 {"age": 50, "age_str": "50", "bool": false, "name": "d"}
645 ]
646 },
647 {
648 "description": "function projection on sort_by function",
649 "expression": "sort_by(people, &age)[].name",
650 "result": [3, "a", "c", "b", "d"]
651 },
652 {
653 "expression": "sort_by(people, &extra)",
654 "error": "invalid-type"
655 },
656 {
657 "expression": "sort_by(people, &bool)",
658 "error": "invalid-type"
659 },
660 {
661 "expression": "sort_by(people, &name)",
662 "error": "invalid-type"
663 },
664 {
665 "expression": "sort_by(people, name)",
666 "error": "invalid-type"
667 },
668 {
669 "expression": "sort_by(people, &age)[].extra",
670 "result": ["foo", "bar"]
671 },
672 {
673 "expression": "sort_by(`[]`, &age)",
674 "result": []
675 },
676 {
677 "expression": "max_by(people, &age)",
678 "result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}
679 },
680 {
681 "expression": "max_by(people, &age_str)",
682 "result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}
683 },
684 {
685 "expression": "max_by(people, &bool)",
686 "error": "invalid-type"
687 },
688 {
689 "expression": "max_by(people, &extra)",
690 "error": "invalid-type"
691 },
692 {
693 "expression": "max_by(people, &to_number(age_str))",
694 "result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}
695 },
696 {
697 "expression": "min_by(people, &age)",
698 "result": {"age": 10, "age_str": "10", "bool": true, "name": 3}
699 },
700 {
701 "expression": "min_by(people, &age_str)",
702 "result": {"age": 10, "age_str": "10", "bool": true, "name": 3}
703 },
704 {
705 "expression": "min_by(people, &bool)",
706 "error": "invalid-type"
707 },
708 {
709 "expression": "min_by(people, &extra)",
710 "error": "invalid-type"
711 },
712 {
713 "expression": "min_by(people, &to_number(age_str))",
714 "result": {"age": 10, "age_str": "10", "bool": true, "name": 3}
715 }
716 ]
717}, {
718 "given":
719 {
720 "people": [
721 {"age": 10, "order": "1"},
722 {"age": 10, "order": "2"},
723 {"age": 10, "order": "3"},
724 {"age": 10, "order": "4"},
725 {"age": 10, "order": "5"},
726 {"age": 10, "order": "6"},
727 {"age": 10, "order": "7"},
728 {"age": 10, "order": "8"},
729 {"age": 10, "order": "9"},
730 {"age": 10, "order": "10"},
731 {"age": 10, "order": "11"}
732 ]
733 },
734 "cases": [
735 {
736 "description": "stable sort order",
737 "expression": "sort_by(people, &age)",
738 "result": [
739 {"age": 10, "order": "1"},
740 {"age": 10, "order": "2"},
741 {"age": 10, "order": "3"},
742 {"age": 10, "order": "4"},
743 {"age": 10, "order": "5"},
744 {"age": 10, "order": "6"},
745 {"age": 10, "order": "7"},
746 {"age": 10, "order": "8"},
747 {"age": 10, "order": "9"},
748 {"age": 10, "order": "10"},
749 {"age": 10, "order": "11"}
750 ]
751 }
752 ]
753}, {
754 "given":
755 {
756 "people": [
757 {"a": 10, "b": 1, "c": "z"},
758 {"a": 10, "b": 2, "c": null},
759 {"a": 10, "b": 3},
760 {"a": 10, "b": 4, "c": "z"},
761 {"a": 10, "b": 5, "c": null},
762 {"a": 10, "b": 6},
763 {"a": 10, "b": 7, "c": "z"},
764 {"a": 10, "b": 8, "c": null},
765 {"a": 10, "b": 9}
766 ],
767 "empty": []
768 },
769 "cases": [
770 {
771 "expression": "map(&a, people)",
772 "result": [10, 10, 10, 10, 10, 10, 10, 10, 10]
773 },
774 {
775 "expression": "map(&c, people)",
776 "result": ["z", null, null, "z", null, null, "z", null, null]
777 },
778 {
779 "expression": "map(&a, badkey)",
780 "error": "invalid-type"
781 },
782 {
783 "expression": "map(&foo, empty)",
784 "result": []
785 }
786 ]
787}, {
788 "given": {
789 "array": [
790 {
791 "foo": {"bar": "yes1"}
792 },
793 {
794 "foo": {"bar": "yes2"}
795 },
796 {
797 "foo1": {"bar": "no"}
798 }
799 ]},
800 "cases": [
801 {
802 "expression": "map(&foo.bar, array)",
803 "result": ["yes1", "yes2", null]
804 },
805 {
806 "expression": "map(&foo1.bar, array)",
807 "result": [null, null, "no"]
808 },
809 {
810 "expression": "map(&foo.bar.baz, array)",
811 "result": [null, null, null]
812 }
813 ]
814}, {
815 "given": {
816 "array": [[1, 2, 3, [4]], [5, 6, 7, [8, 9]]]
817 },
818 "cases": [
819 {
820 "expression": "map(&[], array)",
821 "result": [[1, 2, 3, 4], [5, 6, 7, 8, 9]]
822 }
823 ]
824}
825]
View as plain text