cosmopolitan/test/tool/net/encodejson_test.lua
2022-08-31 07:53:57 -05:00

164 lines
5.8 KiB
Lua

-- Copyright 2022 Justine Alexandra Roberts Tunney
--
-- Permission to use, copy, modify, and/or distribute this software for
-- any purpose with or without fee is hereby granted, provided that the
-- above copyright notice and this permission notice appear in all copies.
--
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
-- WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
-- WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
-- AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-- PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-- TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-- PERFORMANCE OF THIS SOFTWARE.
assert(unix.pledge("stdio"))
assert(EncodeJson(nil) == "null")
assert(EncodeJson(true) == "true")
assert(EncodeJson(false) == "false")
assert(EncodeJson(0) == "0")
assert(EncodeJson(0.0) == "0")
assert(EncodeJson(3.14) == "3.14")
assert(EncodeJson(0/0) == "null")
assert(EncodeJson(math.huge) == "null")
assert(EncodeJson(123.456e-789) == '0')
assert(EncodeJson(9223372036854775807) == '9223372036854775807')
assert(EncodeJson(-9223372036854775807 - 1) == '-9223372036854775808')
assert(EncodeJson({2, 1}) == "[2,1]")
assert(EncodeJson({3, 2}) == "[3,2]")
assert(EncodeJson({[0]=false}) == "[]")
assert(EncodeJson({[1]=123, [2]=456}) == "[123,456]")
assert(EncodeJson({[1]=123, [3]=456}) == "[123]")
assert(EncodeJson({["hi"]=1, [1]=2}) == "[2]")
assert(EncodeJson({[1]=2, ["hi"]=1}) == "[2]")
assert(EncodeJson({[3]=3, [1]=3}) == "[3]")
assert(EncodeJson("hello") == "\"hello\"")
assert(EncodeJson("\x00") == "\"\\u0000\"")
assert(EncodeJson("\t") == "\"\\t\"")
assert(EncodeJson("") == "\"\\u2192\"")
assert(EncodeJson("𐌰") == "\"\\ud800\\udf30\"")
assert(EncodeJson("\t") == [["\t"]])
assert(EncodeJson("\r") == [["\r"]])
assert(EncodeJson("\n") == [["\n"]])
assert(EncodeJson("\f") == [["\f"]])
assert(EncodeJson("\"") == [["\""]])
assert(EncodeJson("\'") == [["\u0027"]])
assert(EncodeJson("\\") == [["\\"]])
assert(EncodeJson(
{yo=2,
bye={yo=2,
dawg=3},
there={yo=2},
sup={yo=2},
hi="hello"},
{pretty=true}) ==
"{\n"..
" \"bye\": {\n"..
" \"dawg\": 3,\n"..
" \"yo\": 2\n"..
" },\n"..
" \"hi\": \"hello\",\n"..
" \"sup\": {\"yo\": 2},\n"..
" \"there\": {\"yo\": 2},\n"..
" \"yo\": 2\n"..
"}")
assert(EncodeJson(
{yo=2, bye=1, there=10, sup=3, hi="hello"},
{pretty=true, indent=" "}) ==
"{\n"..
" \"bye\": 1,\n"..
" \"hi\": \"hello\",\n"..
" \"sup\": 3,\n"..
" \"there\": 10,\n"..
" \"yo\": 2\n"..
"}")
val, err = EncodeJson({[3]=3, [2]=3})
assert(val == nil)
assert(err == 'json objects must only use string keys')
val, err = EncodeJson({[{[{[3]=2}]=2}]=2})
assert(val == nil)
assert(err == 'json objects must only use string keys')
val, err = EncodeJson(EncodeJson)
assert(val == nil)
assert(err == "unsupported lua type")
x = {2, 1}
x[3] = x
val, err = EncodeJson(x)
assert(val == nil)
assert(err == "won't serialize cyclic lua table")
x = {}
x.c = 'c'
x.a = 'a'
x.b = 'b'
assert(EncodeJson(x) == '{"a":"a","b":"b","c":"c"}')
assert(EncodeJson(0, {maxdepth=1}))
val, err = EncodeJson(0, {maxdepth=0})
assert(val == nil)
assert(err == 'table has great depth')
assert(EncodeJson({{{{{{{{{{{},{{{{},{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, {maxdepth=64}) ==
'[[[[[[[[[[{},[[[{},[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[{}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]')
val, err = EncodeJson({{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}})
assert(val == nil)
assert(err == 'table has great depth')
-- 63 objects
assert(EncodeJson(
{k={k={k={k={k={k={k={k={k={k={k={k={k={k=
{k={k={k={k={k={k={k={k={k={k={k={k={k={k={k=
{k={k={k={k={k={k={k={k={k={k={k={k={k={k={k=
{k={k={k={k={k={k={k={k={k={k={k={k={k={k={k=
{k={k={k={k=0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, {maxdepth=64}) ==
"{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":"..
"{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":"..
"{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":"..
"{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":{\"k\":0}}"..
"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}"..
"}}}}}}}}}}}}}")
-- 64 objects
res, err = EncodeJson(
{k={k={k={k={k={k={k={k={k={k={k={k={k={k={k=
{k={k={k={k={k={k={k={k={k={k={k={k={k={k={k=
{k={k={k={k={k={k={k={k={k={k={k={k={k={k={k=
{k={k={k={k={k={k={k={k={k={k={k={k={k={k={k=
{k={k={k={k=0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, {maxdepth=64})
assert(res == nil)
assert(err == "table has great depth")
--------------------------------------------------------------------------------
-- benchmark nanos ticks
-- JsonEncArray 366 1134
-- JsonEncUnsort 754 2336
-- JsonEncObject 1208 3742
function JsonEncArray()
EncodeJson({2, 1, 10, 3, "hello"})
end
function JsonEncObject()
EncodeJson({yo=2, bye=1, there=10, sup=3, hi="hello"})
end
UNSORT = {sorted=false}
function JsonEncUnsort()
EncodeJson({yo=2, bye=1, there=10, sup=3, hi="hello"}, UNSORT)
end
function bench()
print("JsonEncArray", Benchmark(JsonEncArray))
print("JsonEncUnsort", Benchmark(JsonEncUnsort))
print("JsonEncObject", Benchmark(JsonEncObject))
end