Rename tests files

This commit is contained in:
Ukendio 2024-07-14 01:27:47 +02:00
parent 7e6b555e51
commit 87615de289

View file

@ -514,135 +514,119 @@ TEST("world", function()
end end
do CASE "should not find any entities" do CASE "should not find any entities"
local world = jecs.World.new() local world = jecs.World.new()
local Hello = world:component() local Hello = world:component()
local Bob = world:component() local Bob = world:component()
local helloBob = world:entity() local helloBob = world:entity()
world:add(helloBob, jecs.pair(Hello, Bob)) world:add(helloBob, ECS_PAIR(Hello, Bob))
world:add(helloBob, Bob) world:add(helloBob, Bob)
local withoutCount = 0 local withoutCount = 0
for _ in world for _ in world:query(ECS_PAIR(Hello, Bob)):without(Bob) do
:query(jecs.pair(Hello, Bob)) withoutCount += 1
:without(Bob) end
do
withoutCount += 1
end
CHECK(withoutCount == 0) CHECK(withoutCount == 0)
end end
end)
do CASE "should allow change tracking"
local world = jecs.World.new()
local Previous = world:component()
local ChangeTracker = {} TEST("changetracker", function()
ChangeTracker.__index = ChangeTracker local world = jecs.World.new()
local Previous = world:component()
function ChangeTracker.new(component) local function shallowEq(a, b)
return setmetatable({ for k, v in a do
addedComponents = {}, -- Map<Entity, T> if b[k] ~= v then
removedComponents = {}, -- Vec<Entity> return false
component = component,
previous = jecs.pair(Previous, component),
isTrivial = nil,
}, ChangeTracker)
end
local function shallowEq(a, b)
for k, v in a do
if b[k] ~= v then
return false
end
end end
return true
end end
return true
end
function ChangeTracker.track(tracker, world, fn) local function ChangeTracker(world, component)
local addedComponents = {}
local removedComponents = {}
local previous = jecs.pair(Previous, component)
local isTrivial = nil
local function track(fn)
local added = false local added = false
local removed = false local removed = false
local addedComponents = tracker.addedComponents
local removedComponents = tracker.removedComponents
local component = tracker.component
local previous = tracker.previous
local isTrivial = tracker.isTrivial
local changes = {} local changes = {}
function changes:added() function changes.added()
added = true added = true
local q = world:query(component):without(previous) local q = world:query(component):without(previous)
return function() return function()
local id, data = q:next() local id, data = q:next()
if not id then if not id then
return nil return nil
end end
if isTrivial == nil then if isTrivial == nil then
isTrivial = typeof(data) ~= "table" isTrivial = typeof(data) ~= "table"
tracker.isTrivial = isTrivial
end end
if not isTrivial then if not isTrivial then
data = table.clone(data) data = table.clone(data)
end end
addedComponents[id] = data addedComponents[id] = data
return id, data return id, data
end end
end end
function changes:changed() function changes.changed()
local q = world:query(component, previous) local q = world:query(component, previous)
return function() return function()
local id, new, old = q:next() local id, new, old = q:next()
while true do while true do
if not id then if not id then
return nil return nil
end end
if not isTrivial then if not isTrivial then
if not shallowEq(new, old) then if not shallowEq(new, old) then
break
end
elseif new ~= old then
break break
end end
elseif new ~= old then
break id, new, old = q:next()
end end
id, new, old = q:next() addedComponents[id] = new
return id, old, new
end end
print("nil?", id)
addedComponents[id] = new
return id, old, new
end
end end
function changes:removed() function changes.removed()
removed = true removed = true
local q = world:query(tracker.previous):without(tracker.component) local q = world:query(previous):without(component)
return function() return function()
local id = q:next() local id = q:next()
if id then if id then
table.insert(removedComponents, id) table.insert(removedComponents, id)
end
return id
end end
return id
end
end end
fn(changes) fn(changes)
if not added then if not added then
for _ in changes:added() do for _ in changes.added() do
end end
end end
if not removed then if not removed then
for _ in changes:removed() do for _ in changes.removed() do
end end
end end
@ -655,16 +639,22 @@ TEST("world", function()
end end
end end
return {
track = track
}
end
do CASE "should allow change tracking"
local Test = world:component() local Test = world:component()
local TestTracker = ChangeTracker.new(Test) local TestTracker = ChangeTracker(world, Test)
local e = world:entity() local e = world:entity()
world:set(e, Test, { foo = 11 }) world:set(e, Test, { foo = 11 })
for e, test in world:query(Test) do for e, test in world:query(Test) do
test.foo = test.foo + 1 test.foo = test.foo + 1
end end
TestTracker:track(world, function(changes) TestTracker.track(function(changes)
local added = 0 local added = 0
local changed = 0 local changed = 0
local removed = 0 local removed = 0
@ -672,10 +662,10 @@ TEST("world", function()
added+=1 added+=1
end end
for e, old, new in changes.changed() do for e, old, new in changes.changed() do
changed+=1 changed+=1
end end
for e in changes.removed() do for e in changes.removed() do
removed+=1 removed+=1
end end
CHECK(added == 1) CHECK(added == 1)
CHECK(changed == 0) CHECK(changed == 0)
@ -683,22 +673,23 @@ TEST("world", function()
end) end)
for e, test in world:query(Test) do for e, test in world:query(Test) do
test.foo = test.foo + 1 test.foo = test.foo + 1
end end
TestTracker:track(world, function(changes) TestTracker.track(function(changes)
local added = 0 local added = 0
local changed = 0 local changed = 0
local removed = 0 local removed = 0
for e, data in changes.added() do
for e, data in changes.added() do
added+=1 added+=1
end end
for e, old, new in changes.changed() do for e, old, new in changes.changed() do
changed+=1 changed+=1
end end
for e in changes.removed() do for e in changes.removed() do
removed+=1 removed+=1
end end
CHECK(added == 0) CHECK(added == 0)
CHECK(changed == 1) CHECK(changed == 1)
CHECK(removed == 0) CHECK(removed == 0)
@ -706,19 +697,19 @@ TEST("world", function()
world:remove(e, Test) world:remove(e, Test)
TestTracker:track(world, function(changes) TestTracker.track(function(changes)
local added = 0 local added = 0
local changed = 0 local changed = 0
local removed = 0 local removed = 0
for e, data in changes.added() do for e, data in changes.added() do
added+=1 added+=1
end end
for e, old, new in changes.changed() do for e, old, new in changes.changed() do
changed+=1 changed+=1
end end
for e in changes.removed() do for e in changes.removed() do
removed+=1 removed+=1
end end
CHECK(added == 0) CHECK(added == 0)
CHECK(changed == 0) CHECK(changed == 0)
CHECK(removed == 1) CHECK(removed == 1)