spec/util_serialization_spec.lua
author Kim Alvefur <zash@zash.se>
Thu, 28 Mar 2024 15:39:59 +0100
changeset 13473 f9171624fd03
parent 9570 dbfa286cfa88
permissions -rw-r--r--
MUC: Fix legacy hats (thanks nicoco) Why do we not have tests for this?
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local serialization = require "util.serialization";
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
describe("util.serialization", function ()
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
	describe("serialize", function ()
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
		it("makes a string", function ()
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
			assert.is_string(serialization.serialize({}));
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
			assert.is_string(serialization.serialize(nil));
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
			assert.is_string(serialization.serialize(1));
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
			assert.is_string(serialization.serialize(true));
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
		end);
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
9483
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    12
		it("rejects function by default", function ()
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    13
			assert.has_error(function ()
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    14
				serialization.serialize(function () end)
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    15
			end);
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    16
		end);
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    17
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    18
		it("makes a string in debug mode", function ()
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    19
			assert.is_string(serialization.serialize(function () end, "debug"));
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    20
		end);
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    21
9484
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    22
		it("rejects cycles", function ()
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    23
			assert.has_error(function ()
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    24
				local t = {}
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    25
				t[t] = { t };
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    26
				serialization.serialize(t)
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    27
			end);
9570
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    28
			-- also with multirefs allowed
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    29
			assert.has_error(function ()
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    30
				local t = {}
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    31
				t[t] = { t };
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    32
				serialization.serialize(t, { multirefs = true })
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    33
			end);
9484
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    34
		end);
9483
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    35
9569
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    36
		it("rejects multiple references to same table", function ()
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    37
			assert.has_error(function ()
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    38
				local t1 = {};
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    39
				local t2 = { t1, t1 };
9570
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    40
				serialization.serialize(t2, { multirefs = false });
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    41
			end);
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    42
		end);
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    43
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    44
		it("optionally allows multiple references to same table", function ()
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    45
			assert.has_error(function ()
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    46
				local t1 = {};
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    47
				local t2 = { t1, t1 };
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    48
				serialization.serialize(t2, { multirefs = true });
9569
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    49
			end);
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    50
		end);
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    51
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
		it("roundtrips", function ()
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
			local function test(data)
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
				local serialized = serialization.serialize(data);
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
				assert.is_string(serialized);
9346
e767da06399d util.serialization: Use deserialize instead of envload directly
Kim Alvefur <zash@zash.se>
parents: 9345
diff changeset
    56
				local deserialized, err = serialization.deserialize(serialized);
e767da06399d util.serialization: Use deserialize instead of envload directly
Kim Alvefur <zash@zash.se>
parents: 9345
diff changeset
    57
				assert.same(data, deserialized, err);
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
			end
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
			test({});
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
			test({hello="world"});
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
			test("foobar")
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
			test("\0\1\2\3");
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
			test("nödåtgärd");
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
			test({1,2,3,4});
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
			test({foo={[100]={{"bar"},{baz=1}}}});
9485
8791bfa3984a util.serialization: Test table keys that are Lua keywords
Kim Alvefur <zash@zash.se>
parents: 9484
diff changeset
    67
			test({["goto"] = {["function"]={["do"]="keywords"}}});
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
		end);
9488
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    69
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    70
		it("can serialize with metatables", function ()
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    71
			local s = serialization.new({ freeze = true });
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    72
			local t = setmetatable({ a = "hi" }, { __freeze = function (t) return { t.a } end });
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    73
			local rt = serialization.deserialize(s(t));
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    74
			assert.same({"hi"}, rt);
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    75
		end);
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    76
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
	end);
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
end);
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79