File

spec/util_serialization_spec.lua @ 9540:8cdd7fec6aa7

mod_pep: Remove use of recipients table for signaling pending disco#items It stored the caps hash as a string in the recipients table while waiting for a disco#info response, then replaces it with the set of nodes that had +notify. This mixing of types is bad, so here it gets removed. This can be improved once an IQ tracking API (#714) is added.
author Kim Alvefur <zash@zash.se>
date Tue, 23 Oct 2018 22:54:15 +0200
parent 9485:c667887d78ad
child 9566:dad29508d0f2
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);
		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);