functions.json
  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  ]