1 local lpeg
= require("lpeg")
2 local json
= require("json")
3 local lunit
= require("lunit")
4 local math
= require("math")
5 local testutil
= require("testutil")
7 local encode
= json
.encode
8 -- DECODE NOT 'local' due to requirement for testutil to access it
9 decode
= json
.decode
.getDecoder(false)
12 _ENV
= lunit
.module("lunit-calls", 'seeall')
14 module("lunit-calls", lunit
.testcase
, package
.seeall
)
18 -- Ensure that the decoder is reset
19 _G
["decode"] = json
.decode
.getDecoder(false)
32 function test_identity()
33 local function testFunction(capturedName
, ...)
34 assert_equal('call', capturedName
)
42 local decode
= json
.decode
.getDecoder(strict
)
43 for i
, v
in ipairs(values
) do
44 local str
= "call(" .. encode(v
) .. ")"
45 local decoded
= decode(str
)
46 if type(decoded
) == 'table' then
47 for k2
, v2
in pairs(v
) do
48 assert_equal(v2
, decoded
[k2
])
51 assert_nil(next(decoded
))
53 assert_equal(v
, decoded
)
58 -- Test for a function that throws
59 function test_function_failure()
60 local function testFunction(...)
61 error("CANNOT CONTINUE")
68 local decode
= json
.decode
.getDecoder(strict
)
69 for i
, v
in ipairs(values
) do
70 local str
= "call(" .. encode(v
) .. ")"
71 assert_error(function()
77 -- Test for a function that is not a function
78 function test_not_a_function_fail()
80 0/0, 1/0, -1/0, 0, 1, "Hello", {}, coroutine
.create(function() end)
82 for _
, v
in ipairs(notFunction
) do
83 assert_error(function()
87 }, allowUndefined
= false }
89 json
.decode
.getDecoder(strict
)
94 function test_not_permitted_fail()
97 defs
= { call = false }
100 local decoder
= json
.decode
.getDecoder(strict
)
101 assert_error(function()
106 function test_permitted()
109 defs
= { call = true, other
= true }
112 local decoder
= json
.decode
.getDecoder(strict
)
113 assert(decoder("call(1)").name
== 'call')
114 assert(decoder("other(1)").name
== 'other')
117 function test_permitted_trailing()
120 defs
= { call = true, other
= true }
123 local decoder
= json
.decode
.getDecoder(strict
)
124 assert(decoder("call(1,)").name
== 'call')
125 assert(decoder("other(1,)").name
== 'other')
127 function test_permitted_no_trailing()
130 defs
= { call = true, other
= true },
131 trailingComma
= false
134 local decoder
= json
.decode
.getDecoder(strict
)
135 assert_error(function()
138 assert_error(function()
142 function test_permitted_nested()
145 defs
= { call = true, other
= true }
148 local decoder
= json
.decode
.getDecoder(strict
)
149 assert(decoder("call(call(1))").name
== 'call')
150 assert(decoder("other(call(1))").name
== 'other')
153 function test_not_defined_fail()
154 local decoder
= json
.decode
.getDecoder({
156 allowUndefined
= false
159 assert_error(function()
164 function test_not_defined_succeed()
165 local decoder
= json
.decode
.getDecoder({
167 allowUndefined
= true
170 assert(decoder("call(1)").name
== 'call')
173 -- Test for a name that is not a string
174 function test_name_not_string()
176 true, false, 0/0, 1/0, -1/0, 0, 1, {}, function() end, coroutine
.create(function() end)
178 for _
, v
in ipairs(notString
) do
179 assert_error(function()
184 calls
= { defs
= defs
}
186 json
.decode
.getDecoder(strict
)
191 -- Test for a name that is a string or a pattern
192 function test_name_matches_string_or_pattern()
193 local matchedValues
= {
194 ["mystring"] = "mystring",
195 [lpeg
.C(lpeg
.P("m") * (lpeg
.P("y") + lpeg
.P("Y")) * "string")] = "mystring",
196 [lpeg
.C(lpeg
.P("m") * (lpeg
.P("y") + lpeg
.P("Y")) * "string")] = "mYstring"
198 for pattern
, value
in pairs(matchedValues
) do
199 local matched
= false
200 local function mustBeCalled(capturedName
, ...)
201 assert_equal(value
, capturedName
)
207 [pattern
] = mustBeCalled
210 json
.decode
.getDecoder(strict
)(value
.. "(true)")
211 assert_true(matched
, "Value <" .. value
.. "> did not match the given pattern")