@@ -9,16 +9,26 @@ function TestJson(t)
99
1010 local result , err = json .decode (jsonStringWithNull )
1111 t :Run (" decode" , function (t )
12- if err then error (err ) end
13- if result [" a" ][" b" ] ~= 1 then error (" must be decode" ) end
14- if result [" a" ][" c" ] ~= nil then error (" c is not nil" ) end
12+ if err then
13+ error (err )
14+ end
15+ if result [" a" ][" b" ] ~= 1 then
16+ error (" must be decode" )
17+ end
18+ if result [" a" ][" c" ] ~= nil then
19+ error (" c is not nil" )
20+ end
1521 print (" done: json.decode()" )
1622 end )
1723
1824 local result , err = json .encode (result )
1925 t :Run (" encode omits null values" , function (t )
20- if err then error (err ) end
21- if result ~= jsonString then error (" must be encode " .. inspect (result )) end
26+ if err then
27+ error (err )
28+ end
29+ if result ~= jsonString then
30+ error (" must be encode " .. inspect (result ))
31+ end
2232 print (" done: json.encode()" )
2333 end )
2434end
@@ -29,7 +39,7 @@ function TestEncoder(t)
2939 writer , err = io.open (temp_file , ' w' )
3040 assert (not err , err )
3141 encoder = json .new_encoder (writer )
32- err = encoder :encode ({foo = " bar" , bar = " baz" })
42+ err = encoder :encode ({ foo = " bar" , bar = " baz" })
3343 assert (not err , err )
3444 writer :close ()
3545
4454function TestEncoderWithStringsBuffer (t )
4555 builder = strings .new_builder ()
4656 encoder = json .new_encoder (builder )
47- err = encoder :encode ({abc = " def" , num = 123 , arr = { 1 , 2 , 3 } })
57+ err = encoder :encode ({ abc = " def" , num = 123 , arr = { 1 , 2 , 3 } })
4858 s = strings .trim_suffix (builder :string (), " \n " )
4959 expected = [[ {"abc":"def","arr":[1,2,3],"num":123}]]
5060 assert (s == expected , string.format ([[ '%s' ~= '%s']] , expected , s ))
@@ -54,7 +64,7 @@ function TestEncoderWithPrettyPrinting(t)
5464 builder = strings .new_builder ()
5565 encoder = json .new_encoder (builder )
5666 encoder :set_indent (' ' , " " )
57- err = encoder :encode ({abc = " def" , num = 123 , arr = { 1 , 2 , 3 } })
67+ err = encoder :encode ({ abc = " def" , num = 123 , arr = { 1 , 2 , 3 } })
5868 s = strings .trim_suffix (builder :string (), " \n " )
5969 expected = [[ {
6070 "abc": "def",
@@ -118,13 +128,58 @@ end
118128function TestEncoder_writing_twice (t )
119129 writer = strings .new_builder ()
120130 encoder = json .new_encoder (writer )
121- err = encoder :encode ({abc = " def" })
131+ err = encoder :encode ({ abc = " def" })
122132 assert (not err , err )
123- err = encoder :encode ({num = 123 })
133+ err = encoder :encode ({ num = 123 })
124134 assert (not err , err )
125135 s = writer :string ()
126136 expected = [[ {"abc":"def"}
127137{"num":123}
128138]]
129139 assert (s == expected , string.format ([[ '%s' ~= '%s']] , s , expected ))
130140end
141+
142+ function TestEncodeDecodeEmpty (t )
143+ tests = {
144+ {
145+ name = [[ "{} should re-encode to {}"]] ,
146+ input = ' {}'
147+ },
148+ {
149+ name = [[ "[] should re-encode to []"]] ,
150+ input = ' []'
151+ },
152+ {
153+ name = [[ "object with both {} and [] should re-encode to properly"]] ,
154+ input = [[ {"emptyArr":[],"emptyObj":{},"s":"foo bar baz"}]]
155+ },
156+ }
157+ for _ , tt in ipairs (tests ) do
158+ t :Run (tt .name , function (t )
159+ t :Logf (" input: %s" , tt .input )
160+ local decoded = json .decode (tt .input )
161+ t :Logf (" decoded: %s" , inspect (decoded ))
162+ local encoded , err = json .encode (decoded )
163+ t :Logf (" encoded: %s, err = %s" , encoded , tostring (err ))
164+ assert (not err , err )
165+ assert (encoded == tt .input , string.format (" expected %s; got %s" , tt .input , encoded ))
166+ end )
167+ end
168+ end
169+
170+ function TestTableIsObject (t )
171+ t :Run (" empty table is []" , function (t )
172+ local table = {}
173+ local encoded , err = json .encode (table )
174+ assert (not err , err )
175+ assert (encoded == " []" , string.format (" expected []; got %s" , encoded ))
176+ end )
177+
178+ t :Run (" empty table marked as object is {}" , function (t )
179+ local table = {}
180+ json .tableIsObject (table )
181+ local encoded , err = json .encode (table )
182+ assert (not err , err )
183+ assert (encoded == " {}" , string.format (" expected {}; got %s" , encoded ))
184+ end )
185+ end
0 commit comments