Fix crash in commit() when all components were removed from entity
Fix crash from issue #2 and add unittest case for it. Also implements general "empty" entity support
This commit is contained in:
parent
beb1837c43
commit
8ac9fa5dbd
3 changed files with 185 additions and 42 deletions
100
tests/basic.d
100
tests/basic.d
|
|
@ -113,6 +113,31 @@ struct EmptySystem
|
|||
int count = 0;
|
||||
}
|
||||
|
||||
struct EntityCounterSystem
|
||||
{
|
||||
mixin ECS.System!1;
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
int thread_id;
|
||||
uint length;
|
||||
Entity[] entity;
|
||||
}
|
||||
|
||||
bool onBegin()
|
||||
{
|
||||
count = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData data)
|
||||
{
|
||||
count += data.length;
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
}
|
||||
|
||||
void beforeEveryTest()
|
||||
{
|
||||
becsID!CUnregistered = ushort.max;
|
||||
|
|
@ -243,7 +268,82 @@ unittest
|
|||
gEntityManager.commit();
|
||||
entity3 = gEntityManager.getEntity(id);
|
||||
assert(!entity3.getComponent!CUnregistered);
|
||||
}
|
||||
|
||||
@("AddEmptyEntity")
|
||||
unittest
|
||||
{
|
||||
struct OnAddRemoveChangeCounter
|
||||
{
|
||||
mixin ECS.System!1;
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
int thread_id;
|
||||
uint length;
|
||||
Entity[] entity;
|
||||
}
|
||||
|
||||
void onAddEntity(EntitiesData data)
|
||||
{
|
||||
add += data.length;
|
||||
}
|
||||
|
||||
void onRemoveEntity(EntitiesData data)
|
||||
{
|
||||
assert(0, "It's impossible to remove entity from being updated by system which accept empty entity");
|
||||
}
|
||||
|
||||
int add = 0;
|
||||
}
|
||||
|
||||
gEntityManager.beginRegister();
|
||||
|
||||
gEntityManager.registerSystem!EntityCounterSystem(0);
|
||||
gEntityManager.registerSystem!OnAddRemoveChangeCounter(1);
|
||||
|
||||
gEntityManager.endRegister();
|
||||
|
||||
CLong long_component = CLong(3);
|
||||
|
||||
Entity* entity = null;
|
||||
EntityID entity_id = gEntityManager.addEntity(null).id;
|
||||
|
||||
EntityCounterSystem* system = gEntityManager.getSystem!EntityCounterSystem;
|
||||
assert(system !is null);
|
||||
assert(system.count == 0);
|
||||
|
||||
OnAddRemoveChangeCounter* add_remove_change_system = gEntityManager.getSystem!OnAddRemoveChangeCounter;
|
||||
assert(add_remove_change_system !is null);
|
||||
assert(add_remove_change_system.add == 0);
|
||||
|
||||
gEntityManager.commit();
|
||||
assert(add_remove_change_system.add == 1);
|
||||
|
||||
entity = gEntityManager.getEntity(entity_id);
|
||||
assert(!entity.hasComponent(becsID!CLong));
|
||||
assert(entity.getComponent(becsID!CLong) is null);
|
||||
|
||||
|
||||
gEntityManager.begin();
|
||||
gEntityManager.update();
|
||||
assert(system.count == 1);
|
||||
gEntityManager.end();
|
||||
|
||||
gEntityManager.addEntityCopy(entity_id);
|
||||
gEntityManager.addEntityCopy(entity_id);
|
||||
gEntityManager.addComponents(entity_id, [ComponentRef(&long_component, becsID(long_component))].staticArray);
|
||||
gEntityManager.commit();
|
||||
assert(add_remove_change_system.add == 3, "onAddEntity missed");
|
||||
|
||||
entity = gEntityManager.getEntity(entity_id);
|
||||
assert(entity.hasComponent(becsID!CLong));
|
||||
assert(*entity.getComponent!CLong == 3);
|
||||
|
||||
gEntityManager.begin();
|
||||
gEntityManager.update();
|
||||
assert(system.count == 3);
|
||||
gEntityManager.end();
|
||||
}
|
||||
|
||||
//allocate templates
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue