diff options
Diffstat (limited to 'spec/util_serialization_spec.lua')
-rw-r--r-- | spec/util_serialization_spec.lua | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/spec/util_serialization_spec.lua b/spec/util_serialization_spec.lua new file mode 100644 index 00000000..2af5d803 --- /dev/null +++ b/spec/util_serialization_spec.lua @@ -0,0 +1,79 @@ +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); + |