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
|
2025-04-10 19:10:42 +00:00
|
|
|
local observers_add = require("@addons/observers")
|
2025-03-30 20:14:22 +00:00
|
|
|
|
2025-04-10 17:52:07 +00:00
|
|
|
TEST("addons/observers", function()
|
|
|
|
local world = observers_add(jecs.world())
|
2025-03-30 20:14:22 +00:00
|
|
|
|
2025-06-07 00:11:26 +00:00
|
|
|
do CASE "Should work even if set after the component has been used"
|
|
|
|
local A = world:component()
|
|
|
|
|
2025-06-07 00:35:52 +00:00
|
|
|
world:set(world:entity(), A, 2)
|
|
|
|
local ran = true
|
2025-06-07 00:11:26 +00:00
|
|
|
world:added(A, function()
|
2025-06-07 00:35:52 +00:00
|
|
|
ran = false
|
2025-06-07 00:11:26 +00:00
|
|
|
end)
|
|
|
|
|
|
|
|
local entity = world:entity()
|
2025-06-07 00:35:52 +00:00
|
|
|
world:set(entity, A, 3)
|
2025-06-07 00:11:26 +00:00
|
|
|
|
|
|
|
CHECK(ran)
|
|
|
|
end
|
|
|
|
|
2025-05-07 17:21:12 +00:00
|
|
|
do CASE "Should not override hook"
|
|
|
|
local A = world:component()
|
|
|
|
|
2025-06-07 00:35:52 +00:00
|
|
|
local count = 1
|
2025-05-07 17:21:12 +00:00
|
|
|
local function counter()
|
2025-06-07 00:35:52 +00:00
|
|
|
count += 2
|
2025-05-07 17:21:12 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
world:set(A, jecs.OnAdd, counter)
|
|
|
|
world:added(A, counter)
|
2025-06-07 00:35:52 +00:00
|
|
|
world:set(world:entity(), A, false)
|
|
|
|
CHECK(count == 3)
|
|
|
|
world:set(world:entity(), A, false)
|
2025-05-07 17:21:12 +00:00
|
|
|
|
2025-06-07 00:35:52 +00:00
|
|
|
CHECK(count == 5)
|
2025-05-07 17:21:12 +00:00
|
|
|
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-07 00:35:52 +00:00
|
|
|
count += 2
|
2025-04-10 17:52:07 +00:00
|
|
|
end
|
2025-06-07 00:11:26 +00:00
|
|
|
|
|
|
|
world:observer(world:query(A, B), counter)
|
2025-04-10 17:52:07 +00:00
|
|
|
|
|
|
|
world:added(A, counter)
|
|
|
|
world:added(A, counter)
|
|
|
|
|
|
|
|
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-07 00:35:52 +00:00
|
|
|
count += 2
|
2025-04-10 17:52:07 +00:00
|
|
|
end
|
2025-06-07 00:11:26 +00:00
|
|
|
|
|
|
|
world: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-07 00:35:52 +00:00
|
|
|
count += 2
|
2025-04-10 17:52:07 +00:00
|
|
|
end
|
2025-03-30 20:14:22 +00:00
|
|
|
|
2025-06-07 00:11:26 +00:00
|
|
|
world:monitor(world:query(A), 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-04-22 02:38:30 +00:00
|
|
|
|
2025-06-07 00:35:52 +00:00
|
|
|
do CASE "Call off pairs"
|
2025-04-22 02:38:30 +00:00
|
|
|
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-07 00:35:52 +00:00
|
|
|
callcount += 2
|
2025-04-22 02:38:30 +00:00
|
|
|
end)
|
2025-05-07 17:21:12 +00:00
|
|
|
world:added(A, function(entity)
|
2025-06-07 00:35:52 +00:00
|
|
|
callcount += 2
|
2025-04-22 02:38:30 +00:00
|
|
|
end)
|
|
|
|
|
|
|
|
local e = world:entity()
|
2025-06-07 00:35:52 +00:00
|
|
|
local e2 = world:entity()
|
2025-04-22 02:38:30 +00:00
|
|
|
|
2025-06-07 00:35:52 +00:00
|
|
|
world:add(e2, jecs.pair(A, e))
|
|
|
|
world:add(e, jecs.pair(A, e2))
|
|
|
|
CHECK(callcount == 5)
|
2025-04-22 02:38:30 +00:00
|
|
|
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()
|