File

spec/util_serialization_spec.lua @ 11804:22825cb5dcd8

net.server_epoll: Don't immediately destroy upon getting closed on read Instead try to write any remaining buffered data. If the write attempt also fails with "closed" then there's nothing we can do and the socket is gone. This reverts what appears to be a mistakenly included part of c8aa66595072 Thanks jonas’ for noticing
author Kim Alvefur <zash@zash.se>
date Wed, 15 Sep 2021 18:39:37 +0200
parent 9567:dbfa286cfa88
line wrap: on
line source

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);