summaryrefslogtreecommitdiffstats
path: root/tests/010
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-05-31 23:21:20 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-05-31 23:21:20 -0700
commitf311b6ca089954675e745ad9212209ca8cf23be2 (patch)
treedb61d4698f4485b87f0e5cc19b2da300acf8e14a /tests/010
parent5d02e6e736d419c0abc271b6049814598cdc3cb9 (diff)
downloadtxr-f311b6ca089954675e745ad9212209ca8cf23be2.tar.gz
txr-f311b6ca089954675e745ad9212209ca8cf23be2.tar.bz2
txr-f311b6ca089954675e745ad9212209ca8cf23be2.zip
json: wrap up: test cases, fixes, tweaks.
* /share/txr/stdlib/getput.tl (get-jsons): If the s parameter is a string, convert it to a byte input stream so that. (put-jsons): Add missing t return value. (file-put-json, file-append-json, file-put-jsons, file-append-jsons, command-put-jsons, command-put-jsons): Add missing object argument to all these functions, and a missing "w" open-file mode to several of them. * stream.c (mkstemp_wrap): Calculate length of suff the defaulted argument, not the raw suffix argument. * test/010/json.tl: New file, providing tests that touch every area of the new JSON functionality. * tests/common.tl (mstest, with-temp-file): New macros. * txr.1: Document that get-jsons takes a source which could be a string.
Diffstat (limited to 'tests/010')
-rw-r--r--tests/010/json.tl124
1 files changed, 124 insertions, 0 deletions
diff --git a/tests/010/json.tl b/tests/010/json.tl
new file mode 100644
index 00000000..68544f07
--- /dev/null
+++ b/tests/010/json.tl
@@ -0,0 +1,124 @@
+(load "../common")
+
+(mtest
+ #J0 0.0
+ #J"abc" "abc"
+ #Jtrue t
+ #Jfalse nil
+ #Jnull null)
+
+(mtest
+ #J1 1.0
+ #J 1 1.0
+ #J123 123.0
+ #J0.123 0.123
+ #J1.123 1.123
+ #J1E3 1000.0
+ #J1.1E3 1100.0
+ #J1.1E+3 1100.0
+ #J1.1E+03 1100.0
+ #J1.1e3 1100.0
+ #J1.1e+3 1100.0
+ #J1.1e+03 1100.0)
+
+(mtest
+ #J"" ""
+ #J"\u0000" "\xdc00"
+ #J"\u0001" "\x1"
+ #J"\ud801\udc37" "\x10437"
+ #J"a\u0000b" "a\xdc00;b"
+ #J"a\u0001b" "a\x1;b"
+ #J"a\ud801\udc37b" "a\x10437;b"
+ #J"\b\t\n\f\r" "\b\t\n\f\r"
+ #J"\/\\\"" "/\\\"")
+
+(mtest
+ #J[] #()
+ #J[ ] #()
+ #J[ ] #()
+ #J [ ] #()
+ #J[null] #(null)
+ #J[false] #(nil)
+ #J[true] #(t)
+ #J["abc"] #("abc")
+ #J[1,2,3] #(1.0 2.0 3.0)
+ #J[ 1 , 2 , 3 ] #(1.0 2.0 3.0)
+ #J[[]] #(#())
+ #J[[],[]] #(#() #())
+ #J[ [] , [] ] #(#() #())
+ #J[[1],[2],3] #(#(1.0) #(2.0) 3.0))
+
+(mtest
+ #J{} #H(())
+ #J{ } #H(())
+ #J{ } #H(())
+ #J { } #H(())
+ #J{true:true} #H(() (t t)))
+ #J{ true : true } #H(() (t t))
+ #J{ {} : {} } #H(() (#H(()) #H(())))
+ #J{ "a" : 1.0 } #H(() (a 1.0))
+ #J{ "a" : 1.0, "b" : [null] } #H(() (a 1.0) (b #(null)))
+
+(let ((*print-circle* t))
+ (mstest
+ #J[#1="abc", #1#] "#(#1=\"abc\" #1#)"
+ #2=#J[1, #2#] "#1=#(1.0 #J#1#)"
+ #J#3=[1, #3#] "#1=#(1.0 #1#)"
+ #4=#J{#4#:#4#} "#1=#H(() (#2=#J#1# #2#))"
+ #J#5={#5#:#5#} "#1=#H(() (#1# #1#))")
+
+ (let ((chash #J{"foo":#6="bar", "xyzzy":#6#}))
+ (mtest
+ [chash "xyzzy"] "bar"
+ (eq [chash "foo"] [chash "xyzzy"]) t)))
+
+(mtest
+ ^#J~(+ 1.0 1) #J2
+ ^#J[1, ~(+ 2.0 2)] #J[1, 4]
+ ^#J[1, ~(+ 2.0 2), 3] #J[1, 4, 3]
+ (eval ^^#J~#(1.0 ,*(list 2.0 3.0) 4.0)) #J[1, 2, 3, 4]
+ ^#J[1, ~*(list 2.0 3.0), 4] #J[1, 2, 3, 4]
+ #J^[1, ~(+ 2.0 2)] #(1.0 4.0)
+ #J^[1, ~(+ 2.0 2), 3] #(1.0 4.0 3.0)
+ ^#J{~(join "abc" "def") : "ghi"} #J{"abcdef":"ghi"}
+ #J^{~(join "abc" "def") : "ghi"} #H(() ("abcdef" "ghi")))
+
+;; get-json
+(mtest
+ (get-json "0") 0.0
+ (get-json "\"abc\"") "abc"
+ (get-json "true") t
+ (get-json "false") nil
+ (get-json "null") null)
+
+(test
+ (tojson #(1.0 "abc" t)) "[1,\"abc\",true]")
+
+(mtest
+ (get-jsons "") nil
+ (get-jsons "true") (t)
+ (get-jsons "1 1 [2] {3:4}") (1.0 1.0 #(2.0) #H(() (3.0 4.0))))
+
+(mtest
+ (with-out-string-stream (s) (put-json nil s)) "false"
+ (with-out-string-stream (s) (put-jsons nil s)) ""
+ (with-out-string-stream (s) (put-jsons '(1.0 t nil) s)) "1\ntrue\nfalse\n")
+
+(with-temp-file (name s "json")
+ (mtest
+ (file-put-json name #(1.0 2.0 3.0)) t
+ (file-get-string name) "[1,2,3]\n"
+ (file-get-json name) #(1.0 2.0 3.0)
+ (file-append-json name #H(() ("a" t))) t
+ (file-get-string name) "[1,2,3]\n{\"a\":true}\n"
+ (file-get-jsons name) (#(1.0 2.0 3.0)
+ #H(() ("a" t)))
+ (file-put-jsons name '(1.0 t null)) t
+ (file-get-jsons name) (1.0 t null)
+ (file-get-string name) "1\ntrue\nnull\n"
+ (command-put-json `cat > @name` #(#() #())) t
+ (file-get-string name) "[[],[]]\n")
+ (command-get-json `cat @name`) #(#() #())
+ (command-put-jsons `cat > @name` '(#() 1.0 nil)) t
+ (file-get-string name) "[]\n1\nfalse\n"
+ (command-get-jsons `cat @name`) '(#() 1.0 nil))