276 lines
8.9 KiB
GDScript
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()
|