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 }
112 local decoder
= json
.decode
.getDecoder(strict
)
113 assert(decoder("call(1)").name
== 'call')
116 function test_not_defined_fail()
117 local decoder
= json
.decode
.getDecoder({
119 allowUndefined
= false
122 assert_error(function()
127 function test_not_defined_succeed()
128 local decoder
= json
.decode
.getDecoder({
130 allowUndefined
= true
133 assert(decoder("call(1)").name
== 'call')
136 -- Test for a name that is not a string
137 function test_name_not_string()
139 true, false, 0/0, 1/0, -1/0, 0, 1, {}, function() end, coroutine
.create(function() end)
141 for _
, v
in ipairs(notString
) do
142 assert_error(function()
147 calls
= { defs
= defs
}
149 json
.decode
.getDecoder(strict
)
154 -- Test for a name that is a string or a pattern
155 function test_name_matches_string_or_pattern()
156 local matchedValues
= {
157 ["mystring"] = "mystring",
158 [lpeg
.C(lpeg
.P("m") * (lpeg
.P("y") + lpeg
.P("Y")) * "string")] = "mystring",
159 [lpeg
.C(lpeg
.P("m") * (lpeg
.P("y") + lpeg
.P("Y")) * "string")] = "mYstring"
161 for pattern
, value
in pairs(matchedValues
) do
162 local matched
= false
163 local function mustBeCalled(capturedName
, ...)
164 assert_equal(value
, capturedName
)
170 [pattern
] = mustBeCalled
173 json
.decode
.getDecoder(strict
)(value
.. "(true)")
174 assert_true(matched
, "Value <" .. value
.. "> did not match the given pattern")