From cbcd7d3860db0124feb5e512d11ebee81ccd62c7 Mon Sep 17 00:00:00 2001 From: Benoit Germain Date: Fri, 25 Jul 2025 12:48:37 +0200 Subject: Split lanes.sleep unit tests and some linda unit tests too --- unit_tests/lane_tests.cpp | 10 ++- unit_tests/linda_tests.cpp | 157 +++++++++++++++++++++++---------------------- 2 files changed, 91 insertions(+), 76 deletions(-) diff --git a/unit_tests/lane_tests.cpp b/unit_tests/lane_tests.cpp index 05c517c..b6fb188 100644 --- a/unit_tests/lane_tests.cpp +++ b/unit_tests/lane_tests.cpp @@ -105,7 +105,7 @@ TEST_CASE("lanes.set_thread_priority") // ################################################################################################# // ################################################################################################# -TEST_CASE("lanes.sleep.argument validation") +TEST_CASE("lanes.sleep.argument_validation/not_numbers") { LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; S.requireSuccess("lanes = require 'lanes'.configure()"); @@ -116,6 +116,14 @@ TEST_CASE("lanes.sleep.argument validation") S.requireFailure("lanes.sleep('a string')"); S.requireFailure("lanes.sleep(lanes.null)"); S.requireFailure("lanes.sleep(print)"); +} + +// ################################################################################################# + +TEST_CASE("lanes.sleep.argument_validation/numbers") +{ + LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; + S.requireSuccess("lanes = require 'lanes'.configure()"); // negative durations are not supported S.requireFailure("lanes.sleep(-1)"); diff --git a/unit_tests/linda_tests.cpp b/unit_tests/linda_tests.cpp index 8d3cd50..90630a7 100644 --- a/unit_tests/linda_tests.cpp +++ b/unit_tests/linda_tests.cpp @@ -109,103 +109,110 @@ TEST_CASE("linda.single_keeper.creation/wake_period") // ################################################################################################# -TEST_CASE("linda.single_keeper.the_rest") +TEST_CASE("linda.single_keeper.indexing") { LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; - S.requireSuccess("lanes = require 'lanes'"); + S.requireSuccess("lanes = require 'lanes'.configure()"); + + // indexing the linda with an unknown string key should fail + S.requireFailure("return lanes.linda().gouikra"); + // indexing the linda with an unsupported key type should fail + S.requireFailure("return lanes.linda()[5]"); + S.requireFailure("return lanes.linda()[false]"); + S.requireFailure("return lanes.linda()[{}]"); + S.requireFailure("return lanes.linda()[function() end]"); +} - // --------------------------------------------------------------------------------------------- +// ################################################################################################# - SECTION("error in close handler is propagated") +TEST_CASE("linda.single_keeper.send()") +{ + LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; + S.requireSuccess("lanes = require 'lanes'.configure()"); + + SECTION("timeout") { - // if the function raises an error, we should get it - S.requireFailure("local l = lanes.linda{close_handler = function() error 'gluh' end}"); + // timeout checks + // linda:send() should fail if the timeout is bad + S.requireFailure("lanes.linda():send(-1, 'k', 'v')"); + // any positive value is ok + S.requireSuccess("lanes.linda():send(0, 'k', 'v')"); + S.requireSuccess("lanes.linda():send(1e20, 'k', 'v')"); + // nil too (same as 'forever') + S.requireSuccess("lanes.linda():send(nil, 'k', 'v')"); } - // --------------------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------------- - SECTION("Linda indexing") + SECTION("fails on bad keys") { - // indexing the linda with an unknown string key should fail - S.requireFailure("return lanes.linda().gouikra"); - // indexing the linda with an unsupported key type should fail - S.requireFailure("return lanes.linda()[5]"); - S.requireFailure("return lanes.linda()[false]"); - S.requireFailure("return lanes.linda()[{}]"); - S.requireFailure("return lanes.linda()[function() end]"); + // key checks + // linda:send() should fail if the key is unsupported (nil, table, function, full userdata, reserved light userdata) + S.requireFailure("lanes.linda():send(0, nil, 'v')"); + S.requireFailure("lanes.linda():send(0, {}, 'v')"); + S.requireFailure("lanes.linda():send(0, function() end, 'v')"); + S.requireFailure("lanes.linda():send(0, io.stdin, 'v')"); + S.requireFailure("lanes.linda():send(0, lanes.null, 'v')"); + S.requireFailure("lanes.linda():send(0, lanes.cancel_error, 'v')"); } - // --------------------------------------------------------------------------------------------- - SECTION("linda:send()") + // ----------------------------------------------------------------------------------------- + + SECTION("succeeds on supported keys") { - SECTION("timeout") - { - // timeout checks - // linda:send() should fail if the timeout is bad - S.requireFailure("lanes.linda():send(-1, 'k', 'v')"); - // any positive value is ok - S.requireSuccess("lanes.linda():send(0, 'k', 'v')"); - S.requireSuccess("lanes.linda():send(1e20, 'k', 'v')"); - // nil too (same as 'forever') - S.requireSuccess("lanes.linda():send(nil, 'k', 'v')"); - } + // supported keys are ok: boolean, number, string, light userdata, deep userdata + S.requireSuccess("lanes.linda():send(0, true, 'v')"); + S.requireSuccess("lanes.linda():send(0, false, 'v')"); + S.requireSuccess("lanes.linda():send(0, 99, 'v')"); + S.requireSuccess("local l = lanes.linda(); l:send(0, l:deep(), 'v')"); + } - // ----------------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------------- - SECTION("fails on bad keys") - { - // key checks - // linda:send() should fail if the key is unsupported (nil, table, function, full userdata, reserved light userdata) - S.requireFailure("lanes.linda():send(0, nil, 'v')"); - S.requireFailure("lanes.linda():send(0, {}, 'v')"); - S.requireFailure("lanes.linda():send(0, function() end, 'v')"); - S.requireFailure("lanes.linda():send(0, io.stdin, 'v')"); - S.requireFailure("lanes.linda():send(0, lanes.null, 'v')"); - S.requireFailure("lanes.linda():send(0, lanes.cancel_error, 'v')"); - } + SECTION("succeeds on deep userdata key") + { + S.requireSuccess("local l = lanes.linda(); l:send(0, l, 'v')"); + } - // ----------------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------------- - SECTION("succeeds on supported keys") - { - // supported keys are ok: boolean, number, string, light userdata, deep userdata - S.requireSuccess("lanes.linda():send(0, true, 'v')"); - S.requireSuccess("lanes.linda():send(0, false, 'v')"); - S.requireSuccess("lanes.linda():send(0, 99, 'v')"); - S.requireSuccess("local l = lanes.linda(); l:send(0, l:deep(), 'v')"); - } + SECTION(". fails") + { + // misuse checks, . instead of : + S.requireFailure("lanes.linda().send(nil, 'k', 'v')"); + } - // ----------------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------------- - SECTION("succeeds on deep userdata key") - { - S.requireSuccess("local l = lanes.linda(); l:send(0, l, 'v')"); - } + SECTION("unsupported values fail") + { + // value checks + // linda:send() should fail if we don't send anything + S.requireFailure("lanes.linda():send()"); + S.requireFailure("lanes.linda():send(0)"); + S.requireFailure("lanes.linda():send(0, 'k')"); + // or non-deep userdata + S.requireFailure("lanes.linda():send(0, 'k', fixture.newuserdata())"); + // or something with a converter that raises an error (maybe that should go to a dedicated __lanesconvert test!) + S.requireFailure("lanes.linda():send(0, 'k', setmetatable({}, {__lanesconvert = function(where_) error (where_ .. ': should not send me' end}))"); + // but a registered non-deep userdata should work + S.requireSuccess("lanes.linda():send(0, 'k', io.stdin)"); + } +} - // ----------------------------------------------------------------------------------------- +// ################################################################################################# - SECTION(". fails") - { - // misuse checks, . instead of : - S.requireFailure("lanes.linda().send(nil, 'k', 'v')"); - } +TEST_CASE("linda.single_keeper.the_rest") +{ + LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; + S.requireSuccess("lanes = require 'lanes'"); - // ----------------------------------------------------------------------------------------- + // --------------------------------------------------------------------------------------------- - SECTION("unsupported values fail") - { - // value checks - // linda:send() should fail if we don't send anything - S.requireFailure("lanes.linda():send()"); - S.requireFailure("lanes.linda():send(0)"); - S.requireFailure("lanes.linda():send(0, 'k')"); - // or non-deep userdata - S.requireFailure("lanes.linda():send(0, 'k', fixture.newuserdata())"); - // or something with a converter that raises an error (maybe that should go to a dedicated __lanesconvert test!) - S.requireFailure("lanes.linda():send(0, 'k', setmetatable({}, {__lanesconvert = function(where_) error (where_ .. ': should not send me' end}))"); - // but a registered non-deep userdata should work - S.requireSuccess("lanes.linda():send(0, 'k', io.stdin)"); - } + SECTION("error in close handler is propagated") + { + // if the function raises an error, we should get it + S.requireFailure("local l = lanes.linda{close_handler = function() error 'gluh' end}"); } // --------------------------------------------------------------------------------------------- -- cgit v1.2.3-55-g6feb