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.cpp185
1 files changed, 125 insertions, 60 deletions
diff --git a/unit_tests/linda_tests.cpp b/unit_tests/linda_tests.cpp
index f2934eb..9dbaa85 100644
--- a/unit_tests/linda_tests.cpp
+++ b/unit_tests/linda_tests.cpp
@@ -3,67 +3,132 @@
3 3
4// ################################################################################################# 4// #################################################################################################
5 5
6TEST_CASE("linda.single Keeper") 6TEST_CASE("linda.single_keeper.creation/no_argument")
7{ 7{
8 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; 8 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
9 S.requireSuccess("lanes = require 'lanes'"); 9 S.requireSuccess("lanes = require 'lanes'");
10 10
11 SECTION("Linda creation") 11 // no argument is ok
12 { 12 S.requireSuccess("lanes.linda()");
13 // no parameters is ok 13 S.requireNotReturnedString("return tostring(lanes.linda())", R"===(Linda: <not a string>)==="); // unspecified name should not result in <not a string>
14 S.requireSuccess("lanes.linda()"); 14}
15 S.requireNotReturnedString("return tostring(lanes.linda())", R"===(Linda: <not a string>)==="); // unspecified name should not result in <not a string>
16
17 // since we have only one keeper, only group 0 is authorized
18 S.requireFailure("lanes.linda(-1)");
19 S.requireSuccess("lanes.linda(0)");
20 S.requireFailure("lanes.linda(1)");
21
22 // any name is ok
23 S.requireSuccess("lanes.linda('')"); // an empty name results in a string conversion of the form "Linda: <some hex value>" that we can't test (but it works)
24 S.requireReturnedString("return tostring(lanes.linda('short name'))", R"===(Linda: short name)===");
25 S.requireReturnedString("return tostring(lanes.linda('very very very very very very long name'))", R"===(Linda: very very very very very very long name)===");
26 S.requireReturnedString("return tostring(lanes.linda('auto'))", R"===(Linda: [string "return tostring(lanes.linda('auto'))"]:1)===");
27
28 if constexpr (LUA_VERSION_NUM == 504) {
29 // a function is acceptable as a __close handler
30 S.requireSuccess("local l <close> = lanes.linda(function() end)");
31 // a callable table too (a callable full userdata as well, but I have none here)
32 S.requireSuccess("local l <close> = lanes.linda(setmetatable({}, {__call = function() end}))");
33 // if the function raises an error, we should get it
34 S.requireFailure("local l <close> = lanes.linda(function() error 'gluh' end)");
35 } else {
36 // no __close support before Lua 5.4
37 S.requireFailure("lanes.linda(function() end)");
38 S.requireFailure("lanes.linda(setmetatable({}, {__call = function() end}))");
39 }
40 15
41 // mixing parameters in any order is ok: 2 out of 3 16// #################################################################################################
42 S.requireSuccess("lanes.linda(0, 'name')");
43 S.requireSuccess("lanes.linda('name', 0)");
44 if constexpr (LUA_VERSION_NUM == 504) {
45 S.requireSuccess("lanes.linda(0, function() end)");
46 S.requireSuccess("lanes.linda(function() end, 0)");
47 S.requireSuccess("lanes.linda('name', function() end)");
48 S.requireSuccess("lanes.linda(function() end, 'name')");
49 }
50 17
51 // mixing parameters in any order is ok: 3 out of 3 18TEST_CASE("linda.single_keeper.creation/non_table_arguments")
52 if constexpr (LUA_VERSION_NUM == 504) { 19{
53 S.requireSuccess("lanes.linda(0, 'name', function() end)"); 20 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
54 S.requireSuccess("lanes.linda(0, function() end, 'name')"); 21 S.requireSuccess("lanes = require 'lanes'");
55 S.requireSuccess("lanes.linda('name', 0, function() end)"); 22
56 S.requireSuccess("lanes.linda('name', function() end, 0)"); 23 // any argument that is not a table is not ok
57 S.requireSuccess("lanes.linda(function() end, 0, 'name')"); 24 S.requireFailure("lanes.linda(0)");
58 S.requireSuccess("lanes.linda(function() end, 'name', 0)"); 25 S.requireFailure("lanes.linda('bob')");
59 } 26 S.requireFailure("lanes.linda(false)");
27 S.requireFailure("lanes.linda(function() end)");
28 S.requireFailure("lanes.linda(lanes.cancel_error)");
29}
30
31// #################################################################################################
32
33TEST_CASE("linda.single_keeper.creation/close_handler")
34{
35 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
36 S.requireSuccess("lanes = require 'lanes'");
37
38 if constexpr (LUA_VERSION_NUM == 504) {
39 // a function is acceptable as a __close handler
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)
42 S.requireSuccess("local l <close> = lanes.linda{close_handler = setmetatable({}, {__call = function() end})}");
43 } else {
44 // no __close support before Lua 5.4, field is ignored (therefore invalid values are accepted too!)
45 S.requireSuccess("lanes.linda{close_handler = 'a string'}");
46 S.requireSuccess("lanes.linda{close_handler = function() end}");
47 S.requireSuccess("lanes.linda{close_handler = setmetatable({}, {__call = function() end})}");
48 }
49}
50
51// #################################################################################################
52
53TEST_CASE("linda.single_keeper.creation/table_argument")
54{
55 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
56 S.requireSuccess("lanes = require 'lanes'");
57
58 // one table is fine
59 S.requireSuccess("lanes.linda{}");
60 // anything beyond that is not
61 S.requireFailure("lanes.linda({},{})");
62 S.requireFailure("lanes.linda({},'bob')");
63 S.requireFailure("lanes.linda({},42)");
64}
65
66// #################################################################################################
67
68TEST_CASE("linda.single_keeper.creation/group")
69{
70 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
71 S.requireSuccess("lanes = require 'lanes'");
72
73 // since we have only one keeper, only group 0 is authorized
74 S.requireFailure("lanes.linda{group = -1}");
75 S.requireSuccess("lanes.linda{group = 0}");
76 S.requireFailure("lanes.linda{group = 1}");
77}
78
79// #################################################################################################
80
81TEST_CASE("linda.single_keeper.creation/name")
82{
83 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
84 S.requireSuccess("lanes = require 'lanes'");
85
86 // any name is ok
87 S.requireSuccess("lanes.linda{name = ''}"); // an empty name results in a string conversion of the form "Linda: <some hex value>" that we can't test (but it works)
88 S.requireReturnedString("return tostring(lanes.linda{name = 'short name'})", R"===(Linda: short name)===");
89 S.requireReturnedString("return tostring(lanes.linda{name = 'very very very very very very long name'})", R"===(Linda: very very very very very very long name)===");
90 S.requireReturnedString("return tostring(lanes.linda{name = 'auto'})", R"===(Linda: [string "return tostring(lanes.linda{name = 'auto'})"]:1)===");
91}
92
93// #################################################################################################
94
95TEST_CASE("linda.single_keeper.creation/wake_period")
96{
97 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
98 S.requireSuccess("lanes = require 'lanes'");
60 99
61 // unsupported parameters should fail 100 // wake_period should be a number > 0
62 S.requireFailure("lanes.linda(true)"); 101 S.requireFailure("lanes.linda{wake_period = false}");
63 S.requireFailure("lanes.linda(false)"); 102 S.requireFailure("lanes.linda{wake_period = 'bob'}");
64 // uncallable table or full userdata 103 S.requireFailure("lanes.linda{wake_period = {}}");
65 S.requireFailure("lanes.linda({})"); 104 S.requireFailure("lanes.linda{wake_period = -1}");
66 S.requireFailure("lanes.linda(lanes.linda())"); 105 S.requireFailure("lanes.linda{wake_period = 0}");
106 S.requireSuccess("lanes.linda{wake_period = 0.0001}");
107}
108
109// #################################################################################################
110
111TEST_CASE("linda.single_keeper.wake_period")
112{
113 FAIL("TODO: check that wake_period works as expected");
114 // - use configure default if not provided
115 // - overrides default when provided
116 // - blocking operation wakes at the specified period
117}
118
119// #################################################################################################
120
121TEST_CASE("linda.single_keeper.the_rest")
122{
123 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
124 S.requireSuccess("lanes = require 'lanes'");
125
126 // ---------------------------------------------------------------------------------------------
127
128 SECTION("error in close handler is propagated")
129 {
130 // if the function raises an error, we should get it
131 S.requireFailure("local l <close> = lanes.linda{close_handler = function() error 'gluh' end}");
67 } 132 }
68 133
69 // --------------------------------------------------------------------------------------------- 134 // ---------------------------------------------------------------------------------------------
@@ -311,12 +376,12 @@ TEST_CASE("linda.multi Keeper")
311 376
312 S.requireSuccess("lanes = require 'lanes'.configure{nb_user_keepers = 3}"); 377 S.requireSuccess("lanes = require 'lanes'.configure{nb_user_keepers = 3}");
313 378
314 S.requireFailure("lanes.linda(-1)"); 379 S.requireFailure("lanes.linda{group = -1}");
315 S.requireSuccess("lanes.linda(0)"); 380 S.requireSuccess("lanes.linda{group = 0}");
316 S.requireSuccess("lanes.linda(1)"); 381 S.requireSuccess("lanes.linda{group = 1}");
317 S.requireSuccess("lanes.linda(2)"); 382 S.requireSuccess("lanes.linda{group = 2}");
318 S.requireSuccess("lanes.linda(3)"); 383 S.requireSuccess("lanes.linda{group = 3}");
319 S.requireFailure("lanes.linda(4)"); 384 S.requireFailure("lanes.linda{group = 4}");
320} 385}
321 386
322// ################################################################################################# 387// #################################################################################################