# file : tests/type/json/testscript # license : MIT; see accompanying LICENSE file # See also tests in function/json/. .include ../../common.testscript : basics : { : empty-null : $* <>EOO print ([json, null] ) print ([json] null) print ([json] ) print ([json] "") print ([json_array] ) print ([json_object] ) print ([json] one@null) print ([json] one@) # @@ Would be more consistent if were null (type hints?) print ([json] one@"") EOI [null] "" [] {} {"one":null} {"one":""} {"one":""} EOO : reverse : $* <>EOO print ([json] null) print ([json] true) print ([json] 123) print ([json] -123) print ([json] 0xdecaf) print ([json] abc) # @@ Ideally we would like this to be reversed unquoted. print ([json] '"abc"') # @@ Ditto. print (([json] abc)[0]) # @@ Workaround. print ([json] dir/{file1 file2}) print ([json] ' ["dir/file1", "dir/file2"] ') print ([json] zero@null one@1 two@abc three@([json] x@123 y@-123) four@([json] null true)) print ([json] '{"zero":null,"one":1,"two":"abc","three":{"x":123,"y":-123},"four":[null,true]}') EOI true 123 -123 0xdecaf "abc" "abc" abc ["dir/file1","dir/file2"] ["dir/file1","dir/file2"] {"zero":null,"one":1,"two":"abc","three":{"x":123,"y":-123},"four":[null,true]} {"zero":null,"one":1,"two":"abc","three":{"x":123,"y":-123},"four":[null,true]} EOO : hex : $* <>EOO print ([json] 0xffffFFFF) # These should be in the hexadecimal notation once we switch to JSON5. # print ([json] 0x0 0x01 0xff 0xFFFF) print ([json] ff@0xff FFFF@0xFFFF) # @@ This should start working once we switch to type hints in subscript. # #j = [json] ff@0xff #print $value_type($j[ff], true) print 'hexadecimal number' EOI 0xffffffff [0,1,255,65535] {"ff":255,"FFFF":65535} hexadecimal number EOO : diagnostics-reverse-invalid : $* <>EOE != 0 o = [json] '{"one":1, "two":}' EOI error: invalid json value in variable o: invalid json input: unexpected byte '}' in value :1:5: info: variable o value is assigned here EOE : diagnostics-duplicate-member : $* <>EOE != 0 o = [json] one@1 one@2 EOI error: invalid json value in variable o: duplicate json object member 'one' :1:5: info: variable o value is assigned here EOE } : compare : { : type : $* <>EOO print (([json] null) < ([json] true)) print (([json] true) < ([json] 0)) print (([json] 123) < ([json] '"0"')) print (([json] abc) < ([json] xxx yyy)) print (([json] xxx yyy) < ([json] xxx@null yyy@null)) EOI true true true true true EOO : simple : $* <>EOO print (([json] false) == ([json] false)) print (([json] false) < ([json] true)) print (([json] 123) == ([json] 123)) print (([json] -123) == ([json] -123)) print (([json] 0xff) == ([json] 255)) print (([json] 0) == ([json] -0)) print (([json] -1) < ([json] 0)) print (([json] 123) < ([json] 234)) print (([json] -234) < ([json] -123)) print (([json] abc) == ([json] abc)) print (([json] abc) < ([json] abz)) print (([json] abc) < ([json] abcd)) EOI true true true true true true true true true true true true EOO : array : $* <>EOO print (([json] 1 2 3) == ([json] 1 2 3)) print (([json] 1 2 3) < ([json] 1 2 4)) print (([json] 1 2 3) < ([json] 1 2 3 4)) EOI true true true EOO : object : $* <>EOO print (([json] one@1 two@2 three@3) == ([json] three@3 one@1 two@2)) print (([json] one@1 two@2 three@3) < ([json] three@3 one@1 two@4)) print (([json] one@1 three@3) < ([json] three@3 one@1 two@2)) EOI true true true EOO } : append-prepend : { : array : $* <'[0,1,2,3,4,5,6,7,8]' a = [json] 2 3 a += 4 a += 5 6 a += [json] 7 8 a =+ [json] 0 1 print $a EOI : array-type : $* <'[1,2,3,4,5]' [json_array] a = a += 1 a += 2 3 a += [json_array] 4 5 # @@ Should be possible to use json. print $a EOI : object : $* <'{"zero":0,"one":6,"two":8,"three":3,"four":4,"five":5,"seven":7}' o = [json] one@1 two@2 three@3 o += four@4 o += five@5 one@6 o += [json] seven@7 two@8 o =+ [json] zero@0 three@9 print $o EOI : object-type : $* <'{"one":1,"two":2,"three":3,"four":4,"five":5}' [json_object] o = o += one@1 o += two@2 three@3 o += [json_object] four@4 five@5 # @@ Should be possible to use json. print $o EOI : boolean : $* <>EOO b = [json] false b += [json] true print $b EOI true EOO : number : $* <>EOO n = [json] -2 print $value_type($n, true) $n n += 1 print $value_type($n, true) $n n += 1 print $value_type($n, true) $n n += 1 print $value_type($n, true) $n n += [json] -1 print $value_type($n, true) $n n += [json] -1 print $value_type($n, true) $n EOI signed number -2 signed number -1 unsigned number 0 unsigned number 1 unsigned number 0 signed number -1 EOO : string : $* <>EOO s = [json] yyy s += [json] zzz s =+ [json] xxx print $s EOI "xxxyyyzzz" EOO : invalid : $* <>EOE != 0 a = [json] 1 2 3 s = [json] str s += $a print $s EOI error: invalid json value in variable s: unable to append array to string :3:6: info: variable s value is assigned here EOE } : subscript : { : null : $* <>EOO j = [json] null print ($j[0]) print ($j[one]) EOI [null] [null] EOO : array : $* <>EOO j = [json] 1 2 3 null print ($j[1]) print ($j[3]) print ($j[4]) EOI 2 [null] [null] EOO : object-name : $* <>EOO j = [json] one@1 two@2 three@3 four@null print ($j[two]) print ($j[four]) print ($j[five]) EOI 2 [null] [null] EOO : object-index : $* <>EOO j = [json] one@1 two@2 three@3 print ($j[([uint64] 1)]) EOI {"two":2} EOO : nested : $* <>EOO o = [json] one@([json] 1 2 ([json] a@3 b@4) null) two@([json] x@x y@([json] 5 6)) print ($o[one][1]) print ($o[one][2][b]) print ($o[two][y][1]) print ($o[two][bogus][junk]) print ($o[two][bogus][junk][garbage]) print ($o[one][3][junk]) # JSON null print ($o[one][3][junk][garbage]) a = [json] ([json] one@1 two@([json] 2 3)) ([json] 4 5) null print ($a[0][one]) print ($a[0][two][1]) print ($a[1][1]) print ($a[1][123][junk]) print ($a[1][123][junk][garbage]) print ($a[2][junk]) # JSON null print ($a[2][junk][garbage]) EOI 2 4 6 [null] [null] [null] [null] 1 3 5 [null] [null] [null] [null] EOO : reverse : $* <>EOO print (([json] one@null)[one]) print (([json] one@true)[one]) print (([json] one@123)[one]) print (([json] one@-123)[one]) print (([json] one@0xdecaf)[one]) print (([json] one@abc)[one]) EOI [null] true 123 -123 912559 abc EOO : diagnostics-not-object : $* <>EOE != 0 j = [json] 1 2 3 print ($j[one]) EOI :2:11: error: invalid json value subscript: invalid uint64 value 'one' info: json value type is array :2:9: info: use the '\[' escape sequence if this is a wildcard pattern EOE } : iteration : { : null : $* <>EOO for v: ([json] 123) print $v EOI 123 EOO : array : $* <>EOO for v: ([json] 1 2 3) print $v EOI 1 2 3 EOO : object : $* <>EOO for v: ([json] one@1 two@2 three@3) print $v EOI {"one":1} {"two":2} {"three":3} EOO : reverse : $* <>EOO for v: ([json] null true 123 -123 0xdecaf abc) print $v EOI [null] true 123 -123 912559 abc EOO } : json-map : { : basics : $* <>EOO m = [json_map] 2@([json] a@1 b@2) 1@([json] 1 2) 0@([json] null) -1@null print $m for p: $m print $first($p) $second($p) print ($m[1]) print $type($m[1]) print ($m[2][b]) print ($m[0]) print ($m[-1]) EOI -1@null 0@null 1@[1,2] 2@{"a":1,"b":2} -1 null 0 null 1 [1,2] 2 {"a":1,"b":2} [1,2] json 2 EOO } : json-set : { : basics : $* <>EOO s = [json_set] ([json] x@1 y@2) ([json] a@1 b@2) print $s for v: $s print $type($v) $v print ($s[([json] y@2 x@1)]) EOI {"a":1,"b":2} {"x":1,"y":2} json {"a":1,"b":2} json {"x":1,"y":2} true EOO }