test/event_buffer-tests.lua

1
require("luaevent.core")
2
local buffer = luaevent.core.buffer
3
 
4
require("lunit")
5
 
6
lunit.import("all")
7
 
8
bufferTests = TestCase("bufferTests")
9
 
10
function bufferTests:setup()
11
	self.buffer = buffer.new()
12
	self.buffer2 = buffer.new()
13
end
14
 
15
function bufferTests:teardown()
16
	self.buffer:close()
17
	self.buffer2:close()
18
end
19
 
20
local function testDataEqual(expected, actual, msg)
21
	msg = msg or ''
22
	assert_equal(expected, actual:get_data(), "Buffer not the same: " .. msg)
23
	assert_equal(#expected, actual:length(), "Buffer length not the same: " .. msg)
24
	assert_equal(expected, tostring(actual), "Buffer (from tostring) not the same: " .. msg)
25
	assert_equal(#expected, #actual, "Buffer length (from #) not zero: " .. msg)
26
end
27
 
28
function bufferTests:test_empty()
29
	testDataEqual("", self.buffer, "Buffer not empty")
30
	testDataEqual("", self.buffer2, "Buffer2 not empty")
31
end
32
 
33
function bufferTests:test_addSimpleString()
34
	self.buffer:add("Hello")
35
	testDataEqual("Hello", self.buffer)
36
	self.buffer:add("Hello")
37
	testDataEqual("HelloHello", self.buffer)
38
end
39
 
40
function bufferTests:test_addMultipleStrings()
41
	self.buffer:add("Hello", "Hello")
42
	testDataEqual("HelloHello", self.buffer)
43
end
44
 
45
function bufferTests:test_addDigits()
46
	self.buffer:add(1,2,3,4)
47
	testDataEqual("1234", self.buffer)
48
	self.buffer:add(100)
49
	testDataEqual("1234100", self.buffer)
50
	self.buffer:add(1.1)
51
	testDataEqual("12341001.1", self.buffer)
52
end
53
 
54
function bufferTests:test_addBuffer()
55
	self.buffer:add(self.buffer2)
56
	testDataEqual("", self.buffer)
57
	testDataEqual("", self.buffer2)
58
	self.buffer2:add("Hello")
59
	testDataEqual("Hello", self.buffer2)
60
	self.buffer:add(self.buffer2)
61
	testDataEqual("Hello", self.buffer)
62
	testDataEqual("", self.buffer2)
63
	assert_error("Cannot self-add buffers", function()
64
		self.buffer:add(self.buffer)
65
	end)
66
	assert_error("Cannot self-add buffers", function()
67
		self.buffer2:add(self.buffer2)
68
	end)
69
	testDataEqual("Hello", self.buffer, "Failures should not affect data content")
70
	testDataEqual("", self.buffer2, "Failures should not affect data content")
71
end
72
 
73
function bufferTests:test_addBadValues_fail()
74
	assert_error("Should not be able to add no values", function()
75
		self.buffer:add()
76
	end)
77
	assert_error("Should not be able to add boolean true", function()
78
		self.buffer:add(true)
79
	end)
80
	assert_error("Should not be able to add boolean false", function()
81
		self.buffer:add(false)
82
	end)
83
	assert_error("Should not be able to add functions", function()
84
		self.buffer:add(function() end)
85
	end)
86
	assert_error("Should not be able to add threads", function()
87
		self.buffer:add(coroutine.create(function() end))
88
	end)
89
	assert_error("Should not be able to add non-buffer userdata", function()
90
		self.buffer:add(newproxy())
91
	end)
92
	assert_error("Should not be able to add nil values", function()
93
		self.buffer:add(nil)
94
	end)
95
	assert_error("Multiples including valid values should not affect failure results", function()
96
		self.buffer:add("Hello", 1, bufferb, true, false, function() end, newproxy(), nil)
97
	end)
98
	testDataEqual("", self.buffer, "Buffer not empty after failing additions")
99
end
100
 
101
function bufferTests:test_drain()
102
	self.buffer:add("123456789")
103
	testDataEqual("123456789", self.buffer)
104
	assert_error("Cannot call drain w/ no args", function()
105
		self.buffer:drain()
106
	end)
107
	self.buffer:drain(1)
108
	testDataEqual("23456789", self.buffer)
109
	self.buffer:drain(4)
110
	testDataEqual("6789", self.buffer)
111
	assert_pass("Should be able to apply draining beyond actual buffer length", function()
112
		self.buffer:drain(5)
113
	end)
114
	testDataEqual("", self.buffer)
115
	self.buffer:add("123456789")
116
	testDataEqual("123456789", self.buffer)
117
	assert_pass([[Should be able to apply negative draining to cause draining `all data`
118
	(see source comments for why)]], function()
119
		self.buffer:drain(-1)
120
	end)
121
	testDataEqual("", self.buffer)
122
end
123
 
124
function bufferTests:test_getPartial()
125
	self.buffer:add("123456789")
126
	assert_equal("1234", self.buffer:get_data(4))
127
	assert_equal("1234", self.buffer:get_data(1,4))
128
	assert_equal("5678", self.buffer:get_data(5,4))
129
	assert_equal("5", self.buffer:get_data(5,1))
130
	assert_equal("56789", self.buffer:get_data(5,100000000), "Data length is capped at max obtainable")
131
	assert_equal("56789", self.buffer:get_data(5,-100), "Negative sizes capture entire remaining string")
132
	assert_equal("9", self.buffer:get_data(-1, 1, "Negative position causes wraparound"))
133
	assert_equal("89", self.buffer:get_data(-2,2, "Negative wraparound does not cause length inversion"))
134
end
135
 
136
local lineData = [[1
137
2
138
3]]
139
local splitLineData = {
140
	"1","2",nil
141
}
142
local mixedLineData = "1\r2\n3\r\n4\n\r5\r\r6\n\n7\r\n\r8\r\n\r9"
143
local splitMixedLineData = {
144
	"1","2","3","4","5","","6","","7","","8","", nil
145
}
146
function bufferTests:test_readline()
147
	self.buffer:add(lineData)
148
	testDataEqual(lineData, self.buffer)
149
	for _, data in ipairs(splitLineData) do
150
		assert_equal(data, self.buffer:readline())
151
	end
152
	testDataEqual("3", self.buffer, "Failed readline doesn't affect buffer contents")
153
	self.buffer:drain(-1)
154
	testDataEqual("", self.buffer)
155
	self.buffer:add(mixedLineData)
156
	testDataEqual(mixedLineData, self.buffer)
157
	for _, data in ipairs(splitMixedLineData) do
158
		assert_equal(data, self.buffer:readline())
159
	end
160
	testDataEqual("9", self.buffer)
161
end
162
 
163
lunit.run()