util.roles: Return nil if the role has no explicit policy (fixes inheritance)
Previously, if the first inherited role had no opinion, it returned false and
prevented further consultation of other inherited roles.
This bug was found thanks to the implementation of missing test cases
identified through mutation testing.
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);