File

spec/util_serialization_spec.lua @ 11762:54530085dffe

net.server: Fall back to default backend from libevent instead of always select Fixes that selecting libevent when unavaibalbe would fall back to select instead of epoll, even if that's available. This way, we only have to update it in once place when choosing a new default.
author Kim Alvefur <zash@zash.se>
date Fri, 03 Sep 2021 17:35:34 +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);