From 02a5bb4aa0344e103334e5b2027e2fbb7c65154f Mon Sep 17 00:00:00 2001 From: Intrinsic Date: Wed, 15 Jan 2025 23:09:05 -0800 Subject: [PATCH] Fixed cached wildcard queries --- jecs.luau | 2 +- test/tests.luau | 69 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/jecs.luau b/jecs.luau index 940e4b7..bc8cb59 100644 --- a/jecs.luau +++ b/jecs.luau @@ -619,7 +619,7 @@ local function archetype_create(world: World, id_types: { i24 }, ty, prev: i53?) end end - for _, id in id_types do + for id in records do local observer_list = find_observers(world, EcsOnArchetypeCreate, id) if not observer_list then continue diff --git a/test/tests.luau b/test/tests.luau index 2a376e4..e775b98 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -1433,13 +1433,13 @@ TEST("change tracking", function() local i = 0 for entity, number in q1 do i += 1 - world:add(testEntity, tag) + world:add(testEntity, tag) end CHECK(i == 1) for e, n in q1 do - world:set(e, pair(previous, component), n) + world:set(e, pair(previous, component), n) end end @@ -1594,4 +1594,69 @@ TEST("repro", function() CHECK(counter == 0) end end) + +TEST("wildcard query", function() + do CASE "#1" + local world = world_new() + local pair = jecs.pair + + local Relation = world:entity() + local Wildcard = jecs.Wildcard + local A = world:entity() + + local relationship = pair(Relation, Wildcard) + local query = world:query(relationship):cached() + + local entity = world:entity() + + world:add(entity, pair(Relation, A)) + + local counter = 0 + for e in query:iter() do + counter += 1 + end + CHECK(counter == 1) + end + do CASE "#2" + local world = world_new() + local pair = jecs.pair + + local Relation = world:entity() + local Wildcard = jecs.Wildcard + local A = world:entity() + + local relationship = pair(Relation, Wildcard) + + local entity = world:entity() + + world:add(entity, pair(Relation, A)) + + local counter = 0 + for e in world:query(relationship):iter() do + counter += 1 + end + CHECK(counter == 1) + end + do CASE "#3" + local world = world_new() + local pair = jecs.pair + + local Relation = world:entity() + local Wildcard = jecs.Wildcard + local A = world:entity() + + local entity = world:entity() + + world:add(entity, pair(Relation, A)) + + local relationship = pair(Relation, Wildcard) + local query = world:query(relationship):cached() + + local counter = 0 + for e in query:iter() do + counter += 1 + end + CHECK(counter == 1) + end +end) FINISH()