401 lines
11 KiB
C
401 lines
11 KiB
C
#include <addons.h>
|
|
|
|
void RulesScopes_term_w_not_scope_1_term(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
ECS_TAG(world, TagA);
|
|
|
|
ecs_entity_t parent_1 = ecs_new(world, Root);
|
|
ecs_add(world, parent_1, TagA);
|
|
|
|
ecs_entity_t parent_2 = ecs_new(world, Root);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ TagA }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_2, it.entities[0]);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesScopes_term_w_not_scope_2_terms(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
ECS_TAG(world, TagA);
|
|
ECS_TAG(world, TagB);
|
|
|
|
ecs_entity_t parent_1 = ecs_new(world, Root);
|
|
ecs_add(world, parent_1, TagA);
|
|
|
|
ecs_entity_t parent_2 = ecs_new(world, Root);
|
|
ecs_add(world, parent_2, TagB);
|
|
|
|
ecs_entity_t parent_3 = ecs_new(world, Root);
|
|
ecs_add(world, parent_3, TagA);
|
|
ecs_add(world, parent_3, TagB);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ TagA, TagB }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_1, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_2, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesScopes_term_w_not_scope_1_term_w_not(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
ECS_TAG(world, TagA);
|
|
|
|
ecs_entity_t parent_1 = ecs_new(world, Root);
|
|
ecs_add(world, parent_1, TagA);
|
|
|
|
ecs_new(world, Root);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ !TagA }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_1, it.entities[0]);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesScopes_term_w_not_scope_2_terms_w_not(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
ECS_TAG(world, TagA);
|
|
ECS_TAG(world, TagB);
|
|
|
|
ecs_entity_t parent_1 = ecs_new(world, Root);
|
|
ecs_add(world, parent_1, TagA);
|
|
|
|
ecs_entity_t parent_2 = ecs_new(world, Root);
|
|
ecs_add(world, parent_2, TagB);
|
|
|
|
ecs_entity_t parent_3 = ecs_new(world, Root);
|
|
ecs_add(world, parent_3, TagA);
|
|
ecs_add(world, parent_3, TagB);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ TagA, !TagB }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_2, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_3, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesScopes_term_w_not_scope_1_term_w_var(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
|
|
ecs_entity_t parent_1 = ecs_new(world, Root);
|
|
ecs_new_w_pair(world, EcsChildOf, parent_1);
|
|
ecs_new_w_pair(world, EcsChildOf, parent_1);
|
|
|
|
ecs_entity_t parent_2 = ecs_new(world, Root);
|
|
ecs_new_w_pair(world, EcsChildOf, parent_2);
|
|
|
|
ecs_entity_t parent_3 = ecs_new(world, Root);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ ChildOf($child, $this) }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_3, it.entities[0]);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesScopes_term_w_not_scope_2_terms_w_var(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
ECS_COMPONENT(world, Position);
|
|
|
|
ecs_entity_t parent_0 = ecs_new(world, Root);
|
|
{
|
|
ecs_entity_t child_1 = ecs_new_w_pair(world, EcsChildOf, parent_0);
|
|
ecs_set(world, child_1, Position, {10, 20});
|
|
ecs_entity_t child_2 = ecs_new_w_pair(world, EcsChildOf, parent_0);
|
|
ecs_set(world, child_2, Position, {10, 20});
|
|
}
|
|
|
|
ecs_entity_t parent_1 = ecs_new(world, Root);
|
|
{
|
|
ecs_entity_t child_1 = ecs_new_w_pair(world, EcsChildOf, parent_1);
|
|
ecs_set(world, child_1, Position, {10, 20});
|
|
ecs_new_w_pair(world, EcsChildOf, parent_1);
|
|
}
|
|
|
|
ecs_entity_t parent_2 = ecs_new(world, Root);
|
|
{
|
|
ecs_new_w_pair(world, EcsChildOf, parent_2);
|
|
ecs_new_w_pair(world, EcsChildOf, parent_2);
|
|
}
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ ChildOf($child, $this), Position($child) }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_2, it.entities[0]);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesScopes_term_w_not_scope_1_term_w_not_w_var(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
|
|
ecs_entity_t parent_0 = ecs_new(world, Root);
|
|
{
|
|
ecs_new_w_pair(world, EcsChildOf, parent_0);
|
|
ecs_new_w_pair(world, EcsChildOf, parent_0);
|
|
}
|
|
|
|
ecs_new(world, Root);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ !ChildOf($child, $this) }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_0, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesScopes_term_w_not_scope_2_terms_w_not_w_var(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
ECS_COMPONENT(world, Position);
|
|
|
|
ecs_entity_t parent_0 = ecs_new(world, Root);
|
|
{
|
|
ecs_entity_t child_1 = ecs_new_w_pair(world, EcsChildOf, parent_0);
|
|
ecs_set(world, child_1, Position, {10, 20});
|
|
ecs_entity_t child_2 = ecs_new_w_pair(world, EcsChildOf, parent_0);
|
|
ecs_set(world, child_2, Position, {10, 20});
|
|
}
|
|
|
|
ecs_entity_t parent_1 = ecs_new(world, Root);
|
|
{
|
|
ecs_entity_t child_1 = ecs_new_w_pair(world, EcsChildOf, parent_1);
|
|
ecs_set(world, child_1, Position, {10, 20});
|
|
ecs_new_w_pair(world, EcsChildOf, parent_1);
|
|
}
|
|
|
|
ecs_entity_t parent_2 = ecs_new(world, Root);
|
|
{
|
|
ecs_new_w_pair(world, EcsChildOf, parent_2);
|
|
ecs_new_w_pair(world, EcsChildOf, parent_2);
|
|
}
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ ChildOf($child, $this), !Position($child) }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(parent_0, it.entities[0]);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesScopes_term_w_not_scope_2_terms_w_or(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
ECS_TAG(world, TagA);
|
|
ECS_TAG(world, TagB);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Root);
|
|
ecs_add(world, e1, TagA);
|
|
ecs_entity_t e2 = ecs_new(world, Root);
|
|
ecs_add(world, e2, TagB);
|
|
ecs_entity_t e3 = ecs_new(world, Root);
|
|
ecs_add(world, e3, TagA);
|
|
ecs_add(world, e3, TagB);
|
|
ecs_entity_t e4 = ecs_new(world, Root);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ TagA || TagB }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(e4, it.entities[0]);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesScopes_term_w_not_scope_3_terms_w_or(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Root);
|
|
ECS_TAG(world, TagA);
|
|
ECS_TAG(world, TagB);
|
|
ECS_TAG(world, TagC);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Root);
|
|
ecs_add(world, e1, TagA);
|
|
ecs_entity_t e2 = ecs_new(world, Root);
|
|
ecs_add(world, e2, TagB);
|
|
ecs_entity_t e3 = ecs_new(world, Root);
|
|
ecs_add(world, e3, TagA);
|
|
ecs_add(world, e3, TagB);
|
|
ecs_entity_t e4 = ecs_new(world, Root);
|
|
ecs_add(world, e4, TagC);
|
|
ecs_entity_t e5 = ecs_new(world, Root);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Root, !{ TagA || TagB || TagC }"
|
|
});
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Root, ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(e5, it.entities[0]);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|