aboutsummaryrefslogtreecommitdiff
path: root/serialize_lib/tests/serialize_spec.lua
diff options
context:
space:
mode:
authorGabriel Pérez-Cerezo <gabriel@gpcf.eu>2021-01-31 11:53:31 +0100
committerGabriel Pérez-Cerezo <gabriel@gpcf.eu>2021-01-31 11:53:31 +0100
commitd8d1d27ccb622dfc8e80eb5eb44e6020a1655389 (patch)
treefe5ebb978abc2b55d6ebf3567b1c4b72135d3800 /serialize_lib/tests/serialize_spec.lua
parentef21e70479d31973e47988a2246870ddc429226a (diff)
downloadadvtrains-d8d1d27ccb622dfc8e80eb5eb44e6020a1655389.tar.gz
advtrains-d8d1d27ccb622dfc8e80eb5eb44e6020a1655389.tar.bz2
advtrains-d8d1d27ccb622dfc8e80eb5eb44e6020a1655389.zip
add unit tests for serialize_lib
Diffstat (limited to 'serialize_lib/tests/serialize_spec.lua')
-rw-r--r--serialize_lib/tests/serialize_spec.lua123
1 files changed, 123 insertions, 0 deletions
diff --git a/serialize_lib/tests/serialize_spec.lua b/serialize_lib/tests/serialize_spec.lua
new file mode 100644
index 0000000..ccc3a67
--- /dev/null
+++ b/serialize_lib/tests/serialize_spec.lua
@@ -0,0 +1,123 @@
+-- test the serialization function
+
+
+package.path = "../?.lua;" .. package.path
+
+
+ser = require("serialize")
+
+
+local mock_file = {}
+_G.mock_file = mock_file
+function mock_file:read(arg)
+ if arg == "*l" then
+ local l = self.lines[self.pointer or 1]
+ self.pointer = (self.pointer or 1) + 1
+ return l
+ end
+end
+
+function mock_file:close()
+ return nil
+end
+
+function mock_file:write(text)
+ self.content = self.content..text
+end
+
+function mock_file:create(lines)
+ local f = {}
+ setmetatable(f, mock_file)
+ f.lines = lines or {}
+ f.write = self.write
+ f.close = self.close
+ f.read = self.read
+ f.content = ""
+ return f
+end
+
+
+local testtable = {
+ key = "value",
+ [1] = "eins",
+ [true] = {
+ a = "b",
+ c = false,
+ },
+ ["es:cape1"] = "foo:bar",
+ ["es&ca\npe2"] = "baz&bam\nbim",
+ ["es&&ca&\npe3"] = "baz&&bam&\nbim",
+ ["es&:cape4"] = "foo\n:bar"
+}
+local testser = [[LUA_SER v=1
+B1:T
+Sa:Sb
+Sc:B0
+E
+Skey:Svalue
+Ses&&&&ca&&&npe3:Sbaz&&&&bam&&&nbim
+N1:Seins
+Ses&&&:cape4:Sfoo&n&:bar
+Ses&&ca&npe2:Sbaz&&bam&nbim
+Ses&:cape1:Sfoo&:bar
+E
+END_SER
+]]
+
+local function check_write(tb, conf)
+ f = mock_file:create()
+ ser.write_to_fd(tb, f, conf or {})
+ return f.content
+end
+
+function string:split()
+ local fields = {}
+ self:gsub("[^\n]+", function(c) fields[#fields+1] = c end)
+ return fields
+end
+
+local function check_read(text)
+ f = mock_file:create(text:split())
+ return ser.read_from_fd(f)
+end
+
+local noskip = [[LUA_SER v=1
+N1:T
+E
+E
+END_SER
+]]
+local skip = [[LUA_SER v=1
+E
+END_SER
+]]
+
+describe("write_to_fd", function()
+ it("serializes a table correctly", function()
+ assert.equals(check_write(testtable), testser)
+ end)
+ it("does not skip empty tables", function()
+ assert.equals(check_write({{}}),noskip)
+ end)
+ it("skips empty tables when needed", function()
+
+ assert.equals(check_write({{}},{skip_empty_tables=true}),skip)
+ end)
+end)
+
+describe("read_from_fd", function ()
+ it("reads a table correctly", function()
+ assert.same(check_read(testser),testtable)
+ end)
+ it("handles some edge cases correctly", function()
+ assert.same(check_read(noskip), {{}})
+ assert.same(check_read(skip), {})
+ end)
+ it("Read back table", function()
+ local tb = {}
+ for k=1,262 do
+ tb[k] = { "Foo", "bar", k}
+ end
+ assert.same(check_read(check_write(tb)), tb)
+ end)
+end)