Files
2026-01-15 15:27:48 +01:00

276 lines
8.9 KiB
GDScript

extends GdUnitTestSuite
const TestSystemWithRelationship = preload("res://addons/gecs/tests/systems/s_test_with_relationship.gd")
const TestSystemWithoutRelationship = preload("res://addons/gecs/tests/systems/s_test_without_relationship.gd")
const TestSystemWithGroup = preload("res://addons/gecs/tests/systems/s_test_with_group.gd")
const TestSystemWithoutGroup = preload("res://addons/gecs/tests/systems/s_test_without_group.gd")
const TestSystemNonexistentGroup = preload("res://addons/gecs/tests/systems/s_test_nonexistent_group.gd")
var runner: GdUnitSceneRunner
var world: World
func before():
runner = scene_runner("res://addons/gecs/tests/test_scene.tscn")
world = runner.get_property("world")
ECS.world = world
func after_test():
world.purge(false)
func test_system_processes_entities_with_required_components():
# Create entities with the required components
var entity_a = TestA.new()
entity_a.add_component(C_TestA.new())
var entity_b = TestB.new()
entity_b.add_component(C_TestB.new())
var entity_c = TestC.new()
entity_c.add_component(C_TestC.new())
var entity_d = Entity.new()
entity_d.add_component(C_TestD.new())
# Add some entities before systems
world.add_entities([entity_a, entity_b])
world.add_system(TestASystem.new())
world.add_system(TestBSystem.new())
world.add_system(TestCSystem.new())
# add some entities after systems
world.add_entities([entity_c, entity_d])
# Run the systems once
world.process(0.1)
# Check the values of the components
assert_int(entity_a.get_component(C_TestA).value).is_equal(1)
assert_int(entity_b.get_component(C_TestB).value).is_equal(1)
assert_int(entity_c.get_component(C_TestC).value).is_equal(1)
# Doesn't get incremented because no systems picked it up
assert_int(entity_d.get_component(C_TestD).points).is_equal(0)
# override the component with a new one
entity_a.add_component(C_TestA.new())
# Run the systems again
world.process(0.1)
# Check the values of the components
assert_int(entity_a.get_component(C_TestA).value).is_equal(1) # This is one because we added a new component which replaced the old one
assert_int(entity_b.get_component(C_TestB).value).is_equal(2)
assert_int(entity_c.get_component(C_TestC).value).is_equal(2)
# Doesn't get incremented because no systems picked it up (still)
assert_int(entity_d.get_component(C_TestD).points).is_equal(0)
# FIXME: This test is failing system groups are not being set correctly (or they're being overidden somewhere)
func test_system_group_processes_entities_with_required_components():
# Create entities with the required components
var entity_a = TestA.new()
entity_a.add_component(C_TestA.new())
var entity_b = TestB.new()
entity_b.add_component(C_TestB.new())
var entity_c = TestC.new()
entity_c.add_component(C_TestC.new())
var entity_d = Entity.new()
entity_d.add_component(C_TestD.new())
# Add some entities before systems
world.add_entities([entity_a, entity_b])
var sys_a = TestASystem.new()
sys_a.group = "group1"
var sys_b = TestBSystem.new()
sys_b.group = "group1"
var sys_c = TestCSystem.new()
sys_c.group = "group2"
world.add_systems([sys_a, sys_b, sys_c])
# add some entities after systems
world.add_entities([entity_c, entity_d])
# Run the systems once by group
world.process(0.1, "group1")
world.process(0.1, "group2")
# Check the values of the components
assert_int(entity_a.get_component(C_TestA).value).is_equal(1)
assert_int(entity_b.get_component(C_TestB).value).is_equal(1)
assert_int(entity_c.get_component(C_TestC).value).is_equal(1)
# Doesn't get incremented because no systems picked it up
assert_int(entity_d.get_component(C_TestD).points).is_equal(0)
# override the component with a new one
entity_a.add_component(C_TestA.new())
# Run ALL the systems again (omitting the group means run the default group)
world.process(0.1)
# Check the values of the components
assert_int(entity_a.get_component(C_TestA).value).is_equal(0) # This is one because we added a new component which replaced the old one
assert_int(entity_b.get_component(C_TestB).value).is_equal(1)
assert_int(entity_c.get_component(C_TestC).value).is_equal(1)
# Doesn't get incremented because no systems picked it up (still)
assert_int(entity_d.get_component(C_TestD).points).is_equal(0)
func test_system_with_relationship_query():
# Test the bug: with_relationship and without_relationship returning same results in system query
var entity_with_rel = Entity.new()
var entity_without_rel = Entity.new()
var target = Entity.new()
# Only entity_with_rel has a relationship
entity_with_rel.add_relationship(Relationship.new(C_TestA.new(), target))
world.add_entity(entity_with_rel)
world.add_entity(entity_without_rel)
world.add_entity(target)
var system_with = TestSystemWithRelationship.new()
world.add_system(system_with)
# Process the system
world.process(0.1)
# System should only find entity_with_rel
assert_array(system_with.entities_found).has_size(1)
assert_bool(system_with.entities_found.has(entity_with_rel)).is_true()
assert_bool(system_with.entities_found.has(entity_without_rel)).is_false()
assert_bool(system_with.entities_found.has(target)).is_false()
func test_system_without_relationship_query():
# Test without_relationship in system context
var entity_with_rel = Entity.new()
var entity_without_rel = Entity.new()
var target = Entity.new()
# Only entity_with_rel has a relationship
entity_with_rel.add_relationship(Relationship.new(C_TestA.new(), target))
world.add_entity(entity_with_rel)
world.add_entity(entity_without_rel)
world.add_entity(target)
var system_without = TestSystemWithoutRelationship.new()
world.add_system(system_without)
# Process the system
world.process(0.1)
# System should find entity_without_rel and target (not entity_with_rel)
assert_bool(system_without.entities_found.has(entity_with_rel)).is_false()
assert_bool(system_without.entities_found.has(entity_without_rel)).is_true()
assert_bool(system_without.entities_found.has(target)).is_true()
func test_system_with_vs_without_relationship_different_results():
# Verify that with_relationship and without_relationship return DIFFERENT results
var entity_with_rel = Entity.new()
var entity_without_rel = Entity.new()
var target = Entity.new()
entity_with_rel.add_relationship(Relationship.new(C_TestA.new(), target))
world.add_entity(entity_with_rel)
world.add_entity(entity_without_rel)
world.add_entity(target)
var system_with = TestSystemWithRelationship.new()
var system_without = TestSystemWithoutRelationship.new()
world.add_system(system_with)
world.add_system(system_without)
# Process both systems
world.process(0.1)
# The two systems should find DIFFERENT entities
assert_bool(system_with.entities_found.has(entity_with_rel)).is_true()
assert_bool(system_without.entities_found.has(entity_with_rel)).is_false()
assert_bool(system_with.entities_found.has(entity_without_rel)).is_false()
assert_bool(system_without.entities_found.has(entity_without_rel)).is_true()
func test_system_with_group_query():
# Test with_group in system context
var entity_in_group = Entity.new()
var entity_not_in_group = Entity.new()
entity_in_group.add_to_group("TestGroup")
world.add_entity(entity_in_group)
world.add_entity(entity_not_in_group)
var system = TestSystemWithGroup.new()
world.add_system(system)
# Process the system
world.process(0.1)
# System should only find entity_in_group
assert_array(system.entities_found).has_size(1)
assert_bool(system.entities_found.has(entity_in_group)).is_true()
assert_bool(system.entities_found.has(entity_not_in_group)).is_false()
func test_system_without_group_query():
# Test without_group in system context
var entity_in_group = Entity.new()
var entity_not_in_group = Entity.new()
entity_in_group.add_to_group("TestGroup")
world.add_entity(entity_in_group)
world.add_entity(entity_not_in_group)
var system = TestSystemWithoutGroup.new()
world.add_system(system)
# Process the system
world.process(0.1)
# System should only find entity_not_in_group
assert_array(system.entities_found).has_size(1)
assert_bool(system.entities_found.has(entity_not_in_group)).is_true()
assert_bool(system.entities_found.has(entity_in_group)).is_false()
func test_system_nonexistent_group_query():
# Test the bug: querying for nonexistent group should return ZERO entities, not all
var entity1 = Entity.new()
var entity2 = Entity.new()
var entity3 = Entity.new()
entity1.add_to_group("GroupA")
entity2.add_to_group("GroupB")
# entity3 has no groups
world.add_entity(entity1)
world.add_entity(entity2)
world.add_entity(entity3)
var system = TestSystemNonexistentGroup.new()
world.add_system(system)
# Process the system
world.process(0.1)
# System should find ZERO entities (not all of them!)
assert_array(system.entities_found).has_size(0)
assert_bool(system.entities_found.has(entity1)).is_false()
assert_bool(system.entities_found.has(entity2)).is_false()
assert_bool(system.entities_found.has(entity3)).is_false()