prosody/spec/util_serialization_spec.lua

79 lines
2.1 KiB
Lua

local serialization = require "util.serialization";
describe("util.serialization", function ()
describe("serialize", function ()
it("makes a string", function ()
assert.is_string(serialization.serialize({}));
assert.is_string(serialization.serialize(nil));
assert.is_string(serialization.serialize(1));
assert.is_string(serialization.serialize(true));
end);
it("rejects function by default", function ()
assert.has_error(function ()
serialization.serialize(function () end)
end);
end);
it("makes a string in debug mode", function ()
assert.is_string(serialization.serialize(function () end, "debug"));
end);
it("rejects cycles", function ()
assert.has_error(function ()
local t = {}
t[t] = { t };
serialization.serialize(t)
end);
-- also with multirefs allowed
assert.has_error(function ()
local t = {}
t[t] = { t };
serialization.serialize(t, { multirefs = true })
end);
end);
it("rejects multiple references to same table", function ()
assert.has_error(function ()
local t1 = {};
local t2 = { t1, t1 };
serialization.serialize(t2, { multirefs = false });
end);
end);
it("optionally allows multiple references to same table", function ()
assert.has_error(function ()
local t1 = {};
local t2 = { t1, t1 };
serialization.serialize(t2, { multirefs = true });
end);
end);
it("roundtrips", function ()
local function test(data)
local serialized = serialization.serialize(data);
assert.is_string(serialized);
local deserialized, err = serialization.deserialize(serialized);
assert.same(data, deserialized, err);
end
test({});
test({hello="world"});
test("foobar")
test("\0\1\2\3");
test("nödåtgärd");
test({1,2,3,4});
test({foo={[100]={{"bar"},{baz=1}}}});
test({["goto"] = {["function"]={["do"]="keywords"}}});
end);
it("can serialize with metatables", function ()
local s = serialization.new({ freeze = true });
local t = setmetatable({ a = "hi" }, { __freeze = function (t) return { t.a } end });
local rt = serialization.deserialize(s(t));
assert.same({"hi"}, rt);
end);
end);
end);