Files
PixelDefense/engine/libs/flecs/test/api/src/FixedHierarchies.c

3962 lines
146 KiB
C

#include <api.h>
void FixedHierarchies_make_fixed_1_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_1_lvl_w_init(void) {
ecs_world_t *world = ecs_init();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_1_lvl_w_init_comp(void) {
ecs_world_t *world = ecs_init();
ECS_COMPONENT(world, Position);
ecs_set_hooks(world, Position, {
.ctor = ecs_default_ctor
});
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1_1, Position, {10, 20});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2_1, Position, {30, 40});
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
{
const Position *p = ecs_get(world, p_1_1, Position);
test_assert(p != NULL);
test_int(p->x, 10);
test_int(p->y, 20);
}
{
const Position *p = ecs_get(world, p_2_1, Position);
test_assert(p != NULL);
test_int(p->x, 30);
test_int(p->y, 40);
}
ecs_fini(world);
}
void FixedHierarchies_make_fixed_1_lvl_w_init_comp_after_tree_fixed(void) {
ecs_world_t *world = ecs_init();
ECS_COMPONENT(world, Position);
ecs_set_hooks(world, Position, {
.ctor = ecs_default_ctor
});
ecs_entity_t rel = ecs_new_id(world);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1_1, Position, {10, 20});
ecs_set_pair_second(world, p_1_1, rel, Position, {100, 200});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2_1, Position, {30, 40});
ecs_set_pair_second(world, p_2_1, rel, Position, {300, 400});
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
{
const Position *p = ecs_get(world, p_1_1, Position);
test_assert(p != NULL);
test_int(p->x, 10);
test_int(p->y, 20);
}
{
const Position *p = ecs_get(world, p_2_1, Position);
test_assert(p != NULL);
test_int(p->x, 30);
test_int(p->y, 40);
}
ecs_fini(world);
}
void FixedHierarchies_make_fixed_1_lvl_2_entities(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_2 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_2 = ecs_new_w_pair(world, EcsChildOf, p_2);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_1_2));
test_assert(ecs_get_table(world, p_2_1) == ecs_get_table(world, p_2_2));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_2, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_2, EcsChildOf, 0) == p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_1_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_2));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_2, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_2, EcsChildOf, 0) == p_2);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_1_lvl_2_tables(void) {
ecs_world_t *world = ecs_mini();
ECS_TAG(world, Tag);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_2 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_add(world, p_1_2, Tag);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_2 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_add(world, p_2_2, Tag);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_2) != ecs_get_table(world, p_2_2));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_2, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_2, EcsChildOf, 0) == p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_2) == ecs_get_table(world, p_2_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_1_2));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_2, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_2, EcsChildOf, 0) == p_2);
test_assert(ecs_has(world, p_1_2, Tag));
test_assert(ecs_has(world, p_2_2, Tag));
ecs_fini(world);
}
void FixedHierarchies_make_fixed_2_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_2_lvl_2_tables(void) {
ecs_world_t *world = ecs_mini();
ECS_TAG(world, Tag);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_entity_t p_1_1_2 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_add(world, p_1_1_2, Tag);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_entity_t p_2_1_2 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_add(world, p_2_1_2, Tag);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_1_1_2));
test_assert(ecs_get_table(world, p_2_1_1) != ecs_get_table(world, p_2_1_2));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_2) == ecs_get_table(world, p_2_1_2));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_1_1_2));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_has(world, p_1_1_2, Tag));
test_assert(ecs_has(world, p_2_1_2, Tag));
ecs_fini(world);
}
void FixedHierarchies_make_fixed_3_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_entity_t p_1_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_entity_t p_2_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1_1);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_3_lvl_w_name(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_1_1_1 = ecs_new_entity(world, "p._1._1._1");
ecs_entity_t p_1_1_1_1 = ecs_new_entity(world, "p._1._1._1._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_entity_t p_2_1_1 = ecs_new_entity(world, "p._2._1._1");
ecs_entity_t p_2_1_1_1 = ecs_new_entity(world, "p._2._1._1._1");
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_3_2_lvl_w_name(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_1_1_1 = ecs_new_entity(world, "p._1._1._1");
ecs_entity_t p_1_1_1_1 = ecs_new_entity(world, "p._1._1._1._1");
ecs_entity_t p_1_1_2 = ecs_new_entity(world, "p._1._1._2");
ecs_entity_t p_1_1_2_1 = ecs_new_entity(world, "p._1._1._2._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_entity_t p_2_1_1 = ecs_new_entity(world, "p._2._1._1");
ecs_entity_t p_2_1_1_1 = ecs_new_entity(world, "p._2._1._1._1");
ecs_entity_t p_2_1_2 = ecs_new_entity(world, "p._2._1._2");
ecs_entity_t p_2_1_2_1 = ecs_new_entity(world, "p._2._1._2._1");
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1_1) != ecs_get_table(world, p_1_1_2_1));
test_assert(ecs_get_table(world, p_2_1_1_1) != ecs_get_table(world, p_2_1_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_2, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_1_1_2_1, EcsChildOf, 0) == p_1_1_2);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_2, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
test_assert(ecs_get_target(world, p_2_1_2_1, EcsChildOf, 0) == p_2_1_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1_1) == ecs_get_table(world, p_1_1_2_1));
test_assert(ecs_get_table(world, p_2_1_1_1) == ecs_get_table(world, p_2_1_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_2, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_1_1_2_1, EcsChildOf, 0) == p_1_1_2);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_2, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
test_assert(ecs_get_target(world, p_2_1_2_1, EcsChildOf, 0) == p_2_1_2);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_2_lvl_nested(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_1_1_1 = ecs_new_entity(world, "p._1._1._1");
ecs_entity_t p_1_1_2 = ecs_new_entity(world, "p._1._1._2");
ecs_entity_t p_1_2 = ecs_new_entity(world, "p._1._2");
ecs_entity_t p_1_2_1 = ecs_new_entity(world, "p._1._2._1");
ecs_entity_t p_1_2_2 = ecs_new_entity(world, "p._1._2._2");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_entity_t p_2_1_1 = ecs_new_entity(world, "p._2._1._1");
ecs_entity_t p_2_1_2 = ecs_new_entity(world, "p._2._1._2");
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_1_2));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_table(world, p_1_2_2) == ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_2, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_2, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_2_1, EcsChildOf, 0) == p_1_2);
test_assert(ecs_get_target(world, p_1_2_2, EcsChildOf, 0) == p_1_2);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_2, EcsChildOf, 0) == p_2_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p_1), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_1_2));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_table(world, p_1_2_2) == ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_2, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_2, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_2_1, EcsChildOf, 0) == p_1_2);
test_assert(ecs_get_target(world, p_1_2_2, EcsChildOf, 0) == p_1_2);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_2, EcsChildOf, 0) == p_2_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_1_2));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_table(world, p_1_2_2) == ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_2, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_2, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_2_1, EcsChildOf, 0) == p_1_2);
test_assert(ecs_get_target(world, p_1_2_2, EcsChildOf, 0) == p_1_2);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_2, EcsChildOf, 0) == p_2_1);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_3_lvl_nested(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_1_1_1 = ecs_new_entity(world, "p._1._1._1");
ecs_entity_t p_1_1_1_1 = ecs_new_entity(world, "p._1._1._1._1");
ecs_entity_t p_1_1_2 = ecs_new_entity(world, "p._1._1._2");
ecs_entity_t p_1_1_2_1 = ecs_new_entity(world, "p._1._1._2._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_entity_t p_2_1_1 = ecs_new_entity(world, "p._2._1._1");
ecs_entity_t p_2_1_1_1 = ecs_new_entity(world, "p._2._1._1._1");
ecs_entity_t p_2_1_2 = ecs_new_entity(world, "p._2._1._2");
ecs_entity_t p_2_1_2_1 = ecs_new_entity(world, "p._2._1._2._1");
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1_1) != ecs_get_table(world, p_1_1_2_1));
test_assert(ecs_get_table(world, p_2_1_1_1) != ecs_get_table(world, p_2_1_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_2, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_1_1_2_1, EcsChildOf, 0) == p_1_1_2);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_2, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
test_assert(ecs_get_target(world, p_2_1_2_1, EcsChildOf, 0) == p_2_1_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p_1_1), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1_1) == ecs_get_table(world, p_1_1_2_1));
test_assert(ecs_get_table(world, p_2_1_1_1) != ecs_get_table(world, p_2_1_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_2, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_1_1_2_1, EcsChildOf, 0) == p_1_1_2);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_2, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
test_assert(ecs_get_target(world, p_2_1_2_1, EcsChildOf, 0) == p_2_1_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1_1) == ecs_get_table(world, p_1_1_2_1));
test_assert(ecs_get_table(world, p_2_1_1_1) == ecs_get_table(world, p_2_1_2_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_2, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_1_1_2_1, EcsChildOf, 0) == p_1_1_2);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_2, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
test_assert(ecs_get_target(world, p_2_1_2_1, EcsChildOf, 0) == p_2_1_2);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_1_lvl_after_delete(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_2 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_3 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_4 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_delete(world, p_1_3);
ecs_delete(world, p_1_4);
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_2, EcsChildOf, 0) == p_1);
test_assert(!ecs_is_alive(world, p_1_3));
test_assert(!ecs_is_alive(world, p_1_4));
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_2, EcsChildOf, 0) == p_1);
ecs_fini(world);
}
void FixedHierarchies_get_target_1_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_uint(ecs_get_target(world, p, EcsChildOf, 0), 0);
test_uint(ecs_get_target(world, p_1, EcsChildOf, 0), p);
test_uint(ecs_get_target(world, p_2, EcsChildOf, 0), p);
test_uint(ecs_get_target(world, p_1_1, EcsChildOf, 0), p_1);
test_uint(ecs_get_target(world, p_2_1, EcsChildOf, 0), p_2);
ecs_fini(world);
}
void FixedHierarchies_get_target_2_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_uint(ecs_get_target(world, p, EcsChildOf, 0), 0);
test_uint(ecs_get_target(world, p_1, EcsChildOf, 0), p);
test_uint(ecs_get_target(world, p_2, EcsChildOf, 0), p);
test_uint(ecs_get_target(world, p_1_1, EcsChildOf, 0), p_1);
test_uint(ecs_get_target(world, p_2_1, EcsChildOf, 0), p_2);
test_uint(ecs_get_target(world, p_1_1_1, EcsChildOf, 0), p_1_1);
test_uint(ecs_get_target(world, p_2_1_1, EcsChildOf, 0), p_2_1);
ecs_fini(world);
}
void FixedHierarchies_get_depth_1_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_int(ecs_get_depth(world, p, EcsChildOf), 0);
test_int(ecs_get_depth(world, p_1, EcsChildOf), 1);
test_int(ecs_get_depth(world, p_2, EcsChildOf), 1);
test_int(ecs_get_depth(world, p_1_1, EcsChildOf), 2);
test_int(ecs_get_depth(world, p_2_1, EcsChildOf), 2);
ecs_fini(world);
}
void FixedHierarchies_get_depth_2_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_int(ecs_get_depth(world, p, EcsChildOf), 0);
test_int(ecs_get_depth(world, p_1, EcsChildOf), 1);
test_int(ecs_get_depth(world, p_2, EcsChildOf), 1);
test_int(ecs_get_depth(world, p_1_1, EcsChildOf), 2);
test_int(ecs_get_depth(world, p_2_1, EcsChildOf), 2);
test_int(ecs_get_depth(world, p_1_1_1, EcsChildOf), 3);
test_int(ecs_get_depth(world, p_2_1_1, EcsChildOf), 3);
ecs_fini(world);
}
void FixedHierarchies_get_depth_after_reparent_root(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_int(ecs_get_depth(world, p, EcsChildOf), 0);
test_int(ecs_get_depth(world, p_1, EcsChildOf), 1);
test_int(ecs_get_depth(world, p_2, EcsChildOf), 1);
test_int(ecs_get_depth(world, p_1_1, EcsChildOf), 2);
test_int(ecs_get_depth(world, p_2_1, EcsChildOf), 2);
ecs_entity_t gp = ecs_new_id(world);
ecs_add_pair(world, p, EcsChildOf, gp);
test_int(ecs_get_depth(world, p, EcsChildOf), 1);
test_int(ecs_get_depth(world, p_1, EcsChildOf), 2);
test_int(ecs_get_depth(world, p_2, EcsChildOf), 2);
test_int(ecs_get_depth(world, p_1_1, EcsChildOf), 3);
test_int(ecs_get_depth(world, p_2_1, EcsChildOf), 3);
ecs_fini(world);
}
void FixedHierarchies_delete_fixed_1_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_delete(world, p);
test_assert(!ecs_is_alive(world, p_1));
test_assert(!ecs_is_alive(world, p_1_1));
test_assert(!ecs_is_alive(world, p_2));
test_assert(!ecs_is_alive(world, p_2_1));
ecs_fini(world);
}
void FixedHierarchies_delete_fixed_2_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_delete(world, p);
test_assert(!ecs_is_alive(world, p_1));
test_assert(!ecs_is_alive(world, p_1_1));
test_assert(!ecs_is_alive(world, p_1_1_1));
test_assert(!ecs_is_alive(world, p_2));
test_assert(!ecs_is_alive(world, p_2_1));
test_assert(!ecs_is_alive(world, p_2_1_1));
ecs_fini(world);
}
void FixedHierarchies_delete_with_fixed_1_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_delete_with(world, ecs_pair(EcsChildOf, p));
test_assert(!ecs_is_alive(world, p_1));
test_assert(!ecs_is_alive(world, p_1_1));
test_assert(!ecs_is_alive(world, p_2));
test_assert(!ecs_is_alive(world, p_2_1));
ecs_fini(world);
}
void FixedHierarchies_delete_with_fixed_2_lvl(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_delete_with(world, ecs_pair(EcsChildOf, p));
test_assert(!ecs_is_alive(world, p_1));
test_assert(!ecs_is_alive(world, p_1_1));
test_assert(!ecs_is_alive(world, p_1_1_1));
test_assert(!ecs_is_alive(world, p_2));
test_assert(!ecs_is_alive(world, p_2_1));
test_assert(!ecs_is_alive(world, p_2_1_1));
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_1_lvl(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_1_lvl_w_init(void) {
ecs_world_t *world = ecs_init(); /* Registers metadata/ctor for TreeFixed */
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_1_lvl_w_init_comp_after_tree_fixed(void) {
ecs_world_t *world = ecs_init(); /* Registers metadata/ctor for TreeFixed */
ECS_COMPONENT(world, Position);
ecs_set_hooks(world, Position, {
.ctor = ecs_default_ctor
});
ecs_entity_t rel = ecs_new_id(world);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set_pair_second(world, p_1_1, rel, Position, {1115, 2115});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_set_pair_second(world, p_2_1, rel, Position, {1215, 2215});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_pair(rel, ecs_id(Position)) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(0, it.sources[1]);
test_uint(p_1, it.sources[2]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *rp = ecs_field(&it, Position, 2);
test_int(rp[0].x, 1115); test_int(rp[0].y, 2115);
Position *pp = ecs_field(&it, Position, 3);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(0, it.sources[1]);
test_uint(p_2, it.sources[2]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *rp = ecs_field(&it, Position, 2);
test_int(rp[0].x, 1215); test_int(rp[0].y, 2215);
Position *pp = ecs_field(&it, Position, 3);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_2_lvl(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_1_1, Position, {1111, 2111});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_set(world, p_2_1_1, Position, {1211, 2211});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1111); test_int(p[0].y, 2111);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 111); test_int(pp[0].y, 211);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1211); test_int(p[0].y, 2211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 121); test_int(pp[0].y, 221);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_cascade_field_2_lvl(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_1_1, Position, {1111, 2111});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_set(world, p_2_1_1, Position, {1211, 2211});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent|EcsCascade },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1111); test_int(p[0].y, 2111);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 111); test_int(pp[0].y, 211);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1211); test_int(p[0].y, 2211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 121); test_int(pp[0].y, 221);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_1_fixed_1_regular(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ECS_COMPONENT(world, Velocity);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_set(world, p, Velocity, {3, 4});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
{ .id = ecs_id(Velocity), .src.flags = EcsParent }
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
test_uint(p, it.sources[2]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
test_uint(p, it.sources[2]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
test_uint(p, it.sources[2]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_only_fixed_1_lvls(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_assert(p != NULL);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_assert(p != NULL);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_fixed_1_lvls_no_match(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1_1, Position, {111, 211});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
test_bool(ecs_query_next(&it), false);
it = ecs_query_iter(world, q);
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_fixed_1_lvls_2_no_match(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_fixed_1_lvls_no_match_match(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_assert(p != NULL);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_fixed_1_lvls_match_no_match(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_assert(p != NULL);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_field_2_fixed_2_lvls(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ECS_COMPONENT(world, Velocity);
ECS_COMPONENT(world, Mass);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_set(world, p, Velocity, {3, 4});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1, Mass, {5});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_1_1, Position, {1111, 2111});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2, Mass, {6});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_set(world, p_2_1_1, Position, {1211, 2211});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
{ .id = ecs_id(Velocity), .src.flags = EcsParent },
{ .id = ecs_id(Mass), .src.flags = EcsSelf|EcsParent }
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
test_uint(p, it.sources[2]);
test_uint(0, it.sources[3]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
Mass *mp = ecs_field(&it, Mass, 4);
test_int(mp[0], 5);
test_int(mp[1], 6);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1_1, it.sources[1]);
test_uint(p, it.sources[2]);
test_uint(p_1, it.sources[3]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1111); test_int(p[0].y, 2111);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 111); test_int(pp[0].y, 211);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
Mass *mp = ecs_field(&it, Mass, 4);
test_int(mp[0], 5);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2_1, it.sources[1]);
test_uint(p, it.sources[2]);
test_uint(p_2, it.sources[3]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1211); test_int(p[0].y, 2211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 121); test_int(pp[0].y, 221);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
Mass *mp = ecs_field(&it, Mass, 4);
test_int(mp[0], 6);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
test_uint(p, it.sources[2]);
test_uint(p_1, it.sources[3]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
Mass *mp = ecs_field(&it, Mass, 4);
test_int(mp[0], 5);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
test_uint(p, it.sources[2]);
test_uint(p_2, it.sources[3]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
Mass *mp = ecs_field(&it, Mass, 4);
test_int(mp[0], 6);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_next_table(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
test_bool(ecs_query_next_table(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_next_table_1_elem(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_uint(1, it.count);
test_uint(p_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
test_bool(ecs_query_next_table(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_next_table_1_elem_no_match(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1_1, Position, {111, 211});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterNext);
test_uint(0, it.count);
}
test_bool(ecs_query_next_table(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_nested_make_fixed(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent|EcsCascade },
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_1_2 = ecs_new_entity(world, "p._1._2");
ecs_set(world, p, Position, {1, 2});
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_2, Position, {112, 212});
ecs_flatten(world, ecs_pair(EcsChildOf, p_1), NULL);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_uint(1, it.count);
test_uint(p_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_uint(2, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(p_1_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
test_int(p[1].x, 112); test_int(p[1].y, 212);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
test_bool(ecs_query_next_table(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_nested_make_fixed_w_optional(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .oper = EcsOptional, .src.flags = EcsParent|EcsCascade },
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_1_2 = ecs_new_entity(world, "p._1._2");
ecs_set(world, p, Position, {1, 2});
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_2, Position, {112, 212});
ecs_flatten(world, ecs_pair(EcsChildOf, p_1), NULL);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(0, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1); test_int(p[0].y, 2);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp == NULL);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(p_1_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
test_int(p[1].x, 112); test_int(p[1].y, 212);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_nested_make_fixed_w_optional_match_children_only(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .oper = EcsOptional, .src.flags = EcsParent|EcsCascade },
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_1_2 = ecs_new_entity(world, "p._1._2");
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_2, Position, {112, 212});
ecs_flatten(world, ecs_pair(EcsChildOf, p_1), NULL);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(p_1_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(0, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
test_int(p[1].x, 112); test_int(p[1].y, 212);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp == NULL);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_nested_w_2_parents_make_fixed(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .oper = EcsOptional, .src.flags = EcsParent|EcsCascade },
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_1_1_1 = ecs_new_entity(world, "p._1._1._1");
ecs_entity_t p_1_2 = ecs_new_entity(world, "p._1._2");
ecs_entity_t p_1_2_1 = ecs_new_entity(world, "p._1._2._1");
ecs_entity_t p_1_2_2 = ecs_new_entity(world, "p._1._2._2");
ecs_set(world, p, Position, {1, 2});
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_1_1, Position, {1111, 2111});
ecs_set(world, p_1_2, Position, {112, 212});
ecs_set(world, p_1_2_1, Position, {1121, 2121});
ecs_set(world, p_1_2_2, Position, {1122, 2122});
ecs_flatten(world, ecs_pair(EcsChildOf, p_1), NULL);
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_2));
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_2));
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(0, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1); test_int(p[0].y, 2);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp == NULL);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(p_1_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
test_int(p[1].x, 112); test_int(p[1].y, 212);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1111); test_int(p[0].y, 2111);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 111); test_int(pp[0].y, 211);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1_2_1, it.entities[0]);
test_uint(p_1_2_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p_1_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1121); test_int(p[0].y, 2121);
test_int(p[1].x, 1122); test_int(p[1].y, 2122);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 112); test_int(pp[0].y, 212);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_table_w_3_parents(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .oper = EcsOptional, .src.flags = EcsParent|EcsCascade },
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_1_1_1 = ecs_new_entity(world, "p._1._1._1");
ecs_entity_t p_1_1_2 = ecs_new_entity(world, "p._1._1._2");
ecs_entity_t p_1_1_3 = ecs_new_entity(world, "p._1._1._3");
ecs_entity_t p_1_2 = ecs_new_entity(world, "p._1._2");
ecs_entity_t p_1_2_1 = ecs_new_entity(world, "p._1._2._1");
ecs_entity_t p_1_2_2 = ecs_new_entity(world, "p._1._2._2");
ecs_entity_t p_1_3 = ecs_new_entity(world, "p._1._3");
ecs_entity_t p_1_3_1 = ecs_new_entity(world, "p._1._3._1");
ecs_set(world, p, Position, {1, 2});
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_1_1, Position, {1111, 2111});
ecs_set(world, p_1_1_2, Position, {1112, 2112});
ecs_set(world, p_1_1_3, Position, {1113, 2113});
ecs_set(world, p_1_2, Position, {112, 212});
ecs_set(world, p_1_2_1, Position, {1121, 2121});
ecs_set(world, p_1_2_2, Position, {1122, 2122});
ecs_set(world, p_1_3, Position, {113, 213});
ecs_set(world, p_1_3_1, Position, {1131, 2131});
ecs_flatten(world, ecs_pair(EcsChildOf, p_1), NULL);
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_2));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_3_1));
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_2_2));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_3_1));
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(0, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1); test_int(p[0].y, 2);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp == NULL);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(3, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(p_1_2, it.entities[1]);
test_uint(p_1_3, it.entities[2]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
test_int(p[1].x, 112); test_int(p[1].y, 212);
test_int(p[2].x, 113); test_int(p[2].y, 213);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(3, it.count);
test_uint(p_1_1_1, it.entities[0]);
test_uint(p_1_1_2, it.entities[1]);
test_uint(p_1_1_3, it.entities[2]);
test_uint(0, it.sources[0]);
test_uint(p_1_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1111); test_int(p[0].y, 2111);
test_int(p[1].x, 1112); test_int(p[1].y, 2112);
test_int(p[2].x, 1113); test_int(p[2].y, 2113);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 111); test_int(pp[0].y, 211);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1_2_1, it.entities[0]);
test_uint(p_1_2_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p_1_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1121); test_int(p[0].y, 2121);
test_int(p[1].x, 1122); test_int(p[1].y, 2122);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 112); test_int(pp[0].y, 212);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_3_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1_3, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1131); test_int(p[0].y, 2131);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 113); test_int(pp[0].y, 213);
}
test_bool(ecs_query_next(&it), false);
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_change_detection_1st(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Velocity);
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {{
.id = ecs_id(Position),
.inout = EcsIn
},
{
.id = ecs_id(Position),
.src.flags = EcsParent|EcsCascade,
.inout = EcsIn
},
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
// offset the column of Position to verify change detection is testing
// againt the right one.
ecs_add(world, p_2, Velocity);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 11); test_int(pp->y, 21);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_1, Position, {22, 42});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 22); test_int(pp->y, 42);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), false);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_change_detection_2nd(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Velocity);
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {{
.id = ecs_id(Position),
.inout = EcsIn
},
{
.id = ecs_id(Position),
.src.flags = EcsParent|EcsCascade,
.inout = EcsIn
},
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
// offset the column of Position to verify change detection is testing
// againt the right one.
ecs_add(world, p_2, Velocity);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 11); test_int(pp->y, 21);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_2, Position, {24, 44});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), false);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 11); test_int(pp->y, 21);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 24); test_int(pp->y, 44);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_change_detection_iter_twice(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Velocity);
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {{
.id = ecs_id(Position),
.inout = EcsIn
},
{
.id = ecs_id(Position),
.src.flags = EcsParent|EcsCascade,
.inout = EcsIn
},
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
// offset the column of Position to verify change detection is testing
// againt the right one.
ecs_add(world, p_2, Velocity);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 11); test_int(pp->y, 21);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_1, Position, {22, 42});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 22); test_int(pp->y, 42);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), false);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), false);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 22); test_int(pp->y, 42);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), false);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_change_detection_iter_twice_each_parent(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Velocity);
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {{
.id = ecs_id(Position),
.inout = EcsIn
},
{
.id = ecs_id(Position),
.src.flags = EcsParent|EcsCascade,
.inout = EcsIn
},
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
// offset the column of Position to verify change detection is testing
// againt the right one.
ecs_add(world, p_2, Velocity);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 11); test_int(pp->y, 21);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_1, Position, {22, 42});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 22); test_int(pp->y, 42);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), false);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_2, Position, {24, 44});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, false) == EcsIterYield);
test_bool(ecs_query_changed(NULL, &it), false);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 22); test_int(pp->y, 42);
}
{
test_assert(ecs_query_populate(&it, false) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 24); test_int(pp->y, 44);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_change_detection_1st_populate_when_changed(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Velocity);
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {{
.id = ecs_id(Position),
.inout = EcsIn
},
{
.id = ecs_id(Position),
.src.flags = EcsParent|EcsCascade,
.inout = EcsIn
},
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
// offset the column of Position to verify change detection is testing
// againt the right one.
ecs_add(world, p_2, Velocity);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterYield);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 11); test_int(pp->y, 21);
}
{
test_assert(ecs_query_populate(&it, true) == EcsIterNextYield);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_1, Position, {22, 42});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterYield);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 22); test_int(pp->y, 42);
}
{
test_assert(ecs_query_populate(&it, true) == EcsIterNext);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_change_detection_2nd_populate_when_changed(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Velocity);
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {{
.id = ecs_id(Position),
.inout = EcsIn
},
{
.id = ecs_id(Position),
.src.flags = EcsParent|EcsCascade,
.inout = EcsIn
},
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
// offset the column of Position to verify change detection is testing
// againt the right one.
ecs_add(world, p_2, Velocity);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterYield);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 11); test_int(pp->y, 21);
}
{
test_assert(ecs_query_populate(&it, true) == EcsIterNextYield);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_2, Position, {24, 44});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterNextYield);
test_bool(ecs_query_changed(NULL, &it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 24); test_int(pp->y, 44);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_change_detection_iter_twice_populate_when_changed(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Velocity);
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {{
.id = ecs_id(Position),
.inout = EcsIn
},
{
.id = ecs_id(Position),
.src.flags = EcsParent|EcsCascade,
.inout = EcsIn
},
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
// offset the column of Position to verify change detection is testing
// againt the right one.
ecs_add(world, p_2, Velocity);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterYield);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 11); test_int(pp->y, 21);
}
{
test_assert(ecs_query_populate(&it, true) == EcsIterNextYield);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_1, Position, {22, 42});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterYield);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 22); test_int(pp->y, 42);
}
{
test_assert(ecs_query_populate(&it, true) == EcsIterNext);
}
test_bool(ecs_query_next_table(&it), false);
}
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterNext);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_fini(world);
}
void FixedHierarchies_query_w_parent_change_detection_iter_twice_each_parent_populate_when_changed(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Velocity);
ECS_COMPONENT(world, Position);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {{
.id = ecs_id(Position),
.inout = EcsIn
},
{
.id = ecs_id(Position),
.src.flags = EcsParent|EcsCascade,
.inout = EcsIn
},
},
.filter.instanced = true
});
ecs_entity_t p = ecs_new_entity(world, "p");
ecs_entity_t p_1 = ecs_new_entity(world, "p._1");
ecs_entity_t p_1_1 = ecs_new_entity(world, "p._1._1");
ecs_entity_t p_2 = ecs_new_entity(world, "p._2");
ecs_entity_t p_2_1 = ecs_new_entity(world, "p._2._1");
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
// offset the column of Position to verify change detection is testing
// againt the right one.
ecs_add(world, p_2, Velocity);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterYield);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 11); test_int(pp->y, 21);
}
{
test_assert(ecs_query_populate(&it, true) == EcsIterNextYield);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 12); test_int(pp->y, 22);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_1, Position, {22, 42});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterYield);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 22); test_int(pp->y, 42);
}
{
test_assert(ecs_query_populate(&it, true) == EcsIterNext);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_set(world, p_2, Position, {24, 44});
{
ecs_iter_t it = ecs_query_iter(world, q);
{
test_bool(ecs_query_next_table(&it), true);
test_assert(ecs_query_populate(&it, true) == EcsIterNextYield);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_assert(pp != NULL);
test_int(pp->x, 24); test_int(pp->y, 44);
}
test_bool(ecs_query_next_table(&it), false);
}
ecs_fini(world);
}
void FixedHierarchies_staged_query_w_parent_field_1_lvl(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_world_t *stage = ecs_get_stage(world, 0);
ecs_readonly_begin(world);
ecs_iter_t it = ecs_query_iter(stage, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
test_bool(ecs_query_next(&it), false);
ecs_readonly_end(world);
ecs_fini(world);
}
void FixedHierarchies_staged_query_w_parent_field_2_lvl(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_1_1, Position, {1111, 2111});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_set(world, p_2_1_1, Position, {1211, 2211});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
},
.filter.instanced = true
});
ecs_world_t *stage = ecs_get_stage(world, 0);
ecs_readonly_begin(world);
ecs_iter_t it = ecs_query_iter(stage, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1111); test_int(p[0].y, 2111);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 111); test_int(pp[0].y, 211);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1211); test_int(p[0].y, 2211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 121); test_int(pp[0].y, 221);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
test_bool(ecs_query_next(&it), false);
ecs_readonly_end(world);
ecs_fini(world);
}
void FixedHierarchies_staged_query_w_parent_field_1_fixed_1_regular(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ECS_COMPONENT(world, Velocity);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_set(world, p, Velocity, {3, 4});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent },
{ .id = ecs_id(Velocity), .src.flags = EcsParent }
},
.filter.instanced = true
});
ecs_world_t *stage = ecs_get_stage(world, 0);
ecs_readonly_begin(world);
ecs_iter_t it = ecs_query_iter(stage, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
test_uint(p, it.sources[2]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
test_uint(p, it.sources[2]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
test_uint(p, it.sources[2]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
Velocity *vp = ecs_field(&it, Velocity, 3);
test_int(vp[0].x, 3); test_int(vp[0].y, 4);
}
test_bool(ecs_query_next(&it), false);
ecs_readonly_end(world);
ecs_fini(world);
}
void FixedHierarchies_staged_query_w_cascade_field_2_lvl(void) {
ecs_world_t *world = ecs_mini();
ECS_COMPONENT(world, Position);
ecs_entity_t p = ecs_set(world, 0, Position, {1, 2});
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_set(world, p_1, Position, {11, 21});
ecs_set(world, p_1_1, Position, {111, 211});
ecs_set(world, p_1_1_1, Position, {1111, 2111});
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_set(world, p_2, Position, {12, 22});
ecs_set(world, p_2_1, Position, {121, 221});
ecs_set(world, p_2_1_1, Position, {1211, 2211});
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
ecs_query_t *q = ecs_query(world, {
.filter.terms = {
{ .id = ecs_id(Position) },
{ .id = ecs_id(Position), .src.flags = EcsParent|EcsCascade },
},
.filter.instanced = true
});
ecs_world_t *stage = ecs_get_stage(world, 0);
ecs_readonly_begin(world);
ecs_iter_t it = ecs_query_iter(stage, q);
{
test_bool(ecs_query_next(&it), true);
test_uint(2, it.count);
test_uint(p_1, it.entities[0]);
test_uint(p_2, it.entities[1]);
test_uint(0, it.sources[0]);
test_uint(p, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 11); test_int(p[0].y, 21);
test_int(p[1].x, 12); test_int(p[1].y, 22);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 1); test_int(pp[0].y, 2);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 111); test_int(p[0].y, 211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 11); test_int(pp[0].y, 21);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 121); test_int(p[0].y, 221);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 12); test_int(pp[0].y, 22);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_1_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_1_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1111); test_int(p[0].y, 2111);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 111); test_int(pp[0].y, 211);
}
{
test_bool(ecs_query_next(&it), true);
test_uint(1, it.count);
test_uint(p_2_1_1, it.entities[0]);
test_uint(0, it.sources[0]);
test_uint(p_2_1, it.sources[1]);
Position *p = ecs_field(&it, Position, 1);
test_int(p[0].x, 1211); test_int(p[0].y, 2211);
Position *pp = ecs_field(&it, Position, 2);
test_int(pp[0].x, 121); test_int(pp[0].y, 221);
}
test_bool(ecs_query_next(&it), false);
ecs_readonly_end(world);
ecs_fini(world);
}
void FixedHierarchies_add_to_fixed(void) {
install_test_abort();
ecs_world_t *world = ecs_mini();
ECS_TAG(world, Tag);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_expect_abort();
ecs_add(world, p_1_1, Tag);
}
void FixedHierarchies_remove_from_fixed(void) {
install_test_abort();
ecs_world_t *world = ecs_mini();
ECS_TAG(world, Tag);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_add(world, p_1_1, Tag);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_expect_abort();
ecs_remove(world, p_1_1, Tag);
}
void FixedHierarchies_delete_fixed(void) {
install_test_abort();
ecs_world_t *world = ecs_mini();
ECS_TAG(world, Tag);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_expect_abort();
ecs_delete(world, p_1_1);
}
void FixedHierarchies_clear_fixed(void) {
install_test_abort();
ecs_world_t *world = ecs_mini();
ECS_TAG(world, Tag);
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_expect_abort();
ecs_clear(world, p_1_1);
}
void FixedHierarchies_make_fixed_1_lvl_w_name(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_set_name(world, p, "p");
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_set_name(world, p_1, "name_1");
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set_name(world, p_1_1, "child_1");
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_set_name(world, p_2, "name_2");
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set_name(world, p_2_1, "child_1");
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_lookup_fullpath(world, "p.name_1") == p_1);
test_assert(ecs_lookup_fullpath(world, "p.name_2") == p_2);
test_assert(ecs_lookup_fullpath(world, "p.name_1.child_1") == 0);
test_assert(ecs_lookup_fullpath(world, "p.name_2.child_1") == 0);
test_str(ecs_get_name(world, p_1), "name_1");
test_str(ecs_get_name(world, p_2), "name_2");
test_str(ecs_get_name(world, p_1_1), NULL);
test_str(ecs_get_name(world, p_2_1), NULL);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_2_lvl_w_name(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_set_name(world, p, "p");
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_set_name(world, p_1, "name_1");
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set_name(world, p_1_1, "child_1");
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_set_name(world, p_1_1_1, "child_1_1");
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_set_name(world, p_2, "name_2");
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set_name(world, p_2_1, "child_1");
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_set_name(world, p_2_1_1, "child_1_1");
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_lookup_fullpath(world, "p.name_1") == p_1);
test_assert(ecs_lookup_fullpath(world, "p.name_2") == p_2);
test_assert(ecs_lookup_fullpath(world, "p.name_1.child_1") == 0);
test_assert(ecs_lookup_fullpath(world, "p.name_2.child_1") == 0);
test_assert(ecs_lookup_fullpath(world, "p.name_1.child_1.child_1_1") == 0);
test_assert(ecs_lookup_fullpath(world, "p.name_2.child_1.child_1_1") == 0);
test_str(ecs_get_name(world, p_1), "name_1");
test_str(ecs_get_name(world, p_2), "name_2");
test_str(ecs_get_name(world, p_1_1), NULL);
test_str(ecs_get_name(world, p_2_1), NULL);
test_str(ecs_get_name(world, p_1_1_1), NULL);
test_str(ecs_get_name(world, p_2_1_1), NULL);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_1_lvl_w_name_keep_name(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_set_name(world, p, "p");
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_set_name(world, p_1, "name_1");
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set_name(world, p_1_1, "child_1_1");
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_set_name(world, p_2, "name_2");
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set_name(world, p_2_1, "child_2_1");
ecs_flatten(world, ecs_pair(EcsChildOf, p), &(ecs_flatten_desc_t){
.keep_names = true
});
test_assert(ecs_lookup_fullpath(world, "p.name_1") == p_1);
test_assert(ecs_lookup_fullpath(world, "p.name_2") == p_2);
test_assert(ecs_lookup_fullpath(world, "p.name_1.child_1") == 0);
test_assert(ecs_lookup_fullpath(world, "p.name_2.child_1") == 0);
test_str(ecs_get_name(world, p_1), "name_1");
test_str(ecs_get_name(world, p_2), "name_2");
test_str(ecs_get_name(world, p_1_1), "child_1_1");
test_str(ecs_get_name(world, p_2_1), "child_2_1");
ecs_fini(world);
}
void FixedHierarchies_make_fixed_2_lvl_w_name_keep_name(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_set_name(world, p, "p");
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_set_name(world, p_1, "name_1");
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_set_name(world, p_1_1, "child_1_1");
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_set_name(world, p_1_1_1, "child_1_1_1");
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_set_name(world, p_2, "name_2");
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_set_name(world, p_2_1, "child_2_1");
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_set_name(world, p_2_1_1, "child_2_1_1");
ecs_flatten(world, ecs_pair(EcsChildOf, p), &(ecs_flatten_desc_t){
.keep_names = true
});
test_assert(ecs_lookup_fullpath(world, "p.name_1") == p_1);
test_assert(ecs_lookup_fullpath(world, "p.name_2") == p_2);
test_assert(ecs_lookup_fullpath(world, "p.name_1.child_1") == 0);
test_assert(ecs_lookup_fullpath(world, "p.name_2.child_1") == 0);
test_assert(ecs_lookup_fullpath(world, "p.name_1.child_1.child_1_1") == 0);
test_assert(ecs_lookup_fullpath(world, "p.name_2.child_1.child_1_1") == 0);
test_str(ecs_get_name(world, p_1), "name_1");
test_str(ecs_get_name(world, p_2), "name_2");
test_str(ecs_get_name(world, p_1_1), "child_1_1");
test_str(ecs_get_name(world, p_2_1), "child_2_1");
test_str(ecs_get_name(world, p_1_1_1), "child_1_1_1");
test_str(ecs_get_name(world, p_2_1_1), "child_2_1_1");
ecs_fini(world);
}
void FixedHierarchies_make_fixed_2_lvl_lose_depth(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), &(ecs_flatten_desc_t){
.lose_depth = true
});
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_1_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
ecs_fini(world);
}
void FixedHierarchies_make_fixed_3_lvl_lose_depth(void) {
ecs_world_t *world = ecs_mini();
ecs_entity_t p = ecs_new_id(world);
ecs_entity_t p_1 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1);
ecs_entity_t p_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1);
ecs_entity_t p_1_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_1_1_1);
ecs_entity_t p_2 = ecs_new_w_pair(world, EcsChildOf, p);
ecs_entity_t p_2_1 = ecs_new_w_pair(world, EcsChildOf, p_2);
ecs_entity_t p_2_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1);
ecs_entity_t p_2_1_1_1 = ecs_new_w_pair(world, EcsChildOf, p_2_1_1);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) != ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
ecs_flatten(world, ecs_pair(EcsChildOf, p), NULL);
test_assert(ecs_get_table(world, p_1) == ecs_get_table(world, p_2));
test_assert(ecs_get_table(world, p_1_1) == ecs_get_table(world, p_2_1));
test_assert(ecs_get_table(world, p_1_1_1) == ecs_get_table(world, p_2_1_1));
test_assert(ecs_get_table(world, p_1_1_1) != ecs_get_table(world, p_1_1));
test_assert(ecs_get_target(world, p_1, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_1_1, EcsChildOf, 0) == p_1);
test_assert(ecs_get_target(world, p_1_1_1, EcsChildOf, 0) == p_1_1);
test_assert(ecs_get_target(world, p_1_1_1_1, EcsChildOf, 0) == p_1_1_1);
test_assert(ecs_get_target(world, p_2, EcsChildOf, 0) == p);
test_assert(ecs_get_target(world, p_2_1, EcsChildOf, 0) == p_2);
test_assert(ecs_get_target(world, p_2_1_1, EcsChildOf, 0) == p_2_1);
test_assert(ecs_get_target(world, p_2_1_1_1, EcsChildOf, 0) == p_2_1_1);
ecs_fini(world);
}