blob: e5711a6ac694137694985847fbfad73f369f5159 [file] [log] [blame]
-- Additional path that may be required
require("json")
local io = require("io")
local os = require("os")
require("lfs")
local success = true
local function getFileData(fileName)
local f = io.open(fileName, 'rb')
if not f then return end
local data = f:read('*a')
f:close()
return data
end
local function putTempData(data)
local name = os.tmpname()
local f = assert(io.open(name, 'wb'))
f:write(data)
f:close()
return name
end
-- Ensure that the encoder/decoder can round-trip valid JSON
local function RoundTripTest(parseFunc, encodeFunc, jsonData, luaData, fullRoundTrip, failRoundTrip)
local success, dataString = pcall(encodeFunc, luaData)
if failRoundTrip then
assert(not success, "Round trip encoding test result not as expected")
return true
else
assert(success, "Couldn't encode the lua data..." .. tostring(dataString))
end
local success, result = pcall(parseFunc, dataString)
if not success then
print("Could not parse the generated JSON of (", luaData)
print("GENERATED: [[" .. dataString .. "]]")
print("DATA STORED IN: ", putTempData(dataString))
return
end
if fullRoundTrip then
-- Ensure that whitespace is trimmed off ends
dataString = dataString:match("^[%s]*(.-)[%s]*$")
jsonData = jsonData:match("^[%s]*(.-)[%s]*$")
if dataString ~= jsonData then
print("Encoded values do not match")
print("ORIGINAL: << " .. jsonData .. " >>")
print("RE-ENCOD: << " .. dataString .. " >>")
return
end
end
return true
end
local function testFile(fileName, parseFunc, encodeFunc, expectSuccess, fullRoundTrip, failRoundTrip)
local data = getFileData(fileName)
if not data then return end
io.write(".")
local succeed, result = pcall(parseFunc, data)
if expectSuccess ~= succeed then
print("Wrongly " .. (expectSuccess and "Failed" or "Succeeded") .. " on : " .. fileName .. "(" .. tostring(result) .. ")")
success = false
elseif succeed then
if not RoundTripTest(parseFunc, encodeFunc, data, result, fullRoundTrip, failRoundTrip) then
print("FAILED TO ROUND TRIP: " .. fileName)
success = false
end
end
end
local function testDirectories(parseFunc, encodeFunc, directories, ...)
if not directories then return end
for _,directory in ipairs(directories) do
if lfs.attributes(directory, 'mode') == 'directory' then
for f in lfs.dir(directory) do
testFile(directory .. "/" .. f, parseFunc, encodeFunc, ...)
end
end
end
io.write("\n")
end
local function TestParser(parseFunc, encodeFunc, successNames, failNames, roundTripNames)
testDirectories(parseFunc, encodeFunc, successNames, true, false)
testDirectories(parseFunc, encodeFunc, failNames, false, false)
testDirectories(parseFunc, encodeFunc, roundTripNames, true, true)
end
print("Testing lax/fast mode:")
TestParser(json.decode.getDecoder(), json.encode.getEncoder(), {"test/pass","test/fail_strict"}, {"test/fail_all"},{"test/roundtrip","test/roundtrip_lax"})
print("Testing (mostly) strict mode:")
local strict = json.util.merge({}, json.decode.strict, {
number = {
nan = false,
inf = true,
strict = true
}
})
local strict_encode = json.util.merge({}, json.encode.strict, {
number = {
nan = false,
inf = true,
strict = true
}
})
TestParser(json.decode.getDecoder(strict), json.encode.getEncoder(strict_encode), {"test/pass"}, {"test/fail_strict","test/fail_all"}, {"test/roundtrip"})
print("Testing (mostly) strict encoder with non-strict decodings")
testDirectories(json.decode.getDecoder(), json.encode.getEncoder(json.encode.strict), {"test/fail_strict_encode"}, true, true, true)
if not success then
os.exit(1)
end