#include void Search_search(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, TagC); ecs_table_t *table = ecs_table_add_id(world, 0, TagA); table = ecs_table_add_id(world, table, TagB); table = ecs_table_add_id(world, table, TagC); ecs_id_t id; int32_t c = ecs_search(world, table, TagA, &id); test_int(c, 0); test_uint(id, TagA); c = ecs_search(world, table, TagB, &id); test_int(c, 1); test_uint(id, TagB); c = ecs_search(world, table, TagC, &id); test_int(c, 2); test_uint(id, TagC); ecs_fini(world); } void Search_search_wildcard(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, Tag); ECS_TAG(world, Rel); ECS_TAG(world, ObjA); ECS_TAG(world, ObjB); ecs_table_t *table = ecs_table_add_id(world, 0, Tag); table = ecs_table_add_id(world, table, ecs_pair(Rel, ObjA)); table = ecs_table_add_id(world, table, ecs_pair(Rel, ObjB)); ecs_id_t id; int32_t c = ecs_search(world, table, ecs_pair(Rel, EcsWildcard), &id); test_int(c, 1); test_uint(id, ecs_pair(Rel, ObjA)); ecs_fini(world); } void Search_search_wildcard_w_offset(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, Tag); ECS_TAG(world, Rel); ECS_TAG(world, ObjA); ECS_TAG(world, ObjB); ECS_TAG(world, ObjC); ecs_table_t *table = ecs_table_add_id(world, 0, Tag); table = ecs_table_add_id(world, table, ecs_pair(Rel, ObjA)); table = ecs_table_add_id(world, table, ecs_pair(Rel, ObjB)); table = ecs_table_add_id(world, table, ecs_pair(Rel, ObjC)); ecs_id_t id; int32_t c = ecs_search(world, table, ecs_pair(Rel, EcsWildcard), &id); test_int(c, 1); test_uint(id, ecs_pair(Rel, ObjA)); c = ecs_search_offset(world, table, 2, ecs_pair(Rel, EcsWildcard), &id); test_int(c, 2); test_uint(id, ecs_pair(Rel, ObjB)); c = ecs_search_offset(world, table, 3, ecs_pair(Rel, EcsWildcard), &id); test_int(c, 3); test_uint(id, ecs_pair(Rel, ObjC)); c = ecs_search_offset(world, table, 4, ecs_pair(Rel, EcsWildcard), &id); test_int(c, -1); ecs_fini(world); } void Search_search_relation_wildcard_w_offset(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, Tag); ECS_TAG(world, RelX); ECS_TAG(world, RelY); ECS_TAG(world, RelZ); ECS_TAG(world, ObjA); ECS_TAG(world, ObjB); ecs_table_t *table = ecs_table_add_id(world, 0, Tag); table = ecs_table_add_id(world, table, ecs_pair(RelX, ObjA)); table = ecs_table_add_id(world, table, ecs_pair(RelX, ObjB)); table = ecs_table_add_id(world, table, ecs_pair(RelY, ObjA)); table = ecs_table_add_id(world, table, ecs_pair(RelY, ObjB)); table = ecs_table_add_id(world, table, ecs_pair(RelZ, ObjA)); table = ecs_table_add_id(world, table, ecs_pair(RelZ, ObjB)); ecs_id_t id; int32_t c = ecs_search(world, table, ecs_pair(EcsWildcard, ObjB), &id); test_int(c, 2); test_uint(id, ecs_pair(RelX, ObjB)); c = ecs_search_offset(world, table, 3, ecs_pair(EcsWildcard, ObjB), &id); test_int(c, 4); test_uint(id, ecs_pair(RelY, ObjB)); c = ecs_search_offset(world, table, 5, ecs_pair(EcsWildcard, ObjB), &id); test_int(c, 6); test_uint(id, ecs_pair(RelZ, ObjB)); c = ecs_search_offset(world, table, 7, ecs_pair(EcsWildcard, ObjB), &id); test_int(c, -1); ecs_fini(world); } void Search_search_pair_w_any_rel(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, Tag); ECS_TAG(world, Rel); ECS_TAG(world, ObjA); ECS_TAG(world, ObjB); ecs_table_t *table = ecs_table_add_id(world, 0, Tag); table = ecs_table_add_id(world, table, ecs_pair(Rel, ObjA)); table = ecs_table_add_id(world, table, ecs_pair(Rel, ObjB)); ecs_id_t id; int32_t c = ecs_search(world, table, ecs_pair(EcsAny, ObjB), &id); test_int(c, 2); test_uint(id, ecs_pair(Rel, ObjB)); ecs_fini(world); } void Search_search_pair_w_any_obj(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, Tag); ECS_TAG(world, Rel); ECS_TAG(world, ObjA); ECS_TAG(world, ObjB); ecs_table_t *table = ecs_table_add_id(world, 0, Tag); table = ecs_table_add_id(world, table, ecs_pair(Rel, ObjA)); table = ecs_table_add_id(world, table, ecs_pair(Rel, ObjB)); ecs_id_t id; int32_t c = ecs_search(world, table, ecs_pair(Rel, EcsAny), &id); test_int(c, 1); test_uint(id, ecs_pair(Rel, ObjA)); ecs_fini(world); } void Search_search_follow_relation_lvl_0(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_entity_t e_0 = ecs_new(world, TagA); ecs_add(world, e_0, TagB); ecs_table_t *t = ecs_get_table(world, e_0); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t c = ecs_search_relation(world, t, 0, TagB, Rel, 0, &subj, &id, 0); test_int(c, 1); test_uint(id, TagB); test_uint(subj, 0); ecs_fini(world); } void Search_search_follow_relation_lvl_1(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_entity_t e_0 = ecs_new(world, TagA); ecs_add(world, e_0, TagB); ecs_entity_t e_1 = ecs_new_w_pair(world, Rel, e_0); ecs_table_t *t = ecs_get_table(world, e_1); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t c = ecs_search_relation(world, t, 0, TagB, Rel, 0, &subj, &id, 0); test_int(c, 0); test_uint(id, TagB); test_uint(subj, e_0); ecs_fini(world); } void Search_search_follow_relation_lvl_2(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_entity_t e_0 = ecs_new(world, TagA); ecs_add(world, e_0, TagB); ecs_entity_t e_1 = ecs_new_w_pair(world, Rel, e_0); ecs_entity_t e_2 = ecs_new_w_pair(world, Rel, e_1); ecs_table_t *t = ecs_get_table(world, e_2); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t c = ecs_search_relation(world, t, 0, TagB, Rel, 0, &subj, &id, 0); test_int(c, 0); test_uint(id, TagB); test_uint(subj, e_0); ecs_fini(world); } void Search_search_follow_relation_lvl_3(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_entity_t e_0 = ecs_new(world, TagA); ecs_add(world, e_0, TagB); ecs_entity_t e_1 = ecs_new_w_pair(world, Rel, e_0); ecs_entity_t e_2 = ecs_new_w_pair(world, Rel, e_1); ecs_entity_t e_3 = ecs_new_w_pair(world, Rel, e_2); ecs_table_t *t = ecs_get_table(world, e_3); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t c = ecs_search_relation(world, t, 0, TagB, Rel, 0, &subj, &id, 0); test_int(c, 0); test_uint(id, TagB); test_uint(subj, e_0); ecs_fini(world); } void Search_search_first_lvl_0(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_entity_t e_0 = ecs_new(world, TagA); ecs_add(world, e_0, TagB); ecs_table_t *t = ecs_get_table(world, e_0); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t c = ecs_search_relation(world, t, 0, TagB, Rel, 0, &subj, &id, 0); test_int(c, 1); test_uint(id, TagB); test_uint(subj, 0); ecs_fini(world); } void Search_search_first_lvl_1(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_entity_t e_0 = ecs_new(world, TagA); ecs_entity_t e_1 = ecs_new_w_pair(world, Rel, e_0); ecs_add(world, e_0, TagB); ecs_table_t *t = ecs_get_table(world, e_1); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t c = ecs_search_relation(world, t, 0, TagB, Rel, 0, &subj, &id, 0); test_int(c, 0); test_uint(id, TagB); test_uint(subj, e_0); ecs_fini(world); } void Search_search_first_lvl_2(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_entity_t e_0 = ecs_new(world, TagA); ecs_entity_t e_1 = ecs_new_w_pair(world, Rel, e_0); ecs_entity_t e_2 = ecs_new_w_pair(world, Rel, e_1); ecs_add(world, e_0, TagB); ecs_add(world, e_1, TagB); ecs_table_t *t = ecs_get_table(world, e_2); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t c = ecs_search_relation(world, t, 0, TagB, Rel, 0, &subj, &id, 0); test_int(c, 0); test_uint(id, TagB); test_uint(subj, e_1); ecs_fini(world); } void Search_search_first_lvl_3(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_entity_t e_0 = ecs_new(world, TagA); ecs_entity_t e_1 = ecs_new_w_pair(world, Rel, e_0); ecs_entity_t e_2 = ecs_new_w_pair(world, Rel, e_1); ecs_entity_t e_3 = ecs_new_w_pair(world, Rel, e_2); ecs_add(world, e_0, TagB); ecs_add(world, e_1, TagB); ecs_add(world, e_2, TagB); ecs_table_t *t = ecs_get_table(world, e_3); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t c = ecs_search_relation(world, t, 0, TagB, Rel, 0, &subj, &id, 0); test_int(c, 0); test_uint(id, TagB); test_uint(subj, e_2); ecs_fini(world); } void Search_search_relation_wildcard(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, Tag); ECS_TAG(world, TgtA); ECS_TAG(world, TgtB); ECS_TAG(world, Rel); ecs_entity_t b = ecs_new(world, Tag); ecs_add(world, b, Tag); ecs_add_pair(world, b, Rel, TgtA); ecs_add_pair(world, b, Rel, TgtB); ecs_entity_t e = ecs_new_id(world); ecs_add_pair(world, e, EcsChildOf, b); ecs_table_t *table = ecs_get_table(world, e); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t column = 0; column = ecs_search_relation(world, table, 0, ecs_pair(Rel, EcsWildcard), EcsChildOf, EcsUp, &subj, &id, 0); test_int(column, 0); test_uint(subj, b); test_uint(id, ecs_pair(Rel, TgtA)); ecs_fini(world); } void Search_search_relation_at_offset(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, Tag); ECS_TAG(world, Rel); ecs_entity_t b1 = ecs_new(world, Tag); ecs_entity_t b2 = ecs_new(world, Tag); ecs_entity_t e = ecs_new_id(world); ecs_add_pair(world, e, Rel, b1); ecs_add_pair(world, e, Rel, b2); ecs_table_t *table = ecs_get_table(world, e); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t column = 0; column = ecs_search_relation(world, table, 0, Tag, Rel, EcsUp, &subj, &id, 0); test_int(column, 0); test_uint(subj, b1); test_uint(id, Tag); subj = 0; column = ecs_search_relation( world, table, 1, Tag, Rel, EcsUp, &subj, &id, 0); test_int(column, 1); test_uint(subj, b2); test_uint(id, Tag); ecs_fini(world); } void Search_search_relation_inherit_from_parent(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, TagC); ecs_entity_t b = ecs_new_id(world); ecs_add(world, b, TagA); ecs_add(world, b, TagB); ecs_entity_t p = ecs_new_id(world); ecs_add_pair(world, p, EcsIsA, b); ecs_add(world, p, TagC); ecs_entity_t e = ecs_new_id(world); ecs_add(world, e, TagA); ecs_add(world, e, TagB); ecs_add(world, e, TagC); ecs_add_pair(world, e, EcsChildOf, p); ecs_table_t *table = ecs_get_table(world, e); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t column = 0; column = ecs_search_relation(world, table, 0, TagA, EcsChildOf, EcsUp, &subj, &id, 0); test_int(column, 3); test_int(subj, b); test_int(id, TagA); column = ecs_search_relation(world, table, 0, TagB, EcsChildOf, EcsUp, &subj, &id, 0); test_int(column, 3); test_int(subj, b); test_int(id, TagB); column = ecs_search_relation(world, table, 0, TagC, EcsChildOf, EcsUp, &subj, &id, 0); test_int(column, 3); test_int(subj, p); test_int(id, TagC); ecs_fini(world); } void Search_search_relation_dont_inherit(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, TagC); ecs_add_id(world, TagB, EcsDontInherit); ecs_entity_t b = ecs_new_id(world); ecs_add(world, b, TagA); ecs_add(world, b, TagB); ecs_add(world, b, TagC); ecs_entity_t e = ecs_new_id(world); ecs_add(world, e, TagA); ecs_add(world, e, TagB); ecs_add(world, e, TagC); ecs_add_pair(world, e, EcsIsA, b); ecs_table_t *table = ecs_get_table(world, e); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t column = 0; column = ecs_search_relation(world, table, 0, TagA, EcsIsA, EcsUp, &subj, &id, 0); test_int(column, 3); test_int(subj, b); test_int(id, TagA); column = ecs_search_relation(world, table, 0, TagB, EcsIsA, EcsUp, &subj, &id, 0); test_int(column, -1); column = ecs_search_relation(world, table, 0, TagC, EcsIsA, EcsUp, &subj, &id, 0); test_int(column, 3); test_int(subj, b); test_int(id, TagC); column = ecs_search_relation(world, table, 0, TagB, EcsIsA, EcsSelf|EcsUp, &subj, &id, 0); test_int(column, 1); test_int(subj, 0); test_int(id, TagB); column = ecs_search_relation(world, table, 0, TagB, EcsIsA, EcsSelf, &subj, &id, 0); test_int(column, 1); test_int(subj, 0); test_int(id, TagB); ecs_fini(world); } void Search_search_relation_dont_inherit_from_parent(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, TagC); ecs_add_id(world, TagB, EcsDontInherit); ecs_entity_t b = ecs_new_id(world); ecs_add(world, b, TagA); ecs_add(world, b, TagB); ecs_entity_t p = ecs_new_id(world); ecs_add_pair(world, p, EcsIsA, b); ecs_add(world, p, TagC); ecs_entity_t e = ecs_new_id(world); ecs_add(world, e, TagA); ecs_add(world, e, TagB); ecs_add(world, e, TagC); ecs_add_pair(world, e, EcsChildOf, p); ecs_table_t *table = ecs_get_table(world, e); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t column = 0; column = ecs_search_relation(world, table, 0, TagA, EcsChildOf, EcsUp, &subj, &id, 0); test_int(column, 3); test_int(subj, b); test_int(id, TagA); column = ecs_search_relation(world, table, 0, TagB, EcsChildOf, EcsUp, &subj, &id, 0); test_int(column, -1); column = ecs_search_relation(world, table, 0, TagC, EcsChildOf, EcsUp, &subj, &id, 0); test_int(column, 3); test_int(subj, p); test_int(id, TagC); column = ecs_search_relation(world, table, 0, TagB, EcsChildOf, EcsSelf|EcsUp, &subj, &id, 0); test_int(column, 1); test_int(subj, 0); test_int(id, TagB); column = ecs_search_relation(world, table, 0, TagB, EcsChildOf, EcsSelf, &subj, &id, 0); test_int(column, 1); test_int(subj, 0); test_int(id, TagB); ecs_fini(world); } void Search_search_relation_exclusive(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_add_id(world, Rel, EcsExclusive); ecs_entity_t b = ecs_new_id(world); ecs_add_pair(world, b, Rel, TagA); ecs_entity_t e = ecs_new_id(world); ecs_add_pair(world, e, Rel, TagB); ecs_add_pair(world, e, EcsIsA, b); ecs_table_t *table = ecs_get_table(world, e); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t column = 0; column = ecs_search_relation(world, table, 0, ecs_pair(Rel, TagA), EcsIsA, EcsSelf|EcsUp, &subj, &id, 0); test_int(column, -1); column = ecs_search_relation(world, table, 0, ecs_pair(Rel, TagB), EcsIsA, EcsSelf|EcsUp, &subj, &id, 0); test_int(column, 1); test_int(subj, 0); test_int(id, ecs_pair(Rel, TagB)); column = ecs_search_relation(world, table, 0, ecs_pair(Rel, TagA), EcsIsA, EcsUp, &subj, &id, 0); test_int(column, -1); column = ecs_search_relation(world, table, 0, ecs_pair(Rel, TagB), EcsIsA, EcsUp, &subj, &id, 0); test_int(column, -1); ecs_fini(world); } void Search_search_relation_union(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_add_id(world, Rel, EcsUnion); ecs_entity_t b = ecs_new_id(world); ecs_add_pair(world, b, Rel, TagA); ecs_entity_t e = ecs_new_id(world); ecs_add_pair(world, e, EcsIsA, b); ecs_table_t *table = ecs_get_table(world, e); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t column = 0; column = ecs_search_relation(world, table, 0, ecs_pair(Rel, TagA), EcsIsA, EcsSelf|EcsUp, &subj, &id, 0); test_int(column, 0); test_int(subj, b); test_int(id, ecs_pair(Rel, EcsWildcard)); column = ecs_search_relation(world, table, 0, ecs_pair(Rel, TagA), EcsIsA, EcsUp, &subj, &id, 0); test_int(column, 0); test_int(subj, b); test_int(id, ecs_pair(Rel, EcsWildcard)); column = ecs_search_relation(world, table, 0, ecs_pair(Rel, TagA), EcsIsA, EcsSelf, &subj, &id, 0); test_int(column, -1); ecs_fini(world); } void Search_search_relation_union_wildcard(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_add_id(world, Rel, EcsUnion); ecs_entity_t b = ecs_new_id(world); ecs_add_pair(world, b, Rel, TagA); ecs_entity_t e = ecs_new_id(world); ecs_add_pair(world, e, EcsIsA, b); ecs_table_t *table = ecs_get_table(world, e); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t column = 0; column = ecs_search_relation(world, table, 0, ecs_pair(Rel, EcsWildcard), EcsIsA, EcsSelf|EcsUp, &subj, &id, 0); test_int(column, 0); test_int(subj, b); test_int(id, ecs_pair(Rel, EcsWildcard)); column = ecs_search_relation(world, table, 0, ecs_pair(Rel, EcsWildcard), EcsIsA, EcsUp, &subj, &id, 0); test_int(column, 0); test_int(subj, b); test_int(id, ecs_pair(Rel, EcsWildcard)); column = ecs_search_relation(world, table, 0, ecs_pair(Rel, EcsWildcard), EcsIsA, EcsSelf, &subj, &id, 0); test_int(column, -1); ecs_fini(world); } void Search_search_relation_union_pair(void) { ecs_world_t *world = ecs_mini(); ECS_TAG(world, TagA); ECS_TAG(world, TagB); ECS_TAG(world, Rel); ecs_add_id(world, Rel, EcsUnion); ecs_entity_t b = ecs_new_id(world); ecs_add_pair(world, b, Rel, TagA); ecs_entity_t e = ecs_new_id(world); ecs_add_pair(world, e, EcsIsA, b); ecs_table_t *table = ecs_get_table(world, e); ecs_entity_t subj = 0; ecs_id_t id = 0; int32_t column = 0; column = ecs_search_relation(world, table, 0, ecs_pair(EcsUnion, Rel), EcsIsA, EcsSelf|EcsUp, &subj, &id, 0); test_int(column, 0); test_int(subj, b); test_int(id, ecs_pair(EcsUnion, Rel)); column = ecs_search_relation(world, table, 0, ecs_pair(EcsUnion, Rel), EcsIsA, EcsUp, &subj, &id, 0); test_int(column, 0); test_int(subj, b); test_int(id, ecs_pair(EcsUnion, Rel)); column = ecs_search_relation(world, table, 0, ecs_pair(EcsUnion, Rel), EcsIsA, EcsSelf, &subj, &id, 0); test_int(column, -1); ecs_fini(world); }