aboutsummaryrefslogtreecommitdiff
path: root/unit_tests/linda_tests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'unit_tests/linda_tests.cpp')
-rw-r--r--unit_tests/linda_tests.cpp160
1 files changed, 84 insertions, 76 deletions
diff --git a/unit_tests/linda_tests.cpp b/unit_tests/linda_tests.cpp
index d956ae2..90630a7 100644
--- a/unit_tests/linda_tests.cpp
+++ b/unit_tests/linda_tests.cpp
@@ -35,7 +35,7 @@ TEST_CASE("linda.single_keeper.creation/close_handler")
35 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; 35 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
36 S.requireSuccess("lanes = require 'lanes'"); 36 S.requireSuccess("lanes = require 'lanes'");
37 37
38 if constexpr (LUA_VERSION_NUM == 504) { 38 if constexpr (LUA_VERSION_NUM >= 504) {
39 // a function is acceptable as a __close handler 39 // a function is acceptable as a __close handler
40 S.requireSuccess("local l <close> = lanes.linda{close_handler = function() end}"); 40 S.requireSuccess("local l <close> = lanes.linda{close_handler = function() end}");
41 // a callable table too (a callable full userdata as well, but I have none here) 41 // a callable table too (a callable full userdata as well, but I have none here)
@@ -109,103 +109,110 @@ TEST_CASE("linda.single_keeper.creation/wake_period")
109 109
110// ################################################################################################# 110// #################################################################################################
111 111
112TEST_CASE("linda.single_keeper.the_rest") 112TEST_CASE("linda.single_keeper.indexing")
113{ 113{
114 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; 114 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
115 S.requireSuccess("lanes = require 'lanes'"); 115 S.requireSuccess("lanes = require 'lanes'.configure()");
116
117 // indexing the linda with an unknown string key should fail
118 S.requireFailure("return lanes.linda().gouikra");
119 // indexing the linda with an unsupported key type should fail
120 S.requireFailure("return lanes.linda()[5]");
121 S.requireFailure("return lanes.linda()[false]");
122 S.requireFailure("return lanes.linda()[{}]");
123 S.requireFailure("return lanes.linda()[function() end]");
124}
116 125
117 // --------------------------------------------------------------------------------------------- 126// #################################################################################################
118 127
119 SECTION("error in close handler is propagated") 128TEST_CASE("linda.single_keeper.send()")
129{
130 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
131 S.requireSuccess("lanes = require 'lanes'.configure()");
132
133 SECTION("timeout")
120 { 134 {
121 // if the function raises an error, we should get it 135 // timeout checks
122 S.requireFailure("local l <close> = lanes.linda{close_handler = function() error 'gluh' end}"); 136 // linda:send() should fail if the timeout is bad
137 S.requireFailure("lanes.linda():send(-1, 'k', 'v')");
138 // any positive value is ok
139 S.requireSuccess("lanes.linda():send(0, 'k', 'v')");
140 S.requireSuccess("lanes.linda():send(1e20, 'k', 'v')");
141 // nil too (same as 'forever')
142 S.requireSuccess("lanes.linda():send(nil, 'k', 'v')");
123 } 143 }
124 144
125 // --------------------------------------------------------------------------------------------- 145 // -----------------------------------------------------------------------------------------
126 146
127 SECTION("Linda indexing") 147 SECTION("fails on bad keys")
128 { 148 {
129 // indexing the linda with an unknown string key should fail 149 // key checks
130 S.requireFailure("return lanes.linda().gouikra"); 150 // linda:send() should fail if the key is unsupported (nil, table, function, full userdata, reserved light userdata)
131 // indexing the linda with an unsupported key type should fail 151 S.requireFailure("lanes.linda():send(0, nil, 'v')");
132 S.requireFailure("return lanes.linda()[5]"); 152 S.requireFailure("lanes.linda():send(0, {}, 'v')");
133 S.requireFailure("return lanes.linda()[false]"); 153 S.requireFailure("lanes.linda():send(0, function() end, 'v')");
134 S.requireFailure("return lanes.linda()[{}]"); 154 S.requireFailure("lanes.linda():send(0, io.stdin, 'v')");
135 S.requireFailure("return lanes.linda()[function() end]"); 155 S.requireFailure("lanes.linda():send(0, lanes.null, 'v')");
156 S.requireFailure("lanes.linda():send(0, lanes.cancel_error, 'v')");
136 } 157 }
137 158
138 // --------------------------------------------------------------------------------------------- 159 // -----------------------------------------------------------------------------------------
139 SECTION("linda:send()") 160
161 SECTION("succeeds on supported keys")
140 { 162 {
141 SECTION("timeout") 163 // supported keys are ok: boolean, number, string, light userdata, deep userdata
142 { 164 S.requireSuccess("lanes.linda():send(0, true, 'v')");
143 // timeout checks 165 S.requireSuccess("lanes.linda():send(0, false, 'v')");
144 // linda:send() should fail if the timeout is bad 166 S.requireSuccess("lanes.linda():send(0, 99, 'v')");
145 S.requireFailure("lanes.linda():send(-1, 'k', 'v')"); 167 S.requireSuccess("local l = lanes.linda(); l:send(0, l:deep(), 'v')");
146 // any positive value is ok 168 }
147 S.requireSuccess("lanes.linda():send(0, 'k', 'v')");
148 S.requireSuccess("lanes.linda():send(1e20, 'k', 'v')");
149 // nil too (same as 'forever')
150 S.requireSuccess("lanes.linda():send(nil, 'k', 'v')");
151 }
152 169
153 // ----------------------------------------------------------------------------------------- 170 // -----------------------------------------------------------------------------------------
154 171
155 SECTION("fails on bad keys") 172 SECTION("succeeds on deep userdata key")
156 { 173 {
157 // key checks 174 S.requireSuccess("local l = lanes.linda(); l:send(0, l, 'v')");
158 // linda:send() should fail if the key is unsupported (nil, table, function, full userdata, reserved light userdata) 175 }
159 S.requireFailure("lanes.linda():send(0, nil, 'v')");
160 S.requireFailure("lanes.linda():send(0, {}, 'v')");
161 S.requireFailure("lanes.linda():send(0, function() end, 'v')");
162 S.requireFailure("lanes.linda():send(0, io.stdin, 'v')");
163 S.requireFailure("lanes.linda():send(0, lanes.null, 'v')");
164 S.requireFailure("lanes.linda():send(0, lanes.cancel_error, 'v')");
165 }
166 176
167 // ----------------------------------------------------------------------------------------- 177 // -----------------------------------------------------------------------------------------
168 178
169 SECTION("succeeds on supported keys") 179 SECTION(". fails")
170 { 180 {
171 // supported keys are ok: boolean, number, string, light userdata, deep userdata 181 // misuse checks, . instead of :
172 S.requireSuccess("lanes.linda():send(0, true, 'v')"); 182 S.requireFailure("lanes.linda().send(nil, 'k', 'v')");
173 S.requireSuccess("lanes.linda():send(0, false, 'v')"); 183 }
174 S.requireSuccess("lanes.linda():send(0, 99, 'v')");
175 S.requireSuccess("local l = lanes.linda(); l:send(0, l:deep(), 'v')");
176 }
177 184
178 // ----------------------------------------------------------------------------------------- 185 // -----------------------------------------------------------------------------------------
179 186
180 SECTION("succeeds on deep userdata key") 187 SECTION("unsupported values fail")
181 { 188 {
182 S.requireSuccess("local l = lanes.linda(); l:send(0, l, 'v')"); 189 // value checks
183 } 190 // linda:send() should fail if we don't send anything
191 S.requireFailure("lanes.linda():send()");
192 S.requireFailure("lanes.linda():send(0)");
193 S.requireFailure("lanes.linda():send(0, 'k')");
194 // or non-deep userdata
195 S.requireFailure("lanes.linda():send(0, 'k', fixture.newuserdata())");
196 // or something with a converter that raises an error (maybe that should go to a dedicated __lanesconvert test!)
197 S.requireFailure("lanes.linda():send(0, 'k', setmetatable({}, {__lanesconvert = function(where_) error (where_ .. ': should not send me' end}))");
198 // but a registered non-deep userdata should work
199 S.requireSuccess("lanes.linda():send(0, 'k', io.stdin)");
200 }
201}
184 202
185 // ----------------------------------------------------------------------------------------- 203// #################################################################################################
186 204
187 SECTION(". fails") 205TEST_CASE("linda.single_keeper.the_rest")
188 { 206{
189 // misuse checks, . instead of : 207 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
190 S.requireFailure("lanes.linda().send(nil, 'k', 'v')"); 208 S.requireSuccess("lanes = require 'lanes'");
191 }
192 209
193 // ----------------------------------------------------------------------------------------- 210 // ---------------------------------------------------------------------------------------------
194 211
195 SECTION("unsupported values fail") 212 SECTION("error in close handler is propagated")
196 { 213 {
197 // value checks 214 // if the function raises an error, we should get it
198 // linda:send() should fail if we don't send anything 215 S.requireFailure("local l <close> = lanes.linda{close_handler = function() error 'gluh' end}");
199 S.requireFailure("lanes.linda():send()");
200 S.requireFailure("lanes.linda():send(0)");
201 S.requireFailure("lanes.linda():send(0, 'k')");
202 // or non-deep userdata
203 S.requireFailure("lanes.linda():send(0, 'k', fixture.newuserdata())");
204 // or something with a converter that raises an error (maybe that should go to a dedicated __lanesconvert test!)
205 S.requireFailure("lanes.linda():send(0, 'k', setmetatable({}, {__lanesconvert = function(where_) error (where_ .. ': should not send me' end}))");
206 // but a registered non-deep userdata should work
207 S.requireSuccess("lanes.linda():send(0, 'k', io.stdin)");
208 }
209 } 216 }
210 217
211 // --------------------------------------------------------------------------------------------- 218 // ---------------------------------------------------------------------------------------------
@@ -390,6 +397,7 @@ TEST_CASE("scripted_tests." #DIR "." #FILE) \
390 397
391MAKE_TEST_CASE(linda, multiple_keepers) 398MAKE_TEST_CASE(linda, multiple_keepers)
392MAKE_TEST_CASE(linda, send_receive) 399MAKE_TEST_CASE(linda, send_receive)
400MAKE_TEST_CASE(linda, send_receive_func_and_string)
393MAKE_TEST_CASE(linda, send_registered_userdata) 401MAKE_TEST_CASE(linda, send_registered_userdata)
394MAKE_TEST_CASE(linda, wake_period) 402MAKE_TEST_CASE(linda, wake_period)
395 403