| -- 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 |