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(`\"\"`)",
|
180 | "result": 0
|
181 | },
|
182 | {
|
183 | "expression": "length(@)",
|
184 | "result": 12
|
185 | },
|
186 | {
|
187 | "expression": "length(strings[0])",
|
188 | "result": 1
|
189 | },
|
190 | {
|
191 | "expression": "length(str)",
|
192 | "result": 3
|
193 | },
|
194 | {
|
195 | "expression": "length(array)",
|
196 | "result": 6
|
197 | },
|
198 | {
|
199 | "expression": "length(objects)",
|
200 | "result": 2
|
201 | },
|
202 | {
|
203 | "expression": "length(`false`)",
|
204 | "error": "invalid-type"
|
205 | },
|
206 | {
|
207 | "expression": "length(foo)",
|
208 | "error": "invalid-type"
|
209 | },
|
210 | {
|
211 | "expression": "length(strings[0])",
|
212 | "result": 1
|
213 | },
|
214 | {
|
215 | "expression": "max(numbers)",
|
216 | "result": 5
|
217 | },
|
218 | {
|
219 | "expression": "max(decimals)",
|
220 | "result": 1.2
|
221 | },
|
222 | {
|
223 | "expression": "max(strings)",
|
224 | "result": "c"
|
225 | },
|
226 | {
|
227 | "expression": "max(abc)",
|
228 | "error": "invalid-type"
|
229 | },
|
230 | {
|
231 | "expression": "max(array)",
|
232 | "error": "invalid-type"
|
233 | },
|
234 | {
|
235 | "expression": "max(decimals)",
|
236 | "result": 1.2
|
237 | },
|
238 | {
|
239 | "expression": "max(empty_list)",
|
240 | "result": null
|
241 | },
|
242 | {
|
243 | "expression": "merge(`{}`)",
|
244 | "result": {}
|
245 | },
|
246 | {
|
247 | "expression": "merge(`{}`, `{}`)",
|
248 | "result": {}
|
249 | },
|
250 | {
|
251 | "expression": "merge(`{\"a\": 1}`, `{\"b\": 2}`)",
|
252 | "result": {"a": 1, "b": 2}
|
253 | },
|
254 | {
|
255 | "expression": "merge(`{\"a\": 1}`, `{\"a\": 2}`)",
|
256 | "result": {"a": 2}
|
257 | },
|
258 | {
|
259 | "expression": "merge(`{\"a\": 1, \"b\": 2}`, `{\"a\": 2, \"c\": 3}`, `{\"d\": 4}`)",
|
260 | "result": {"a": 2, "b": 2, "c": 3, "d": 4}
|
261 | },
|
262 | {
|
263 | "expression": "min(numbers)",
|
264 | "result": -1
|
265 | },
|
266 | {
|
267 | "expression": "min(decimals)",
|
268 | "result": -1.5
|
269 | },
|
270 | {
|
271 | "expression": "min(abc)",
|
272 | "error": "invalid-type"
|
273 | },
|
274 | {
|
275 | "expression": "min(array)",
|
276 | "error": "invalid-type"
|
277 | },
|
278 | {
|
279 | "expression": "min(empty_list)",
|
280 | "result": null
|
281 | },
|
282 | {
|
283 | "expression": "min(decimals)",
|
284 | "result": -1.5
|
285 | },
|
286 | {
|
287 | "expression": "min(strings)",
|
288 | "result": "a"
|
289 | },
|
290 | {
|
291 | "expression": "type(`abc`)",
|
292 | "result": "string"
|
293 | },
|
294 | {
|
295 | "expression": "type(`1.0`)",
|
296 | "result": "number"
|
297 | },
|
298 | {
|
299 | "expression": "type(`2`)",
|
300 | "result": "number"
|
301 | },
|
302 | {
|
303 | "expression": "type(`true`)",
|
304 | "result": "boolean"
|
305 | },
|
306 | {
|
307 | "expression": "type(`false`)",
|
308 | "result": "boolean"
|
309 | },
|
310 | {
|
311 | "expression": "type(`null`)",
|
312 | "result": "null"
|
313 | },
|
314 | {
|
315 | "expression": "type(`[0]`)",
|
316 | "result": "array"
|
317 | },
|
318 | {
|
319 | "expression": "type(`{\"a\": \"b\"}`)",
|
320 | "result": "object"
|
321 | },
|
322 | {
|
323 | "expression": "type(@)",
|
324 | "result": "object"
|
325 | },
|
326 | {
|
327 | "expression": "keys(objects)",
|
328 | "result": ["foo", "bar"]
|
329 | },
|
330 | {
|
331 | "expression": "keys(foo)",
|
332 | "error": "invalid-type"
|
333 | },
|
334 | {
|
335 | "expression": "keys(strings)",
|
336 | "error": "invalid-type"
|
337 | },
|
338 | {
|
339 | "expression": "keys(`false`)",
|
340 | "error": "invalid-type"
|
341 | },
|
342 | {
|
343 | "expression": "values(objects)",
|
344 | "result": ["bar", "baz"]
|
345 | },
|
346 | {
|
347 | "expression": "keys(empty_hash)",
|
348 | "result": []
|
349 | },
|
350 | {
|
351 | "expression": "values(foo)",
|
352 | "error": "invalid-type"
|
353 | },
|
354 | {
|
355 | "expression": "join(`\", \"`, strings)",
|
356 | "result": "a, b, c"
|
357 | },
|
358 | {
|
359 | "expression": "join(`, `, strings)",
|
360 | "result": "a, b, c"
|
361 | },
|
362 | {
|
363 | "expression": "join(`,`, `[\"a\", \"b\"]`)",
|
364 | "result": "a,b"
|
365 | },
|
366 | {
|
367 | "expression": "join(`,`, `[\"a\", 0]`)",
|
368 | "error": "invalid-type"
|
369 | },
|
370 | {
|
371 | "expression": "join(`, `, str)",
|
372 | "error": "invalid-type"
|
373 | },
|
374 | {
|
375 | "expression": "join(`|`, strings)",
|
376 | "result": "a|b|c"
|
377 | },
|
378 | {
|
379 | "expression": "join(`2`, strings)",
|
380 | "error": "invalid-type"
|
381 | },
|
382 | {
|
383 | "expression": "join(`|`, decimals)",
|
384 | "error": "invalid-type"
|
385 | },
|
386 | {
|
387 | "expression": "join(`|`, decimals[].to_string(@))",
|
388 | "result": "1.01|1.2|-1.5"
|
389 | },
|
390 | {
|
391 | "expression": "join(`|`, empty_list)",
|
392 | "result": ""
|
393 | },
|
394 | {
|
395 | "expression": "reverse(numbers)",
|
396 | "result": [5, 4, 3, -1]
|
397 | },
|
398 | {
|
399 | "expression": "reverse(array)",
|
400 | "result": ["100", "a", 5, 4, 3, -1]
|
401 | },
|
402 | {
|
403 | "expression": "reverse(`[]`)",
|
404 | "result": []
|
405 | },
|
406 | {
|
407 | "expression": "reverse(``)",
|
408 | "result": ""
|
409 | },
|
410 | {
|
411 | "expression": "reverse(`hello world`)",
|
412 | "result": "dlrow olleh"
|
413 | },
|
414 | {
|
415 | "expression": "starts_with(str, `S`)",
|
416 | "result": true
|
417 | },
|
418 | {
|
419 | "expression": "starts_with(str, `St`)",
|
420 | "result": true
|
421 | },
|
422 | {
|
423 | "expression": "starts_with(str, `Str`)",
|
424 | "result": true
|
425 | },
|
426 | {
|
427 | "expression": "starts_with(str, `String`)",
|
428 | "result": false
|
429 | },
|
430 | {
|
431 | "expression": "starts_with(str, `0`)",
|
432 | "error": "invalid-type"
|
433 | },
|
434 | {
|
435 | "expression": "sum(numbers)",
|
436 | "result": 11
|
437 | },
|
438 | {
|
439 | "expression": "sum(decimals)",
|
440 | "result": 0.71
|
441 | },
|
442 | {
|
443 | "expression": "sum(array)",
|
444 | "error": "invalid-type"
|
445 | },
|
446 | {
|
447 | "expression": "sum(array[].to_number(@))",
|
448 | "result": 111
|
449 | },
|
450 | {
|
451 | "expression": "sum(`[]`)",
|
452 | "result": 0
|
453 | },
|
454 | {
|
455 | "expression": "to_array(`foo`)",
|
456 | "result": ["foo"]
|
457 | },
|
458 | {
|
459 | "expression": "to_array(`0`)",
|
460 | "result": [0]
|
461 | },
|
462 | {
|
463 | "expression": "to_array(objects)",
|
464 | "result": [{"foo": "bar", "bar": "baz"}]
|
465 | },
|
466 | {
|
467 | "expression": "to_array(`[1, 2, 3]`)",
|
468 | "result": [1, 2, 3]
|
469 | },
|
470 | {
|
471 | "expression": "to_array(false)",
|
472 | "result": [false]
|
473 | },
|
474 | {
|
475 | "expression": "to_string(`foo`)",
|
476 | "result": "foo"
|
477 | },
|
478 | {
|
479 | "expression": "to_string(`1.2`)",
|
480 | "result": "1.2"
|
481 | },
|
482 | {
|
483 | "expression": "to_string(`[0, 1]`)",
|
484 | "result": "[0,1]"
|
485 | },
|
486 | {
|
487 | "expression": "to_number(`\"1.0\"`)",
|
488 | "result": 1.0
|
489 | },
|
490 | {
|
491 | "expression": "to_number(`\"1.1\"`)",
|
492 | "result": 1.1
|
493 | },
|
494 | {
|
495 | "expression": "to_number(`\"4\"`)",
|
496 | "result": 4
|
497 | },
|
498 | {
|
499 | "expression": "to_number(`\"notanumber\"`)",
|
500 | "result": null
|
501 | },
|
502 | {
|
503 | "expression": "to_number(`false`)",
|
504 | "result": null
|
505 | },
|
506 | {
|
507 | "expression": "to_number(`null`)",
|
508 | "result": null
|
509 | },
|
510 | {
|
511 | "expression": "to_number(`[0]`)",
|
512 | "result": null
|
513 | },
|
514 | {
|
515 | "expression": "to_number(`{\"foo\": 0}`)",
|
516 | "result": null
|
517 | },
|
518 | {
|
519 | "expression": "\"to_string\"(`1.0`)",
|
520 | "error": "syntax"
|
521 | },
|
522 | {
|
523 | "expression": "sort(numbers)",
|
524 | "result": [-1, 3, 4, 5]
|
525 | },
|
526 | {
|
527 | "expression": "sort(strings)",
|
528 | "result": ["a", "b", "c"]
|
529 | },
|
530 | {
|
531 | "expression": "sort(decimals)",
|
532 | "result": [-1.5, 1.01, 1.2]
|
533 | },
|
534 | {
|
535 | "expression": "sort(array)",
|
536 | "error": "invalid-type"
|
537 | },
|
538 | {
|
539 | "expression": "sort(abc)",
|
540 | "error": "invalid-type"
|
541 | },
|
542 | {
|
543 | "expression": "sort(empty_list)",
|
544 | "result": []
|
545 | },
|
546 | {
|
547 | "expression": "sort(@)",
|
548 | "error": "invalid-type"
|
549 | },
|
550 | {
|
551 | "expression": "not_null(unknown_key, str)",
|
552 | "result": "Str"
|
553 | },
|
554 | {
|
555 | "expression": "not_null(unknown_key, foo.bar, empty_list, str)",
|
556 | "result": []
|
557 | },
|
558 | {
|
559 | "expression": "not_null(unknown_key, null_key, empty_list, str)",
|
560 | "result": []
|
561 | },
|
562 | {
|
563 | "expression": "not_null(all, expressions, are_null)",
|
564 | "result": null
|
565 | },
|
566 | {
|
567 | "expression": "not_null()",
|
568 | "error": "invalid-arity"
|
569 | },
|
570 | {
|
571 | "description": "function projection on single arg function",
|
572 | "expression": "numbers[].to_string(@)",
|
573 | "result": ["-1", "3", "4", "5"]
|
574 | },
|
575 | {
|
576 | "description": "function projection on single arg function",
|
577 | "expression": "array[].to_number(@)",
|
578 | "result": [-1, 3, 4, 5, 100]
|
579 | }
|
580 | ]
|
581 | }, {
|
582 | "given":
|
583 | {
|
584 | "foo": [
|
585 | {"b": "b", "a": "a"},
|
586 | {"c": "c", "b": "b"},
|
587 | {"d": "d", "c": "c"},
|
588 | {"e": "e", "d": "d"},
|
589 | {"f": "f", "e": "e"}
|
590 | ]
|
591 | },
|
592 | "cases": [
|
593 | {
|
594 | "description": "function projection on variadic function",
|
595 | "expression": "foo[].not_null(f, e, d, c, b, a)",
|
596 | "result": ["b", "c", "d", "e", "f"]
|
597 | }
|
598 | ]
|
599 | }, {
|
600 | "given":
|
601 | {
|
602 | "people": [
|
603 | {"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
|
604 | {"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
|
605 | {"age": 30, "age_str": "30", "bool": true, "name": "c"},
|
606 | {"age": 50, "age_str": "50", "bool": false, "name": "d"},
|
607 | {"age": 10, "age_str": "10", "bool": true, "name": 3}
|
608 | ]
|
609 | },
|
610 | "cases": [
|
611 | {
|
612 | "description": "sort by field expression",
|
613 | "expression": "sort_by(people, &age)",
|
614 | "result": [
|
615 | {"age": 10, "age_str": "10", "bool": true, "name": 3},
|
616 | {"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
|
617 | {"age": 30, "age_str": "30", "bool": true, "name": "c"},
|
618 | {"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
|
619 | {"age": 50, "age_str": "50", "bool": false, "name": "d"}
|
620 | ]
|
621 | },
|
622 | {
|
623 | "description": "sort by function expression",
|
624 | "expression": "sort_by(people, &to_number(age_str))",
|
625 | "result": [
|
626 | {"age": 10, "age_str": "10", "bool": true, "name": 3},
|
627 | {"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
|
628 | {"age": 30, "age_str": "30", "bool": true, "name": "c"},
|
629 | {"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
|
630 | {"age": 50, "age_str": "50", "bool": false, "name": "d"}
|
631 | ]
|
632 | },
|
633 | {
|
634 | "description": "function projection on sort_by function",
|
635 | "expression": "sort_by(people, &age)[].name",
|
636 | "result": [3, "a", "c", "b", "d"]
|
637 | },
|
638 | {
|
639 | "expression": "sort_by(people, &extra)",
|
640 | "error": "invalid-type"
|
641 | },
|
642 | {
|
643 | "expression": "sort_by(people, &bool)",
|
644 | "error": "invalid-type"
|
645 | },
|
646 | {
|
647 | "expression": "sort_by(people, &name)",
|
648 | "error": "invalid-type"
|
649 | },
|
650 | {
|
651 | "expression": "sort_by(people, name)",
|
652 | "error": "invalid-type"
|
653 | },
|
654 | {
|
655 | "expression": "sort_by(people, &age)[].extra",
|
656 | "result": ["foo", "bar"]
|
657 | },
|
658 | {
|
659 | "expression": "sort_by(`[]`, &age)",
|
660 | "result": []
|
661 | },
|
662 | {
|
663 | "expression": "max_by(people, &age)",
|
664 | "result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}
|
665 | },
|
666 | {
|
667 | "expression": "max_by(people, &age_str)",
|
668 | "result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}
|
669 | },
|
670 | {
|
671 | "expression": "max_by(people, &bool)",
|
672 | "error": "invalid-type"
|
673 | },
|
674 | {
|
675 | "expression": "max_by(people, &extra)",
|
676 | "error": "invalid-type"
|
677 | },
|
678 | {
|
679 | "expression": "max_by(people, &to_number(age_str))",
|
680 | "result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}
|
681 | },
|
682 | {
|
683 | "expression": "min_by(people, &age)",
|
684 | "result": {"age": 10, "age_str": "10", "bool": true, "name": 3}
|
685 | },
|
686 | {
|
687 | "expression": "min_by(people, &age_str)",
|
688 | "result": {"age": 10, "age_str": "10", "bool": true, "name": 3}
|
689 | },
|
690 | {
|
691 | "expression": "min_by(people, &bool)",
|
692 | "error": "invalid-type"
|
693 | },
|
694 | {
|
695 | "expression": "min_by(people, &extra)",
|
696 | "error": "invalid-type"
|
697 | },
|
698 | {
|
699 | "expression": "min_by(people, &to_number(age_str))",
|
700 | "result": {"age": 10, "age_str": "10", "bool": true, "name": 3}
|
701 | }
|
702 | ]
|
703 | }, {
|
704 | "given":
|
705 | {
|
706 | "people": [
|
707 | {"age": 10, "order": "1"},
|
708 | {"age": 10, "order": "2"},
|
709 | {"age": 10, "order": "3"},
|
710 | {"age": 10, "order": "4"},
|
711 | {"age": 10, "order": "5"},
|
712 | {"age": 10, "order": "6"},
|
713 | {"age": 10, "order": "7"},
|
714 | {"age": 10, "order": "8"},
|
715 | {"age": 10, "order": "9"},
|
716 | {"age": 10, "order": "10"},
|
717 | {"age": 10, "order": "11"}
|
718 | ]
|
719 | },
|
720 | "cases": [
|
721 | {
|
722 | "description": "stable sort order",
|
723 | "expression": "sort_by(people, &age)",
|
724 | "result": [
|
725 | {"age": 10, "order": "1"},
|
726 | {"age": 10, "order": "2"},
|
727 | {"age": 10, "order": "3"},
|
728 | {"age": 10, "order": "4"},
|
729 | {"age": 10, "order": "5"},
|
730 | {"age": 10, "order": "6"},
|
731 | {"age": 10, "order": "7"},
|
732 | {"age": 10, "order": "8"},
|
733 | {"age": 10, "order": "9"},
|
734 | {"age": 10, "order": "10"},
|
735 | {"age": 10, "order": "11"}
|
736 | ]
|
737 | }
|
738 | ]
|
739 | }]
|