jecs/test/addons/ob.luau

265 lines
5.3 KiB
Text
Raw Normal View History

2025-03-30 20:14:22 +00:00
local jecs = require("@jecs")
2025-04-10 17:52:07 +00:00
local testkit = require("@testkit")
local test = testkit.test()
local CASE, TEST, FINISH, CHECK = test.CASE, test.TEST, test.FINISH, test.CHECK
local FOCUS = test.FOCUS
2025-07-27 12:39:43 +00:00
local ob = require("@addons/ob")
2025-03-30 20:14:22 +00:00
TEST("addons/ob", function()
2025-07-27 12:39:43 +00:00
local world = jecs.world()
2025-09-15 21:15:11 +00:00
do CASE "should match against archetypes that were already created"
local A = world:component()
local e1 = world:entity()
world:add(e1, A)
local monitor = ob.monitor(world:query(A))
local c = 1
monitor.added(function()
c += 1
end)
world:remove(e1, A)
world:add(e1, A)
CHECK(c==2)
end
2025-09-16 09:02:52 +00:00
do CASE "Should enter monitor at query:without(pair(R, t1)) when adding pair(R, t2)"
2025-09-16 08:35:52 +00:00
local A = world:component()
local B = world:component()
local C = world:component()
local D = world:component()
2025-09-16 09:02:52 +00:00
local e = world:entity()
world:add(e, A)
world:add(e, jecs.pair(B, D))
2025-09-16 08:35:52 +00:00
local c = 1
local r = 1
local monitor = ob.monitor(world:query(A):without(jecs.pair(B, C)))
monitor.added(function()
c += 1
end)
monitor.removed(function()
r += 1
end)
local child = world:entity()
world:add(child, A)
CHECK(c==2)
world:add(child, jecs.pair(B, D))
CHECK(c==2)
CHECK(r==1)
world:add(child, jecs.pair(B, C))
CHECK(c==2)
CHECK(r==2)
end
2025-09-16 09:02:52 +00:00
do CASE "Should enter monitor at query:without(pair(R, t1)) when removing pair(R, t1)"
local A = world:component()
local B = world:component()
local C = world:component()
local D = world:component()
print("B", B)
local e = world:entity()
world:add(e, A)
world:add(e, jecs.pair(B, D))
local c = 1
local r = 1
local monitor = ob.monitor(world:query(A):without(jecs.pair(B, D)))
monitor.added(function()
c += 1
end)
monitor.removed(function()
r += 1
end)
local child = world:entity()
world:add(child, jecs.pair(B, C))
world:add(child, jecs.pair(B, D))
CHECK(c==1)
world:add(child, A)
CHECK(c==1)
world:remove(child, jecs.pair(B, C))
CHECK(c==1)
world:add(child, jecs.pair(B, C))
CHECK(c==1)
world:remove(child, jecs.pair(B, D))
CHECK(c==2)
world:add(child, jecs.pair(B, D))
CHECK(c==2)
CHECK(r==2)
world:remove(child, jecs.pair(B, C))
CHECK(c==2)
CHECK(r==2)
world:remove(child, jecs.pair(B, D))
CHECK(c==3)
CHECK(r==2)
end
do CASE "Should enter monitor at query:without(pair(R, *)) when adding pair(R, t1)"
2025-09-16 08:35:52 +00:00
local A = world:component()
local B = world:component()
local C = world:component()
local D = world:component()
local c = 1
local r = 1
local monitor = ob.monitor(world:query(A):without(jecs.pair(B, jecs.w)))
monitor.added(function()
c += 1
end)
monitor.removed(function()
r += 1
end)
local child = world:entity()
world:add(child, A)
CHECK(c==2)
world:add(child, jecs.pair(B, D))
CHECK(c==2)
CHECK(r==2)
world:add(child, jecs.pair(B, C))
CHECK(c==2)
CHECK(r==2)
end
2025-09-16 09:02:52 +00:00
do CASE "Should enter monitor at query:without(t1) when removing t1"
local A = world:component()
local B = world:component()
local c = 1
local monitor = ob.monitor(world:query(A):without(B))
monitor.added(function()
c += 1
end)
monitor.removed(function()
c += 1
end)
local child = world:entity()
world:add(child, B)
CHECK(c==1)
world:add(child, A)
CHECK(c==1)
world:remove(child, B)
CHECK(c==2)
world:remove(child, A)
CHECK(c==3)
end
do CASE "monitors should accept pairs"
local A = world:component()
local B = world:component()
2025-05-07 17:21:12 +00:00
local c = 1
local monitor = ob.monitor(world:query(jecs.pair(A, B)))
monitor.added(function()
c += 1
end)
monitor.removed(function()
c += 1
end)
local child = world:entity()
world:add(child, jecs.pair(A, B))
CHECK(c == 2)
world:remove(child, jecs.pair(A, B))
CHECK(c == 3)
end
2025-04-10 17:52:07 +00:00
do CASE "Ensure ordering between signals and observers"
local A = world:component()
local B = world:component()
2025-06-07 00:35:52 +00:00
local count = 1
2025-04-10 17:52:07 +00:00
local function counter()
2025-06-20 20:39:42 +00:00
count += 1
2025-04-10 17:52:07 +00:00
end
2025-06-07 00:11:26 +00:00
2025-07-27 12:39:43 +00:00
ob.observer(world:query(A, B), counter)
2025-04-10 17:52:07 +00:00
world:added(A, counter)
world:added(A, counter)
2025-07-27 12:39:43 +00:00
for _ in world:query(A) do
end
2025-04-10 17:52:07 +00:00
local e = world:entity()
world:add(e, A)
2025-06-07 00:35:52 +00:00
CHECK(count == 3)
2025-04-10 17:52:07 +00:00
world:add(e, B)
2025-06-07 00:35:52 +00:00
CHECK(count == 4)
2025-03-30 20:14:22 +00:00
end
2025-04-10 17:52:07 +00:00
do CASE "Rematch entities in observers"
local A = world:component()
2025-03-30 20:14:22 +00:00
2025-06-07 00:35:52 +00:00
local count = 1
2025-04-10 17:52:07 +00:00
local function counter()
2025-06-20 20:39:42 +00:00
count += 1
2025-04-10 17:52:07 +00:00
end
2025-06-07 00:11:26 +00:00
2025-07-27 12:39:43 +00:00
ob.observer(world:query(A), counter)
2025-03-30 20:14:22 +00:00
2025-04-10 17:52:07 +00:00
local e = world:entity()
2025-06-07 00:35:52 +00:00
world:set(e, A, false)
CHECK(count == 2)
2025-04-10 17:52:07 +00:00
world:remove(e, A)
CHECK(count == 2)
2025-06-07 00:35:52 +00:00
world:set(e, A, false)
2025-04-10 17:52:07 +00:00
CHECK(count == 3)
2025-06-07 00:35:52 +00:00
world:set(e, A, false)
CHECK(count == 4)
2025-03-30 20:14:22 +00:00
end
2025-04-10 17:52:07 +00:00
do CASE "Don't report changed components in monitor"
local A = world:component()
2025-06-07 00:35:52 +00:00
local count = 1
2025-04-10 17:52:07 +00:00
local function counter()
2025-06-20 20:39:42 +00:00
count += 1
2025-04-10 17:52:07 +00:00
end
2025-03-30 20:14:22 +00:00
local monitor = ob.monitor(world:query(A))
monitor.added(counter)
monitor.removed(counter)
2025-04-10 17:52:07 +00:00
local e = world:entity()
2025-06-07 00:35:52 +00:00
world:set(e, A, false)
2025-04-10 17:52:07 +00:00
CHECK(count == 2)
2025-06-07 00:35:52 +00:00
world:remove(e, A)
2025-04-10 17:52:07 +00:00
CHECK(count == 3)
2025-06-07 00:35:52 +00:00
world:set(e, A, false)
CHECK(count == 4)
world:set(e, A, false)
CHECK(count == 4)
2025-04-10 17:52:07 +00:00
end
2025-06-07 00:35:52 +00:00
do CASE "Call off pairs"
local A = world:component()
2025-06-07 00:35:52 +00:00
local callcount = 1
2025-05-07 17:21:12 +00:00
world:added(A, function(entity)
2025-06-20 20:39:42 +00:00
callcount += 1
end)
2025-05-07 17:21:12 +00:00
world:added(A, function(entity)
2025-06-20 20:39:42 +00:00
callcount += 1
end)
local e = world:entity()
2025-06-07 00:35:52 +00:00
local e2 = world:entity()
2025-06-07 00:35:52 +00:00
world:add(e2, jecs.pair(A, e))
world:add(e, jecs.pair(A, e2))
2025-06-20 20:39:42 +00:00
CHECK(callcount == 1 + 2 * 2)
end
2025-04-10 17:52:07 +00:00
end)
2025-03-30 20:14:22 +00:00
2025-04-10 17:52:07 +00:00
return FINISH()