Make tests lazily evaluated

This commit is contained in:
Ukendio 2025-03-27 17:37:36 +01:00
parent e6039caaaf
commit b81bd6eea8
2 changed files with 67 additions and 79 deletions

View file

@ -145,13 +145,13 @@ TEST("#repro2", function()
world:set(entity, pair(4, 5), 6) -- noise world:set(entity, pair(4, 5), 6) -- noise
local entity_visualizer = require("@tools/entity_visualiser") 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 for e in world:each(pair(Lifetime, __)) do
local i = 0 local i = 0
local nth = world:target(e, Lifetime, i) local nth = world:target(e, Lifetime, i)
while nth do while nth do
entity_visualizer.components(world, e) -- entity_visualizer.components(world, e)
local data = world:get(e, pair(Lifetime, nth)) local data = world:get(e, pair(Lifetime, nth))
data -= 1 data -= 1
@ -173,14 +173,11 @@ local lifetime_tracker_add = require("@tools/lifetime_tracker")
TEST("another", function() TEST("another", function()
local world = world_new() 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 e1 = world:entity()
local e2 = world:entity() local e2 = world:entity()
local e3 = world:entity() local e3 = world:entity()
world:delete(e2) world:delete(e2)
world:print_entity_index()
print(pair(e1, e2))
print(pair(e2, e3))
local e2_e3 = pair(e2, e3) local e2_e3 = pair(e2, e3)
CHECK(jecs.pair_first(world, e2_e3) == 0) CHECK(jecs.pair_first(world, e2_e3) == 0)
CHECK(jecs.pair_second(world, e2_e3) == e3) CHECK(jecs.pair_second(world, e2_e3) == e3)
@ -945,10 +942,8 @@ TEST("world:query()", function()
CHECK(count == 2) CHECK(count == 2)
end end
do do CASE("iterator invalidation")
CASE("iterator invalidation") do CASE("adding")
do
CASE("adding")
SKIP() SKIP()
local world = jecs.World.new() local world = jecs.World.new()
local A = world:component() local A = world:component()
@ -970,8 +965,7 @@ TEST("world:query()", function()
CHECK(count == 2) CHECK(count == 2)
end end
do do CASE("spawning")
CASE("spawning")
local world = jecs.World.new() local world = jecs.World.new()
local A = world:component() local A = world:component()
local B = world:component() local B = world:component()
@ -992,8 +986,7 @@ TEST("world:query()", function()
end end
end end
do do CASE("should not find any entities")
CASE("should not find any entities")
local world = jecs.World.new() local world = jecs.World.new()
local Hello = world:component() local Hello = world:component()
@ -1011,19 +1004,16 @@ TEST("world:query()", function()
CHECK(withoutCount == 0) CHECK(withoutCount == 0)
end end
do do CASE("without")
CASE("without") -- REGRESSION TEST
do local world = jecs.World.new()
-- REGRESSION TEST local _1, _2, _3 = world:component(), world:component(), world:component()
local world = jecs.World.new()
local _1, _2, _3 = world:component(), world:component(), world:component()
local counter = 0 local counter = 0
for e, a, b in world:query(_1, _2):without(_3) :: any do for e, a, b in world:query(_1, _2):without(_3) :: any do
counter += 1 counter += 1
end
CHECK(counter == 0)
end end
CHECK(counter == 0)
end end
end) end)
@ -1093,35 +1083,33 @@ TEST("world:children", function()
end) end)
TEST("world:clear()", function() TEST("world:clear()", function()
do do CASE("should remove its components")
CASE("should remove its components") local world = jecs.World.new() :: World
local world = jecs.World.new() :: World local A = world:component()
local A = world:component() local B = world:component()
local B = world:component() local C = world:component()
local C = world:component() local D = world:component()
local D = world:component()
local e = world:entity() local e = world:entity()
local e1 = world:entity() local e1 = world:entity()
local e2 = world:entity() local e2 = world:entity()
world:set(e, A, true) world:set(e, A, true)
world:set(e, B, true) world:set(e, B, true)
world:set(e1, A, true) world:set(e1, A, true)
world:set(e1, B, true) world:set(e1, B, true)
CHECK(world:get(e, A)) CHECK(world:get(e, A))
CHECK(world:get(e, B)) CHECK(world:get(e, B))
world:clear(A) world:clear(A)
CHECK(world:get(e, A) == nil) CHECK(world:get(e, A) == nil)
CHECK(world:get(e, B)) CHECK(world:get(e, B))
CHECK(world:get(e1, A) == nil) CHECK(world:get(e1, A) == nil)
CHECK(world:get(e1, B)) CHECK(world:get(e1, B))
end end
do do CASE("should remove its components")
CASE("should remove its components")
local world = jecs.World.new() :: World local world = jecs.World.new() :: World
local A = world:component() local A = world:component()
local B = world:component() local B = world:component()
@ -1139,8 +1127,7 @@ TEST("world:clear()", function()
CHECK(world:get(e, B) == nil) CHECK(world:get(e, B) == nil)
end end
do do CASE("should move last record")
CASE("should move last record")
local world = world_new() local world = world_new()
local A = world:component() local A = world:component()
@ -1185,8 +1172,7 @@ TEST("world:clear()", function()
end) end)
TEST("world:has()", function() TEST("world:has()", function()
do do CASE("should find Tag on entity")
CASE("should find Tag on entity")
local world = jecs.World.new() local world = jecs.World.new()
local Tag = world:entity() local Tag = world:entity()
@ -1197,8 +1183,7 @@ TEST("world:has()", function()
CHECK(world:has(e, Tag)) CHECK(world:has(e, Tag))
end end
do do CASE("should return false when missing one tag")
CASE("should return false when missing one tag")
local world = jecs.World.new() local world = jecs.World.new()
local A = world:entity() local A = world:entity()
@ -1216,8 +1201,7 @@ TEST("world:has()", function()
end) end)
TEST("world:component()", function() TEST("world:component()", function()
do do CASE("only components should have EcsComponent trait")
CASE("only components should have EcsComponent trait")
local world = jecs.World.new() :: World local world = jecs.World.new() :: World
local A = world:component() local A = world:component()
local e = world:entity() local e = world:entity()

View file

@ -222,37 +222,16 @@ local function CHECK<T>(value: T, stack: number?): T?
end end
local function TEST(name: string, fn: () -> ()) local function TEST(name: string, fn: () -> ())
local active = test
assert(not active, "cannot start test while another test is in progress")
test = { test = {
name = name, name = name,
cases = {}, cases = {},
duration = 0, duration = 0,
focus = false, focus = false,
fn = fn
} }
assert(test)
table.insert(tests, 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 end
local function FOCUS() local function FOCUS()
@ -274,6 +253,31 @@ local function FINISH(): boolean
local total_focus_cases = 0 local total_focus_cases = 0
local duration = 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 for _, test in tests do
duration += test.duration duration += test.duration
for _, case in test.cases do for _, case in test.cases do