| 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() |