1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
13-- 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)
|