prosody/spec/util_json_spec.lua
Kim Alvefur f38173be79 util.json: Test util.array integration
This is to expose how [] == json.null due to a change in Lua 5.3 with
how the equality metamethod is chosen.
2020-01-15 21:14:06 +01:00

80 lines
2.1 KiB
Lua

local json = require "util.json";
local array = require "util.array";
describe("util.json", function()
describe("#encode()", function()
it("should work", function()
local function test(f, j, e)
if e then
assert.are.equal(f(j), e);
end
assert.are.equal(f(j), f(json.decode(f(j))));
end
test(json.encode, json.null, "null")
test(json.encode, {}, "{}")
test(json.encode, {a=1});
test(json.encode, {a={1,2,3}});
test(json.encode, {1}, "[1]");
end);
end);
describe("#decode()", function()
it("should work", function()
local empty_array = json.decode("[]");
assert.are.equal(type(empty_array), "table");
assert.are.equal(#empty_array, 0);
assert.are.equal(next(empty_array), nil);
end);
end);
describe("testcases", function()
local valid_data = {};
local invalid_data = {};
local skip = "fail1.json fail9.json fail18.json fail15.json fail13.json fail25.json fail26.json fail27.json fail28.json fail17.json pass1.json";
setup(function()
local lfs = require "lfs";
local path = "spec/json";
for name in lfs.dir(path) do
if name:match("%.json$") then
local f = assert(io.open(path.."/"..name));
local content = assert(f:read("*a"));
assert(f:close());
if skip:find(name) then --luacheck: ignore 542
-- Skip
elseif name:match("^pass") then
valid_data[name] = content;
elseif name:match("^fail") then
invalid_data[name] = content;
end
end
end
end)
it("should pass valid testcases", function()
for name, content in pairs(valid_data) do
local parsed, err = json.decode(content);
assert(parsed, name..": "..tostring(err));
end
end);
it("should fail invalid testcases", function()
for name, content in pairs(invalid_data) do
local parsed, err = json.decode(content);
assert(not parsed, name..": "..tostring(err));
end
end);
end)
describe("util.array integration", function ()
it("works", function ()
assert.equal("[]", json.encode(array()));
assert.equal("[1,2,3]", json.encode(array({1,2,3})));
assert.equal(getmetatable(array()), getmetatable(json.decode("[]")));
end);
end);
end);