From b81bd6eea896e613b0e3ed525a718e1101f0b67e Mon Sep 17 00:00:00 2001 From: Ukendio Date: Thu, 27 Mar 2025 17:37:36 +0100 Subject: [PATCH] Make tests lazily evaluated --- test/tests.luau | 98 +++++++++++++++++++--------------------------- tools/testkit.luau | 48 ++++++++++++----------- 2 files changed, 67 insertions(+), 79 deletions(-) diff --git a/test/tests.luau b/test/tests.luau index 7e4d6fa..2d8eb0f 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -145,13 +145,13 @@ TEST("#repro2", function() world:set(entity, pair(4, 5), 6) -- noise local entity_visualizer = require("@tools/entity_visualiser") - entity_visualizer.components(world, entity) + -- entity_visualizer.components(world, entity) for e in world:each(pair(Lifetime, __)) do local i = 0 local nth = world:target(e, Lifetime, i) while nth do - entity_visualizer.components(world, e) + -- entity_visualizer.components(world, e) local data = world:get(e, pair(Lifetime, nth)) data -= 1 @@ -173,14 +173,11 @@ local lifetime_tracker_add = require("@tools/lifetime_tracker") TEST("another", function() local world = world_new() - world = lifetime_tracker_add(world, {padding_enabled=false}) + -- world = lifetime_tracker_add(world, {padding_enabled=false}) local e1 = world:entity() local e2 = world:entity() local e3 = world:entity() world:delete(e2) - world:print_entity_index() - print(pair(e1, e2)) - print(pair(e2, e3)) local e2_e3 = pair(e2, e3) CHECK(jecs.pair_first(world, e2_e3) == 0) CHECK(jecs.pair_second(world, e2_e3) == e3) @@ -945,10 +942,8 @@ TEST("world:query()", function() CHECK(count == 2) end - do - CASE("iterator invalidation") - do - CASE("adding") + do CASE("iterator invalidation") + do CASE("adding") SKIP() local world = jecs.World.new() local A = world:component() @@ -970,8 +965,7 @@ TEST("world:query()", function() CHECK(count == 2) end - do - CASE("spawning") + do CASE("spawning") local world = jecs.World.new() local A = world:component() local B = world:component() @@ -992,8 +986,7 @@ TEST("world:query()", function() end end - do - CASE("should not find any entities") + do CASE("should not find any entities") local world = jecs.World.new() local Hello = world:component() @@ -1011,19 +1004,16 @@ TEST("world:query()", function() CHECK(withoutCount == 0) end - do - CASE("without") - do - -- REGRESSION TEST - local world = jecs.World.new() - local _1, _2, _3 = world:component(), world:component(), world:component() + do CASE("without") + -- REGRESSION TEST + local world = jecs.World.new() + local _1, _2, _3 = world:component(), world:component(), world:component() - local counter = 0 - for e, a, b in world:query(_1, _2):without(_3) :: any do - counter += 1 - end - CHECK(counter == 0) + local counter = 0 + for e, a, b in world:query(_1, _2):without(_3) :: any do + counter += 1 end + CHECK(counter == 0) end end) @@ -1093,35 +1083,33 @@ TEST("world:children", function() end) TEST("world:clear()", function() - do - CASE("should remove its components") - local world = jecs.World.new() :: World - local A = world:component() - local B = world:component() - local C = world:component() - local D = world:component() + do CASE("should remove its components") + local world = jecs.World.new() :: World + local A = world:component() + local B = world:component() + local C = world:component() + local D = world:component() - local e = world:entity() - local e1 = world:entity() - local e2 = world:entity() + local e = world:entity() + local e1 = world:entity() + local e2 = world:entity() - world:set(e, A, true) - world:set(e, B, true) + world:set(e, A, true) + world:set(e, B, true) - world:set(e1, A, true) - world:set(e1, B, true) + world:set(e1, A, true) + world:set(e1, B, true) - CHECK(world:get(e, A)) - CHECK(world:get(e, B)) + CHECK(world:get(e, A)) + CHECK(world:get(e, B)) - world:clear(A) - CHECK(world:get(e, A) == nil) - CHECK(world:get(e, B)) - CHECK(world:get(e1, A) == nil) - CHECK(world:get(e1, B)) - end - do - CASE("should remove its components") + world:clear(A) + CHECK(world:get(e, A) == nil) + CHECK(world:get(e, B)) + CHECK(world:get(e1, A) == nil) + CHECK(world:get(e1, B)) + end + do CASE("should remove its components") local world = jecs.World.new() :: World local A = world:component() local B = world:component() @@ -1139,8 +1127,7 @@ TEST("world:clear()", function() CHECK(world:get(e, B) == nil) end - do - CASE("should move last record") + do CASE("should move last record") local world = world_new() local A = world:component() @@ -1185,8 +1172,7 @@ TEST("world:clear()", function() end) TEST("world:has()", function() - do - CASE("should find Tag on entity") + do CASE("should find Tag on entity") local world = jecs.World.new() local Tag = world:entity() @@ -1197,8 +1183,7 @@ TEST("world:has()", function() CHECK(world:has(e, Tag)) end - do - CASE("should return false when missing one tag") + do CASE("should return false when missing one tag") local world = jecs.World.new() local A = world:entity() @@ -1216,8 +1201,7 @@ TEST("world:has()", function() end) TEST("world:component()", function() - do - CASE("only components should have EcsComponent trait") + do CASE("only components should have EcsComponent trait") local world = jecs.World.new() :: World local A = world:component() local e = world:entity() diff --git a/tools/testkit.luau b/tools/testkit.luau index e37da98..4b48202 100644 --- a/tools/testkit.luau +++ b/tools/testkit.luau @@ -222,37 +222,16 @@ local function CHECK(value: T, stack: number?): T? end local function TEST(name: string, fn: () -> ()) - local active = test - assert(not active, "cannot start test while another test is in progress") test = { name = name, cases = {}, duration = 0, focus = false, + fn = fn } - assert(test) table.insert(tests, test) - - local start = os.clock() - local err - local success = xpcall(fn, function(m: string) - err = { message = m, trace = debug.traceback(nil, 2) } - end) - test.duration = os.clock() - start - - if not test.case then - CASE("") - end - assert(test.case, "no active case") - - if not success then - test.case.result = ERROR - test.error = err - end - - test = nil end local function FOCUS() @@ -274,6 +253,31 @@ local function FINISH(): boolean local total_focus_cases = 0 local duration = 0 + for _, t in tests do + if check_for_focused and not t.focus then + continue + end + test = t + fn = t.fn + local start = os.clock() + local err + local success = xpcall(fn, function(m: string) + err = { message = m, trace = debug.traceback(nil, 2) } + end) + test.duration = os.clock() - start + + if not test.case then + CASE("") + end + assert(test.case, "no active case") + + if not success then + test.case.result = ERROR + test.error = err + end + collectgarbage() + end + for _, test in tests do duration += test.duration for _, case in test.cases do