mirror of
				https://github.com/Ukendio/jecs.git
				synced 2025-11-03 18:39:19 +00:00 
			
		
		
		
	Cleanup tests
This commit is contained in:
		
							parent
							
								
									917c951d55
								
							
						
					
					
						commit
						b0e73857b9
					
				
					 1 changed files with 89 additions and 147 deletions
				
			
		
							
								
								
									
										236
									
								
								test/tests.luau
									
									
									
									
									
								
							
							
						
						
									
										236
									
								
								test/tests.luau
									
									
									
									
									
								
							| 
						 | 
					@ -24,137 +24,6 @@ type Id<T=unknown> = jecs.Id<T>
 | 
				
			||||||
local entity_visualiser = require("@tools/entity_visualiser")
 | 
					local entity_visualiser = require("@tools/entity_visualiser")
 | 
				
			||||||
local dwi = entity_visualiser.stringify
 | 
					local dwi = entity_visualiser.stringify
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SKIP()
 | 
					 | 
				
			||||||
TEST("jecs delete", function()
 | 
					 | 
				
			||||||
	do CASE "delete children"
 | 
					 | 
				
			||||||
		local world = jecs.world()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local Health = world:component()
 | 
					 | 
				
			||||||
		local Poison = world:component()
 | 
					 | 
				
			||||||
		local FriendsWith = world:component()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local e = world:entity()
 | 
					 | 
				
			||||||
		world:set(e, Poison, 5)
 | 
					 | 
				
			||||||
		world:set(e, Health, 50)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local children = {}
 | 
					 | 
				
			||||||
		for i = 1, 10 do
 | 
					 | 
				
			||||||
			local child = world:entity()
 | 
					 | 
				
			||||||
			world:set(child, Poison, 9999)
 | 
					 | 
				
			||||||
			world:set(child, Health, 100)
 | 
					 | 
				
			||||||
			world:add(child, pair(jecs.ChildOf, e))
 | 
					 | 
				
			||||||
			table.insert(children, child)
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		BENCH("delete children of entity", function()
 | 
					 | 
				
			||||||
			world:delete(e)
 | 
					 | 
				
			||||||
		end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for i, child in children do
 | 
					 | 
				
			||||||
			CHECK(not world:contains(child))
 | 
					 | 
				
			||||||
			CHECK(not world:has(child, pair(jecs.ChildOf, e)))
 | 
					 | 
				
			||||||
			CHECK(not world:has(child, Health))
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		e = world:entity()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local friends = {}
 | 
					 | 
				
			||||||
		for i = 1, 10 do
 | 
					 | 
				
			||||||
			local friend = world:entity()
 | 
					 | 
				
			||||||
			world:set(friend, Poison, 9999)
 | 
					 | 
				
			||||||
			world:set(friend, Health, 100)
 | 
					 | 
				
			||||||
			world:add(friend, pair(FriendsWith, e))
 | 
					 | 
				
			||||||
			for j = 1, 10 do
 | 
					 | 
				
			||||||
				world:add(friend, world:component())
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
			table.insert(friends, friend)
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		BENCH("remove friends of entity", function()
 | 
					 | 
				
			||||||
			world:delete(e)
 | 
					 | 
				
			||||||
		end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for i, friend in friends do
 | 
					 | 
				
			||||||
			CHECK(not world:has(friend, pair(FriendsWith, e)))
 | 
					 | 
				
			||||||
			CHECK(world:has(friend, Health))
 | 
					 | 
				
			||||||
			CHECK(world:contains(friend))
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST("pepe", function()
 | 
					 | 
				
			||||||
	local world = jecs.world()
 | 
					 | 
				
			||||||
	local t = world:entity()
 | 
					 | 
				
			||||||
	local c = world:component()
 | 
					 | 
				
			||||||
	world:add(c, t)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local component = world:component()
 | 
					 | 
				
			||||||
	local lifetime = world:component()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local tag = world:entity()
 | 
					 | 
				
			||||||
	local rel1 = world:entity()
 | 
					 | 
				
			||||||
	local rel2 = world:entity()
 | 
					 | 
				
			||||||
	local rel3 = world:entity()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local destroyed = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	world:removed(lifetime, function(e)
 | 
					 | 
				
			||||||
	    destroyed = true
 | 
					 | 
				
			||||||
	end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local parent = world:entity()
 | 
					 | 
				
			||||||
	world:set(parent, component, "foo")
 | 
					 | 
				
			||||||
	world:add(parent, jecs.pair(rel1, component))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local other1 = world:entity()
 | 
					 | 
				
			||||||
	world:add(other1, tag)
 | 
					 | 
				
			||||||
	world:add(other1, jecs.pair(jecs.ChildOf, parent))
 | 
					 | 
				
			||||||
	world:add(other1, jecs.pair(rel1, component))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local child = world:entity()
 | 
					 | 
				
			||||||
	world:set(child, lifetime, "")
 | 
					 | 
				
			||||||
	world:add(child, jecs.pair(jecs.ChildOf, parent))
 | 
					 | 
				
			||||||
	world:add(child, jecs.pair(rel3, parent))
 | 
					 | 
				
			||||||
	world:add(child, jecs.pair(rel2, other1))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	world:delete(parent)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	CHECK(destroyed)
 | 
					 | 
				
			||||||
	CHECK(not world:contains(child))
 | 
					 | 
				
			||||||
end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST("ardi", function()
 | 
					 | 
				
			||||||
	local world = jecs.world()
 | 
					 | 
				
			||||||
	local r = world:entity()
 | 
					 | 
				
			||||||
	world:add(r, jecs.pair(jecs.OnDelete, jecs.Delete))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local e = world:entity()
 | 
					 | 
				
			||||||
	local e1 = world:entity()
 | 
					 | 
				
			||||||
	world:add(e, jecs.pair(r, e1))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	world:delete(r)
 | 
					 | 
				
			||||||
	CHECK(not world:contains(e))
 | 
					 | 
				
			||||||
end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST("dai", function()
 | 
					 | 
				
			||||||
	local world = jecs.world()
 | 
					 | 
				
			||||||
	local C = world:component()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	world:set(C, jecs.Name, "C")
 | 
					 | 
				
			||||||
	CHECK(world:get(C, jecs.Name) == "C")
 | 
					 | 
				
			||||||
	world:entity(2000)
 | 
					 | 
				
			||||||
	CHECK(world:get(C, jecs.Name) == "C")
 | 
					 | 
				
			||||||
end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST("another axen banger", function()
 | 
					 | 
				
			||||||
	-- taken from jecs.luau
 | 
					 | 
				
			||||||
	local world = jecs.world()
 | 
					 | 
				
			||||||
	world:range(2000, 3000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local e0v1_id = jecs.ECS_COMBINE(1000, 1) -- id can be both within or outside the world's range
 | 
					 | 
				
			||||||
	local e0v1 = world:entity(e0v1_id)
 | 
					 | 
				
			||||||
	assert(world:contains(e0v1)) -- fails
 | 
					 | 
				
			||||||
end)
 | 
					 | 
				
			||||||
TEST("Ensure archetype edges get cleaned", function()
 | 
					TEST("Ensure archetype edges get cleaned", function()
 | 
				
			||||||
	local A = jecs.component()
 | 
						local A = jecs.component()
 | 
				
			||||||
	local B = jecs.component()
 | 
						local B = jecs.component()
 | 
				
			||||||
| 
						 | 
					@ -189,6 +58,7 @@ TEST("Ensure archetype edges get cleaned", function()
 | 
				
			||||||
		CHECK(false)
 | 
							CHECK(false)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST("repeated entity cached query", function()
 | 
					TEST("repeated entity cached query", function()
 | 
				
			||||||
	local pair = jecs.pair
 | 
						local pair = jecs.pair
 | 
				
			||||||
	local world = jecs.world()
 | 
						local world = jecs.world()
 | 
				
			||||||
| 
						 | 
					@ -900,6 +770,60 @@ TEST("world:contains()", function()
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST("world:delete()", function()
 | 
					TEST("world:delete()", function()
 | 
				
			||||||
 | 
						do CASE "OnDelete cleanup policy cascades deletion to entites with idr_r pairs"
 | 
				
			||||||
 | 
							local world = jecs.world()
 | 
				
			||||||
 | 
							local r = world:entity()
 | 
				
			||||||
 | 
							world:add(r, jecs.pair(jecs.OnDelete, jecs.Delete))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local e = world:entity()
 | 
				
			||||||
 | 
							local e1 = world:entity()
 | 
				
			||||||
 | 
							world:add(e, jecs.pair(r, e1))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							world:delete(r)
 | 
				
			||||||
 | 
							CHECK(not world:contains(e))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						do CASE "OnDeleteTarget works correctly regardless of adjacent archetype iteration order"
 | 
				
			||||||
 | 
							local world = jecs.world()
 | 
				
			||||||
 | 
							local t = world:entity()
 | 
				
			||||||
 | 
							local c = world:component()
 | 
				
			||||||
 | 
							world:add(c, t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local component = world:component()
 | 
				
			||||||
 | 
							local lifetime = world:component()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local tag = world:entity()
 | 
				
			||||||
 | 
							local rel1 = world:entity()
 | 
				
			||||||
 | 
							local rel2 = world:entity()
 | 
				
			||||||
 | 
							local rel3 = world:entity()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local destroyed = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							world:removed(lifetime, function(e)
 | 
				
			||||||
 | 
							    destroyed = true
 | 
				
			||||||
 | 
							end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local parent = world:entity()
 | 
				
			||||||
 | 
							world:set(parent, component, "foo")
 | 
				
			||||||
 | 
							world:add(parent, jecs.pair(rel1, component))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local other1 = world:entity()
 | 
				
			||||||
 | 
							world:add(other1, tag)
 | 
				
			||||||
 | 
							world:add(other1, jecs.pair(jecs.ChildOf, parent))
 | 
				
			||||||
 | 
							world:add(other1, jecs.pair(rel1, component))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local child = world:entity()
 | 
				
			||||||
 | 
							world:set(child, lifetime, "")
 | 
				
			||||||
 | 
							world:add(child, jecs.pair(jecs.ChildOf, parent))
 | 
				
			||||||
 | 
							world:add(child, jecs.pair(rel3, parent))
 | 
				
			||||||
 | 
							world:add(child, jecs.pair(rel2, other1))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							world:delete(parent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							CHECK(destroyed)
 | 
				
			||||||
 | 
							CHECK(not world:contains(child))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	do CASE "Should delete children in different archetypes if they have the same parent"
 | 
						do CASE "Should delete children in different archetypes if they have the same parent"
 | 
				
			||||||
		local world = jecs.world()
 | 
							local world = jecs.world()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1523,7 +1447,7 @@ TEST("world:range()", function()
 | 
				
			||||||
		CHECK(world.entity_index.alive_count == 400)
 | 
							CHECK(world.entity_index.alive_count == 400)
 | 
				
			||||||
		CHECK(e)
 | 
							CHECK(e)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	do CASE "axen"
 | 
						do CASE "entity ID reuse works correctly across different world ranges"
 | 
				
			||||||
		local base = jecs.world()
 | 
							local base = jecs.world()
 | 
				
			||||||
		base:range(1_000, 2_000)
 | 
							base:range(1_000, 2_000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1635,6 +1559,24 @@ TEST("world:range()", function()
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST("world:entity()", function()
 | 
					TEST("world:entity()", function()
 | 
				
			||||||
 | 
						do CASE "entity mirroring preserves IDs across world ranges"
 | 
				
			||||||
 | 
							local world = jecs.world()
 | 
				
			||||||
 | 
							world:range(2000, 3000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local e0v1_id = jecs.ECS_COMBINE(1000, 1) -- id can be both within or outside the world's range
 | 
				
			||||||
 | 
							local e0v1 = world:entity(e0v1_id)
 | 
				
			||||||
 | 
							CHECK(world:contains(e0v1)) -- fails
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						do CASE "component names persist after entity creation"
 | 
				
			||||||
 | 
							local world = jecs.world()
 | 
				
			||||||
 | 
							local C = world:component()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							world:set(C, jecs.Name, "C")
 | 
				
			||||||
 | 
							CHECK(world:get(C, jecs.Name) == "C")
 | 
				
			||||||
 | 
							world:entity(2000)
 | 
				
			||||||
 | 
							CHECK(world:get(C, jecs.Name) == "C")
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
	do CASE "desired id"
 | 
						do CASE "desired id"
 | 
				
			||||||
		local world = jecs.world()
 | 
							local world = jecs.world()
 | 
				
			||||||
		local id = world:entity()
 | 
							local id = world:entity()
 | 
				
			||||||
| 
						 | 
					@ -2025,21 +1967,21 @@ TEST("world:query()", function()
 | 
				
			||||||
		local q = world:query(unpack(components))
 | 
							local q = world:query(unpack(components))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for entity, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o in q do
 | 
							for entity, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o in q do
 | 
				
			||||||
			CHECK(a::any == 13 ^ 1)
 | 
								CHECK(a == 13 ^ 1)
 | 
				
			||||||
			CHECK(b::any == 13 ^ 2)
 | 
								CHECK(b == 13 ^ 2)
 | 
				
			||||||
			CHECK(c::any == 13 ^ 3)
 | 
								CHECK(c == 13 ^ 3)
 | 
				
			||||||
			CHECK(d::any == 13 ^ 4)
 | 
								CHECK(d == 13 ^ 4)
 | 
				
			||||||
			CHECK(e::any == 13 ^ 5)
 | 
								CHECK(e == 13 ^ 5)
 | 
				
			||||||
			CHECK(f::any == 13 ^ 6)
 | 
								CHECK(f == 13 ^ 6)
 | 
				
			||||||
			CHECK(g::any == 13 ^ 7)
 | 
								CHECK(g == 13 ^ 7)
 | 
				
			||||||
			CHECK(h::any == 13 ^ 8)
 | 
								CHECK(h == 13 ^ 8)
 | 
				
			||||||
			CHECK(i::any == 13 ^ 9)
 | 
								CHECK(i == 13 ^ 9)
 | 
				
			||||||
			CHECK(j::any == 13 ^ 10)
 | 
								CHECK(j == 13 ^ 10)
 | 
				
			||||||
			CHECK(k::any == 13 ^ 11)
 | 
								CHECK(k == 13 ^ 11)
 | 
				
			||||||
			CHECK(l::any == 13 ^ 12)
 | 
								CHECK(l == 13 ^ 12)
 | 
				
			||||||
			CHECK(m::any == 13 ^ 13)
 | 
								CHECK(m == 13 ^ 13)
 | 
				
			||||||
			CHECK(n::any == 13 ^ 14)
 | 
								CHECK(n == 13 ^ 14)
 | 
				
			||||||
			CHECK(o::any == 13 ^ 15)
 | 
								CHECK(o == 13 ^ 15)
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue