172 lines
3.6 KiB
Lua
172 lines
3.6 KiB
Lua
local json = require("json")
|
|
local lunit = require("lunit")
|
|
local math = require("math")
|
|
local testutil = require("testutil")
|
|
|
|
local encode = json.encode
|
|
-- DECODE NOT 'local' due to requirement for testutil to access it
|
|
decode = json.decode.getDecoder(false)
|
|
|
|
module("lunit-calls", lunit.testcase, package.seeall)
|
|
|
|
function setup()
|
|
-- Ensure that the decoder is reset
|
|
_G["decode"] = json.decode.getDecoder(false)
|
|
end
|
|
|
|
local values = {
|
|
0,
|
|
1,
|
|
0.2,
|
|
"Hello",
|
|
true,
|
|
{hi=true},
|
|
{1,2}
|
|
}
|
|
|
|
function test_identity()
|
|
local function testFunction(capturedName, ...)
|
|
assert_equal('call', capturedName)
|
|
return (...)
|
|
end
|
|
local strict = {
|
|
calls = { defs = {
|
|
call = testFunction
|
|
} }
|
|
}
|
|
local decode = json.decode.getDecoder(strict)
|
|
for i, v in ipairs(values) do
|
|
local str = "call(" .. encode(v) .. ")"
|
|
local decoded = decode(str)
|
|
if type(decoded) == 'table' then
|
|
for k2, v2 in pairs(v) do
|
|
assert_equal(v2, decoded[k2])
|
|
decoded[k2] = nil
|
|
end
|
|
assert_nil(next(decoded))
|
|
else
|
|
assert_equal(v, decoded)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Test for a function that throws
|
|
function test_function_failure()
|
|
local function testFunction(...)
|
|
error("CANNOT CONTINUE")
|
|
end
|
|
local strict = {
|
|
calls = { defs = {
|
|
call = testFunction
|
|
} }
|
|
}
|
|
local decode = json.decode.getDecoder(strict)
|
|
for i, v in ipairs(values) do
|
|
local str = "call(" .. encode(v) .. ")"
|
|
assert_error(function()
|
|
decode(str)
|
|
end)
|
|
end
|
|
end
|
|
|
|
-- Test for a function that is not a function
|
|
function test_not_a_function_fail()
|
|
local notFunction = {
|
|
0/0, 1/0, -1/0, 0, 1, "Hello", {}, coroutine.create(function() end)
|
|
}
|
|
for _, v in ipairs(notFunction) do
|
|
assert_error(function()
|
|
local strict = {
|
|
calls = { defs = {
|
|
call = v
|
|
}, allowUndefined = false }
|
|
}
|
|
json.decode.getDecoder(strict)
|
|
end)
|
|
end
|
|
end
|
|
|
|
function test_not_permitted_fail()
|
|
local strict = {
|
|
calls = {
|
|
defs = { call = false }
|
|
}
|
|
}
|
|
local decoder = json.decode.getDecoder(strict)
|
|
assert_error(function()
|
|
decoder("call(1)")
|
|
end)
|
|
end
|
|
|
|
function test_permitted()
|
|
local strict = {
|
|
calls = {
|
|
defs = { call = true }
|
|
}
|
|
}
|
|
local decoder = json.decode.getDecoder(strict)
|
|
assert(decoder("call(1)").name == 'call')
|
|
end
|
|
|
|
function test_not_defined_fail()
|
|
local decoder = json.decode.getDecoder({
|
|
calls = {
|
|
allowUndefined = false
|
|
}
|
|
})
|
|
assert_error(function()
|
|
decoder("call(1)")
|
|
end)
|
|
end
|
|
|
|
function test_not_defined_succeed()
|
|
local decoder = json.decode.getDecoder({
|
|
calls = {
|
|
allowUndefined = true
|
|
}
|
|
})
|
|
assert(decoder("call(1)").name == 'call')
|
|
end
|
|
|
|
-- Test for a name that is not a string
|
|
function test_name_not_string()
|
|
local notString = {
|
|
true, false, 0/0, 1/0, -1/0, 0, 1, {}, function() end, coroutine.create(function() end)
|
|
}
|
|
for _, v in ipairs(notString) do
|
|
assert_error(function()
|
|
local defs = {
|
|
[v] = function() end
|
|
}
|
|
local strict = {
|
|
calls = { defs = defs }
|
|
}
|
|
json.decode.getDecoder(strict)
|
|
end)
|
|
end
|
|
end
|
|
|
|
-- Test for a name that is a string or a pattern
|
|
function test_name_matches_string_or_pattern()
|
|
local matchedValues = {
|
|
["mystring"] = "mystring",
|
|
[lpeg.C(lpeg.P("m") * (lpeg.P("y") + lpeg.P("Y")) * "string")] = "mystring",
|
|
[lpeg.C(lpeg.P("m") * (lpeg.P("y") + lpeg.P("Y")) * "string")] = "mYstring"
|
|
}
|
|
for pattern, value in pairs(matchedValues) do
|
|
local matched = false
|
|
local function mustBeCalled(capturedName, ...)
|
|
assert_equal(value, capturedName)
|
|
matched = true
|
|
end
|
|
matched = false
|
|
local strict = {
|
|
calls = { defs = {
|
|
[pattern] = mustBeCalled
|
|
} }
|
|
}
|
|
json.decode.getDecoder(strict)(value .. "(true)")
|
|
assert_true(matched, "Value <" .. value .. "> did not match the given pattern")
|
|
end
|
|
end
|