Properly link flecs library
This commit is contained in:
777
engine/libs/flecs/test/api/src/ObserverOnSet.c
Normal file
777
engine/libs/flecs/test/api/src/ObserverOnSet.c
Normal file
@@ -0,0 +1,777 @@
|
||||
#include <api.h>
|
||||
|
||||
static
|
||||
void OnPosition(ecs_iter_t *it) {
|
||||
probe_iter(it);
|
||||
}
|
||||
|
||||
static
|
||||
void Add_to_current(ecs_iter_t *it) {
|
||||
IterData *ctx = ecs_get_ctx(it->world);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < it->count; i ++) {
|
||||
if (ctx->component) {
|
||||
ecs_add_id(it->world, it->entities[i], ctx->component);
|
||||
|
||||
test_assert( !!ecs_get_type(it->world, it->entities[i]));
|
||||
}
|
||||
|
||||
if (ctx->component_2) {
|
||||
ecs_add_id(it->world, it->entities[i], ctx->component_2);
|
||||
}
|
||||
|
||||
ctx->entity_count ++;
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void Remove_from_current(ecs_iter_t *it) {
|
||||
IterData *ctx = ecs_get_ctx(it->world);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < it->count; i ++) {
|
||||
ecs_entity_t e = it->entities[i];
|
||||
|
||||
if (ctx->component) {
|
||||
ecs_remove_id(it->world, e, ctx->component);
|
||||
}
|
||||
|
||||
if (ctx->component_2) {
|
||||
ecs_remove_id(it->world, e, ctx->component_2);
|
||||
}
|
||||
|
||||
ctx->entity_count ++;
|
||||
}
|
||||
}
|
||||
|
||||
static Probe pv_probe;
|
||||
|
||||
static
|
||||
void On_PV(ecs_iter_t *it) {
|
||||
Position *p = ecs_field(it, Position, 1);
|
||||
Velocity *v = ecs_field(it, Velocity, 2);
|
||||
|
||||
probe_system_w_ctx(it, &pv_probe);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < it->count; i ++) {
|
||||
p[i].x += v[i].x;
|
||||
p[i].y += v[i].y;
|
||||
}
|
||||
}
|
||||
|
||||
void ObserverOnSet_set_1_of_1(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Position);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Position, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 1);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], 0);
|
||||
|
||||
ecs_os_zeromem(&ctx);
|
||||
|
||||
ecs_add(world, e, Velocity);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Velocity, {10, 20});
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Position, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 1);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_set_1_of_2(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position, Velocity);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Position);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Position, {10, 20});
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add(world, e, Velocity);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Velocity, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 2);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], 0);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
|
||||
ecs_os_zeromem(&ctx);
|
||||
|
||||
ecs_set(world, e, Position, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 2);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], 0);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_set_1_of_3(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_COMPONENT(world, Mass);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position, Velocity, Mass);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Position);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Position, {10, 20});
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add(world, e, Velocity);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add(world, e, Mass);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Velocity, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 3);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], 0);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
test_int(ctx.c[0][2], ecs_id(Mass));
|
||||
test_int(ctx.s[0][2], 0);
|
||||
|
||||
ecs_os_zeromem(&ctx);
|
||||
|
||||
ecs_set(world, e, Position, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 3);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], 0);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
test_int(ctx.c[0][2], ecs_id(Mass));
|
||||
test_int(ctx.s[0][2], 0);
|
||||
|
||||
ecs_os_zeromem(&ctx);
|
||||
|
||||
ecs_set(world, e, Mass, {10});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 3);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], 0);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
test_int(ctx.c[0][2], ecs_id(Mass));
|
||||
test_int(ctx.s[0][2], 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_set_1_of_2_1_from_base(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_ENTITY(world, Base, Position);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position(self|up), Velocity);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new_w_pair(world, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add(world, e, Velocity);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Velocity, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 2);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], Base);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_set_1_of_3_1_from_base(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_COMPONENT(world, Mass);
|
||||
ECS_ENTITY(world, Base, Position);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position(self|up), Velocity, Mass);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new_w_pair(world, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add(world, e, Velocity);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add(world, e, Mass);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Velocity, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 3);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], Base);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
test_int(ctx.c[0][2], ecs_id(Mass));
|
||||
test_int(ctx.s[0][2], 0);
|
||||
|
||||
ecs_os_zeromem(&ctx);
|
||||
|
||||
ecs_set(world, e, Mass, {10});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 3);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], Base);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
test_int(ctx.c[0][2], ecs_id(Mass));
|
||||
test_int(ctx.s[0][2], 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_add_base(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_ENTITY(world, Base, Position);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position(self|up), Velocity);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Velocity);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add_pair(world, e, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 2);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], Base);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_add_base_to_1_overridden(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_ENTITY(world, Base, Position);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position(self|up));
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Position);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add_pair(world, e, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_add_base_to_2_overridden(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_ENTITY(world, Base, Position, Velocity);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position(self|up), Velocity(self|up));
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Position);
|
||||
ecs_add(world, e, Velocity);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add_pair(world, e, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_add_base_to_1_of_2_overridden(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_ENTITY(world, Base, Position, Velocity);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position(self|up));
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Velocity);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add_pair(world, e, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 1);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], Base);
|
||||
|
||||
ecs_os_zeromem(&ctx);
|
||||
|
||||
e = ecs_new(world, Position);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add_pair(world, e, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_on_set_after_remove_override(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_ENTITY(world, Base, Position);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Position);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add_pair(world, e, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_remove(world, e, Position);
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 1);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], Base);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_no_set_after_remove_base(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_ENTITY(world, Base, Position);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position(self|up));
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Position);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add_pair(world, e, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_remove_id(world, e, ecs_pair(EcsIsA, Base));
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_un_set_after_remove(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_OBSERVER(world, OnPosition, EcsUnSet, Position);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Position);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_remove(world, e, Position);
|
||||
test_int(ctx.invoked, 1);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_un_set_after_remove_base(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_ENTITY(world, Base, Position);
|
||||
ECS_OBSERVER(world, OnPosition, EcsUnSet, Position(self|up));
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, 0);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_add_pair(world, e, EcsIsA, Base);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_remove_id(world, e, ecs_pair(EcsIsA, Base));
|
||||
test_int(ctx.invoked, 1);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_add_to_current_in_on_set(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_OBSERVER(world, Add_to_current, EcsOnSet, Position);
|
||||
|
||||
IterData ctx = {.component = ecs_id(Velocity)};
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
/* Create entities from scratch so they don't have the EcsName component */
|
||||
ecs_entity_t e1 = ecs_set(world, 0, Position, {10, 20});
|
||||
ecs_entity_t e2 = ecs_set(world, 0, Position, {11, 21});
|
||||
ecs_entity_t e3 = ecs_set(world, 0, Position, {12, 22});
|
||||
|
||||
test_assert( ecs_has(world, e1, Position));
|
||||
test_assert( ecs_has(world, e2, Position));
|
||||
test_assert( ecs_has(world, e3, Position));
|
||||
|
||||
test_assert( ecs_has(world, e1, Velocity));
|
||||
test_assert( ecs_has(world, e2, Velocity));
|
||||
test_assert( ecs_has(world, e3, Velocity));
|
||||
|
||||
const Position *p = ecs_get(world, e1, Position);
|
||||
test_int(p->x, 10);
|
||||
test_int(p->y, 20);
|
||||
|
||||
p = ecs_get(world, e2, Position);
|
||||
test_int(p->x, 11);
|
||||
test_int(p->y, 21);
|
||||
|
||||
p = ecs_get(world, e3, Position);
|
||||
test_int(p->x, 12);
|
||||
test_int(p->y, 22);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_remove_from_current_in_on_set(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_OBSERVER(world, Remove_from_current, EcsOnSet, Position);
|
||||
|
||||
IterData ctx = {.component = ecs_id(Velocity)};
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
/* Create entities from scratch so they don't have the EcsName component */
|
||||
ECS_ENTITY(world, e1, Position, Velocity);
|
||||
ECS_ENTITY(world, e2, Position, Velocity);
|
||||
ECS_ENTITY(world, e3, Position, Velocity);
|
||||
|
||||
e1 = ecs_set(world, e1, Position, {10, 20});
|
||||
e2 = ecs_set(world, e2, Position, {11, 21});
|
||||
e3 = ecs_set(world, e3, Position, {12, 22});
|
||||
|
||||
test_assert( ecs_has(world, e1, Position));
|
||||
test_assert( ecs_has(world, e2, Position));
|
||||
test_assert( ecs_has(world, e3, Position));
|
||||
|
||||
test_assert( !ecs_has(world, e1, Velocity));
|
||||
test_assert( !ecs_has(world, e2, Velocity));
|
||||
test_assert( !ecs_has(world, e3, Velocity));
|
||||
|
||||
const Position *p = ecs_get(world, e1, Position);
|
||||
test_int(p->x, 10);
|
||||
test_int(p->y, 20);
|
||||
|
||||
p = ecs_get(world, e2, Position);
|
||||
test_int(p->x, 11);
|
||||
test_int(p->y, 21);
|
||||
|
||||
p = ecs_get(world, e3, Position);
|
||||
test_int(p->x, 12);
|
||||
test_int(p->y, 22);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_remove_set_component_in_on_set(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_OBSERVER(world, Remove_from_current, EcsOnSet, Position);
|
||||
|
||||
IterData ctx = {.component = ecs_id(Position)};
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
/* Create entities from scratch so they don't have the EcsName component */
|
||||
ECS_ENTITY(world, e1, Position, Velocity);
|
||||
ECS_ENTITY(world, e2, Position, Velocity);
|
||||
ECS_ENTITY(world, e3, Position, Velocity);
|
||||
|
||||
e1 = ecs_set(world, e1, Position, {10, 20});
|
||||
e2 = ecs_set(world, e2, Position, {11, 21});
|
||||
e3 = ecs_set(world, e3, Position, {12, 22});
|
||||
|
||||
test_assert( !ecs_has(world, e1, Position));
|
||||
test_assert( !ecs_has(world, e2, Position));
|
||||
test_assert( !ecs_has(world, e3, Position));
|
||||
|
||||
test_assert( ecs_has(world, e1, Velocity));
|
||||
test_assert( ecs_has(world, e2, Velocity));
|
||||
test_assert( ecs_has(world, e3, Velocity));
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_match_table_created_w_add_in_on_set(void) {
|
||||
ecs_world_t *world = ecs_init();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_COMPONENT(world, Mass);
|
||||
|
||||
ECS_OBSERVER(world, Add_to_current, EcsOnSet, Position);
|
||||
ECS_SYSTEM(world, On_PV, EcsOnUpdate, Position, Velocity);
|
||||
|
||||
IterData add_ctx = {.component = ecs_id(Velocity)};
|
||||
ecs_set_ctx(world, &add_ctx, NULL);
|
||||
|
||||
ecs_entity_t e1 = ecs_set(world, 0, Position, {10, 20});
|
||||
ecs_entity_t e2 = ecs_set(world, 0, Position, {10, 20});
|
||||
ecs_entity_t e3 = ecs_set(world, 0, Position, {10, 20});
|
||||
|
||||
ecs_progress(world, 1);
|
||||
|
||||
test_int(pv_probe.count, 3);
|
||||
test_int(pv_probe.invoked, 1);
|
||||
test_int(pv_probe.system, On_PV);
|
||||
test_int(pv_probe.term_count, 2);
|
||||
test_null(pv_probe.param);
|
||||
|
||||
test_int(pv_probe.e[0], e1);
|
||||
test_int(pv_probe.e[1], e2);
|
||||
test_int(pv_probe.e[2], e3);
|
||||
test_int(pv_probe.c[0][0], ecs_id(Position));
|
||||
test_int(pv_probe.s[0][0], 0);
|
||||
test_int(pv_probe.c[0][1], ecs_id(Velocity));
|
||||
test_int(pv_probe.s[0][1], 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_set_optional(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position, ?Velocity);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_new(world, Position);
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_set(world, e, Position, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 2);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], 0);
|
||||
|
||||
ecs_os_zeromem(&ctx);
|
||||
|
||||
ecs_set(world, e, Velocity, {10, 20});
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
void ObserverOnSet_set_from_nothing(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_OBSERVER(world, OnPosition, EcsOnSet, Position, Velocity());
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
ecs_entity_t e = ecs_set(world, 0, Position, {10, 20});
|
||||
test_int(ctx.invoked, 1);
|
||||
test_int(ctx.count, 1);
|
||||
test_int(ctx.system, OnPosition);
|
||||
test_int(ctx.term_count, 2);
|
||||
test_null(ctx.param);
|
||||
|
||||
test_int(ctx.e[0], e);
|
||||
test_int(ctx.c[0][0], ecs_id(Position));
|
||||
test_int(ctx.s[0][0], 0);
|
||||
test_int(ctx.c[0][1], ecs_id(Velocity));
|
||||
test_int(ctx.s[0][1], 0);
|
||||
|
||||
ecs_os_zeromem(&ctx);
|
||||
ecs_set(world, e, Velocity, {10, 20});
|
||||
test_int(ctx.invoked, 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
|
||||
static
|
||||
void Add0(ecs_iter_t *it) {
|
||||
probe_iter(it);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < it->count; i ++) {
|
||||
ecs_add_id(it->world, it->entities[i], 0);
|
||||
}
|
||||
}
|
||||
|
||||
void ObserverOnSet_add_0_entity_in_on_set(void) {
|
||||
install_test_abort();
|
||||
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_COMPONENT(world, Velocity);
|
||||
ECS_OBSERVER(world, Add0, EcsOnSet, Position);
|
||||
|
||||
Probe ctx = { 0 };
|
||||
ecs_set_ctx(world, &ctx, NULL);
|
||||
|
||||
test_expect_abort();
|
||||
ecs_set(world, 0, Position, {10, 20});
|
||||
}
|
||||
|
||||
static int dummy_invoked = 0;
|
||||
|
||||
static
|
||||
void Dummy(ecs_iter_t *it) {
|
||||
dummy_invoked ++;
|
||||
}
|
||||
|
||||
void ObserverOnSet_on_set_prefab(void) {
|
||||
ecs_world_t *world = ecs_mini();
|
||||
|
||||
ECS_COMPONENT(world, Position);
|
||||
ECS_OBSERVER(world, Dummy, EcsOnSet, Position);
|
||||
|
||||
ECS_PREFAB(world, Prefab, 0);
|
||||
ecs_set(world, Prefab, Position, {10, 20});
|
||||
|
||||
test_int(dummy_invoked, 0);
|
||||
|
||||
ecs_fini(world);
|
||||
}
|
||||
Reference in New Issue
Block a user