More tests:

-removed some unused code
-fixed bug with struct destructors (Mallocator called __dtor instead of __xdtor)
-added unittests for events
-addded _d_eh_personality null implementation as LDC betterC bug workaround
This commit is contained in:
Mergul 2020-04-18 19:16:45 +02:00
parent d0b7138f9f
commit cb9eaad123
5 changed files with 160 additions and 19 deletions

View file

@ -311,7 +311,7 @@ unittest
void onDestroy()
{
(*destroy)++;
if(destroy)(*destroy)++;
}
void onEnable()
@ -456,6 +456,7 @@ unittest
gEM.end();
assert(system.end == 4);
ecs_system.enable();
system.destroy = null;
}
@("CustomPass")
@ -852,4 +853,142 @@ unittest
gEM.commit();
entity = gEM.getEntity(id);
assert(entity is null);
}
@("EventCallbacks")
unittest
{
struct ETest
{
mixin ECS.Event;
}
struct ETest2
{
mixin ECS.Event;
int super_liczba = 0;
}
struct TestSystem
{
mixin ECS.System;
struct EntitiesData
{
int length;
Entity[] entity;
@readonly CLong[] long_;
@optional CInt[] int_;
}
void onUpdate(EntitiesData data)
{
}
void handleEvent(Entity* entity, ETest event)
{
CLong* long_ = entity.getComponent!CLong;
CInt* int_ = entity.getComponent!CInt;
*long_ += 16;
if(int_)*int_ += 6;
}
void handleEvent(Entity* entity, ETest2 event)
{
CLong* long_ = entity.getComponent!CLong;
CInt* int_ = entity.getComponent!CInt;
*long_ += event.super_liczba * 2;
if(int_)*int_ += event.super_liczba * 4;
}
}
struct TestSystem2
{
mixin ECS.System;
struct EntitiesData
{
int length;
Entity[] entity;
CShort[] short_;
@optional CInt[] int_;
}
void handleEvent(Entity* entity, ETest event)
{
CShort* short_ = entity.getComponent!CShort;
CInt* int_ = entity.getComponent!CInt;
*short_ += 8;
if(int_)*int_ += 2;
}
void handleEvent(Entity* entity, ETest2 event)
{
CShort* short_ = entity.getComponent!CShort;
CInt* int_ = entity.getComponent!CInt;
*short_ += event.super_liczba;
if(int_)*int_ *= event.super_liczba;
}
}
gEM.beginRegister();
gEM.registerEvent!ETest;
gEM.registerEvent!ETest2;
gEM.registerSystem!TestSystem2(1);
gEM.registerSystem!TestSystem(0);
gEM.endRegister();
ushort[1] ids = [CLong.component_id];
EntityTemplate* tmpl = gEM.allocateTemplate(ids);
scope (exit) gEM.freeTemplate(tmpl);
ushort[1] ids2 = [CShort.component_id];
EntityTemplate* tmpl2 = gEM.allocateTemplate(ids2);
scope (exit) gEM.freeTemplate(tmpl2);
Entity* entity = gEM.addEntity(tmpl);
EntityID id = entity.id;
assert(*entity.getComponent!CLong == 10);
Entity* entity2 = gEM.addEntity(tmpl2);
EntityID id2 = entity2.id;
assert(*entity2.getComponent!CShort == 12);
gEM.sendEvent(id,ETest());
gEM.sendEvent(id,ETest2(id,10));
gEM.sendEvent(id2,ETest());
gEM.sendEvent(id2,ETest2(id2,12));
gEM.commit();
entity = gEM.getEntity(id);
entity2 = gEM.getEntity(id2);
assert(*entity.getComponent!CLong == 46);
assert(*entity2.getComponent!CShort == 32);
gEM.addComponents(id, CInt(2), CShort(1));
gEM.sendEvent(id,ETest());
gEM.sendEvent(id,ETest2(id,2));
gEM.commit();
entity = gEM.getEntity(id);
assert(*entity.getComponent!CLong == 66);
assert(*entity.getComponent!CInt == 36);
//test for multiple event blocks
long result = *entity.getComponent!CLong;
foreach(i;0..10000)
{
gEM.sendEvent(id,ETest());
gEM.sendEvent(id,ETest2(id,4));
result += 16;
result += 8;
}
gEM.commit();
entity = gEM.getEntity(id);
assert(*entity.getComponent!CLong == result);
//cover funcion to clearEvents before destroying manager
gEM.sendEvent(id,ETest());
}