5102 lines
176 KiB
C
5102 lines
176 KiB
C
#include <addons.h>
|
|
|
|
ECS_ENTITY_DECLARE(LocatedIn);
|
|
ECS_TAG_DECLARE(Earth);
|
|
ECS_TAG_DECLARE(Location);
|
|
ECS_TAG_DECLARE(UnitedStates);
|
|
ECS_TAG_DECLARE(California);
|
|
ECS_TAG_DECLARE(Washington);
|
|
ECS_TAG_DECLARE(SanFrancisco);
|
|
ECS_TAG_DECLARE(LosAngeles);
|
|
ECS_TAG_DECLARE(Seattle);
|
|
ECS_TAG_DECLARE(NoordHolland);
|
|
ECS_TAG_DECLARE(Netherlands);
|
|
ECS_TAG_DECLARE(Amsterdam);
|
|
|
|
static
|
|
void populate_facts(ecs_world_t *world) {
|
|
ECS_ENTITY_DEFINE(world, LocatedIn, Final, Transitive);
|
|
ECS_TAG_DEFINE(world, Location);
|
|
ECS_ENTITY_DEFINE(world, Earth, Location);
|
|
ECS_ENTITY_DEFINE(world, UnitedStates, Location, (LocatedIn, Earth));
|
|
ECS_ENTITY_DEFINE(world, California, Location, (LocatedIn, UnitedStates));
|
|
ECS_ENTITY_DEFINE(world, Washington, Location, (LocatedIn, UnitedStates));
|
|
ECS_ENTITY_DEFINE(world, SanFrancisco, Location, (LocatedIn, California));
|
|
ECS_ENTITY_DEFINE(world, LosAngeles, Location, (LocatedIn, California));
|
|
ECS_ENTITY_DEFINE(world, Seattle, Location, (LocatedIn, Washington));
|
|
ECS_ENTITY_DEFINE(world, Netherlands, Location, (LocatedIn, Earth));
|
|
ECS_ENTITY_DEFINE(world, NoordHolland, Location, (LocatedIn, Netherlands));
|
|
ECS_ENTITY_DEFINE(world, Amsterdam, Location, (LocatedIn, NoordHolland));
|
|
}
|
|
|
|
void RulesTransitive_1_fact_0_lvl_true(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, SanFrancisco)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_fact_1_lvl_true(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, California)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_fact_2_lvl_true(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, UnitedStates)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_fact_0_lvl_false(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, Seattle)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_fact_1_lvl_false(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, Washington)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_fact_2_lvl_false(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, Netherlands)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_fact_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, e1)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, e1), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, e1), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_written_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
ecs_entity_t e5 = ecs_new(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Tag($this), LocatedIn($this, SanFrancisco)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e3, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e5, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e5, it.entities[1]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_written_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
ecs_entity_t e5 = ecs_new(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Tag($this), LocatedIn($this, California)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e3, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e5, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e5, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_written_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
ecs_entity_t e5 = ecs_new(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Tag($this), LocatedIn($this, UnitedStates)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e3, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e5, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e5, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_written_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
ecs_entity_t e5 = ecs_new(world, Tag);
|
|
ecs_entity_t e6 = ecs_new(world, Tag);
|
|
ecs_entity_t e7 = ecs_new(world, Tag);
|
|
ecs_entity_t e8 = ecs_new(world, Tag);
|
|
|
|
ecs_set_name(world, e1, "e1");
|
|
ecs_set_name(world, e2, "e2");
|
|
ecs_set_name(world, e3, "e3");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Tag($this), LocatedIn($this, e2)"
|
|
});
|
|
|
|
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(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, e2), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e4, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e5, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e6, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e7, LocatedIn, e2);
|
|
ecs_add_pair(world, e8, LocatedIn, e2);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, e2), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, e2), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(e7, it.entities[0]);
|
|
test_uint(e8, it.entities[1]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_id(world);
|
|
ecs_entity_t e2 = ecs_new_id(world);
|
|
ecs_entity_t e3 = ecs_new_id(world);
|
|
ecs_entity_t e4 = ecs_new_id(world);
|
|
ecs_entity_t e5 = ecs_new_id(world);
|
|
ecs_entity_t e6 = ecs_new_id(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, SanFrancisco)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e5, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e6, LocatedIn, SanFrancisco);
|
|
|
|
ecs_add(world, e2, Tag);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e6, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_id(world);
|
|
ecs_entity_t e2 = ecs_new_id(world);
|
|
ecs_entity_t e3 = ecs_new_id(world);
|
|
ecs_entity_t e4 = ecs_new_id(world);
|
|
ecs_entity_t e5 = ecs_new_id(world);
|
|
ecs_entity_t e6 = ecs_new_id(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, California)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e5, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e6, LocatedIn, SanFrancisco);
|
|
|
|
ecs_add(world, e2, Tag);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e6, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_id(world);
|
|
ecs_entity_t e2 = ecs_new_id(world);
|
|
ecs_entity_t e3 = ecs_new_id(world);
|
|
ecs_entity_t e4 = ecs_new_id(world);
|
|
ecs_entity_t e5 = ecs_new_id(world);
|
|
ecs_entity_t e6 = ecs_new_id(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, UnitedStates)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e5, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e6, LocatedIn, SanFrancisco);
|
|
|
|
ecs_add(world, e2, Tag);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e6, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Seattle), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_id(world);
|
|
ecs_entity_t e2 = ecs_new_id(world);
|
|
ecs_entity_t e3 = ecs_new_id(world);
|
|
ecs_entity_t e4 = ecs_new_id(world);
|
|
ecs_entity_t e5 = ecs_new_id(world);
|
|
ecs_entity_t e6 = ecs_new_id(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, California)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e5, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e6, LocatedIn, SanFrancisco);
|
|
|
|
ecs_add(world, e2, Tag);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e6, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_ent_src_tgt_var_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, UnitedStates);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_ent_src_tgt_var_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, California);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_ent_src_tgt_var_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_ent_src_tgt_var_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, e1), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_tgt_var(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
test_uint(Netherlands, it.entities[1]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_this_src_tgt_var_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Amsterdam), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Seattle), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, x_var));
|
|
test_uint(LosAngeles, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Washington, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Netherlands, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
test_uint(Netherlands, it.entities[1]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_written_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
ecs_entity_t e5 = ecs_new(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Tag($r), LocatedIn($r, SanFrancisco)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e3, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e5, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 2));
|
|
test_uint(e1, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(e5, ecs_field_src(&it, 1));
|
|
test_uint(e5, ecs_field_src(&it, 2));
|
|
test_uint(e5, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_written_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
ecs_entity_t e5 = ecs_new(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Tag($r), LocatedIn($r, California)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e3, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e5, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 2));
|
|
test_uint(e1, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(e5, ecs_field_src(&it, 1));
|
|
test_uint(e5, ecs_field_src(&it, 2));
|
|
test_uint(e5, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 2));
|
|
test_uint(e2, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_written_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
ecs_entity_t e5 = ecs_new(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Tag($r), LocatedIn($r, UnitedStates)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e3, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e5, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 2));
|
|
test_uint(e1, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(e5, ecs_field_src(&it, 1));
|
|
test_uint(e5, ecs_field_src(&it, 2));
|
|
test_uint(e5, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 2));
|
|
test_uint(e2, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(e3, ecs_field_src(&it, 1));
|
|
test_uint(e3, ecs_field_src(&it, 2));
|
|
test_uint(e3, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_written_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
ecs_entity_t e5 = ecs_new(world, Tag);
|
|
ecs_entity_t e6 = ecs_new(world, Tag);
|
|
ecs_entity_t e7 = ecs_new(world, Tag);
|
|
ecs_entity_t e8 = ecs_new(world, Tag);
|
|
|
|
ecs_set_name(world, e1, "e1");
|
|
ecs_set_name(world, e2, "e2");
|
|
ecs_set_name(world, e3, "e3");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Tag($r), LocatedIn($r, e2)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, e2), ecs_field_id(&it, 2));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 2));
|
|
test_uint(e2, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e4, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e5, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e6, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e7, LocatedIn, e2);
|
|
ecs_add_pair(world, e8, LocatedIn, e2);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, e2), ecs_field_id(&it, 2));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 2));
|
|
test_uint(e2, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, e2), ecs_field_id(&it, 2));
|
|
test_uint(e7, ecs_field_src(&it, 1));
|
|
test_uint(e7, ecs_field_src(&it, 2));
|
|
test_uint(e7, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, e2), ecs_field_id(&it, 2));
|
|
test_uint(e8, ecs_field_src(&it, 1));
|
|
test_uint(e8, ecs_field_src(&it, 2));
|
|
test_uint(e8, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_id(world);
|
|
ecs_entity_t e2 = ecs_new_id(world);
|
|
ecs_entity_t e3 = ecs_new_id(world);
|
|
ecs_entity_t e4 = ecs_new_id(world);
|
|
ecs_entity_t e5 = ecs_new_id(world);
|
|
ecs_entity_t e6 = ecs_new_id(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($r, SanFrancisco)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e5, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e6, LocatedIn, SanFrancisco);
|
|
|
|
ecs_add(world, e2, Tag);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e6, ecs_field_src(&it, 1));
|
|
test_uint(e6, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_id(world);
|
|
ecs_entity_t e2 = ecs_new_id(world);
|
|
ecs_entity_t e3 = ecs_new_id(world);
|
|
ecs_entity_t e4 = ecs_new_id(world);
|
|
ecs_entity_t e5 = ecs_new_id(world);
|
|
ecs_entity_t e6 = ecs_new_id(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($r, California)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e5, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e6, LocatedIn, SanFrancisco);
|
|
|
|
ecs_add(world, e2, Tag);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e6, ecs_field_src(&it, 1));
|
|
test_uint(e6, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(e3, ecs_field_src(&it, 1));
|
|
test_uint(e3, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_id(world);
|
|
ecs_entity_t e2 = ecs_new_id(world);
|
|
ecs_entity_t e3 = ecs_new_id(world);
|
|
ecs_entity_t e4 = ecs_new_id(world);
|
|
ecs_entity_t e5 = ecs_new_id(world);
|
|
ecs_entity_t e6 = ecs_new_id(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($r, UnitedStates)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e5, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e6, LocatedIn, SanFrancisco);
|
|
|
|
ecs_add(world, e2, Tag);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e6, ecs_field_src(&it, 1));
|
|
test_uint(e6, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(e3, ecs_field_src(&it, 1));
|
|
test_uint(e3, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Seattle), ecs_field_id(&it, 1));
|
|
test_uint(e4, ecs_field_src(&it, 1));
|
|
test_uint(e4, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_id(world);
|
|
ecs_entity_t e2 = ecs_new_id(world);
|
|
ecs_entity_t e3 = ecs_new_id(world);
|
|
ecs_entity_t e4 = ecs_new_id(world);
|
|
ecs_entity_t e5 = ecs_new_id(world);
|
|
ecs_entity_t e6 = ecs_new_id(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($r, California)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Seattle);
|
|
ecs_add_pair(world, e5, LocatedIn, Amsterdam);
|
|
ecs_add_pair(world, e6, LocatedIn, SanFrancisco);
|
|
|
|
ecs_add(world, e2, Tag);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e6, ecs_field_src(&it, 1));
|
|
test_uint(e6, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(e3, ecs_field_src(&it, 1));
|
|
test_uint(e3, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_tgt_var(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($r, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_tgt_var_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($r, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Amsterdam), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Seattle), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, x_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, r_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_ent_src_tgt_this_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $this)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int this_var = ecs_rule_find_var(r, "This");
|
|
test_assert(this_var != -1);
|
|
test_assert(this_var != 0);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, UnitedStates);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_ent_src_tgt_this_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $this)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int this_var = ecs_rule_find_var(r, "This");
|
|
test_assert(this_var != -1);
|
|
test_assert(this_var != 0);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, California);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, this_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_ent_src_tgt_this_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $this)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int this_var = ecs_rule_find_var(r, "This");
|
|
test_assert(this_var != -1);
|
|
test_assert(this_var != 0);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, this_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_ent_src_tgt_this_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $this)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int this_var = ecs_rule_find_var(r, "This");
|
|
test_assert(this_var != -1);
|
|
test_assert(this_var != 0);
|
|
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, e1), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_iter_get_var(&it, this_var));
|
|
test_uint(e1, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, this_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_tgt_this(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($r, $this)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int this_var = ecs_rule_find_var(r, "This");
|
|
test_assert(this_var != -1);
|
|
test_assert(this_var != 0);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Netherlands, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, this_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Netherlands, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Washington, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, this_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_var_src_tgt_this_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($r, $this)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int this_var = ecs_rule_find_var(r, "This");
|
|
test_assert(this_var != -1);
|
|
|
|
int r_var = ecs_rule_find_var(r, "r");
|
|
test_assert(r_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Amsterdam), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Netherlands, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, this_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, this_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Netherlands, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Seattle), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Washington, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, this_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
test_uint(LosAngeles, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, this_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, this_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Washington, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(California, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Washington, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, r_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Netherlands, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, r_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_ent_src_constrain_tgt_var_before_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, City);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, SanFrancisco, City);
|
|
ecs_add(world, LosAngeles, City);
|
|
ecs_add(world, Seattle, City);
|
|
ecs_add(world, Amsterdam, City);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "City($x), LocatedIn(e1, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(City, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 2));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_ent_src_constrain_tgt_var_before_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, State);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, California, State);
|
|
ecs_add(world, Washington, State);
|
|
ecs_add(world, NoordHolland, State);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "State($x), LocatedIn(e1, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(State, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_ent_src_constrain_tgt_var_before_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Country);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, UnitedStates, Country);
|
|
ecs_add(world, Netherlands, Country);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, Amsterdam);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Country($x), LocatedIn(e1, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(Country, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_ent_src_constrain_tgt_var_after_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, City);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, SanFrancisco, City);
|
|
ecs_add(world, LosAngeles, City);
|
|
ecs_add(world, Seattle, City);
|
|
ecs_add(world, Amsterdam, City);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $x), City($x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(City, ecs_field_id(&it, 2));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 2));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_ent_src_constrain_tgt_var_after_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, State);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, California, State);
|
|
ecs_add(world, Washington, State);
|
|
ecs_add(world, NoordHolland, State);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $x), State($x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(State, ecs_field_id(&it, 2));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_ent_src_constrain_tgt_var_after_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Country);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, UnitedStates, Country);
|
|
ecs_add(world, Netherlands, Country);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, Amsterdam);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(e1, $x), Country($x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Country, ecs_field_id(&it, 2));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_this_src_constrain_tgt_var_before_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, City);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, SanFrancisco, City);
|
|
ecs_add(world, LosAngeles, City);
|
|
ecs_add(world, Seattle, City);
|
|
ecs_add(world, Amsterdam, City);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_entity_t e4 = ecs_new_entity(world, "e4");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "City($x), LocatedIn($this, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(City, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e2, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(City, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 2));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(City, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Amsterdam), ecs_field_id(&it, 2));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_this_src_constrain_tgt_var_before_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, State);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, California, State);
|
|
ecs_add(world, Washington, State);
|
|
ecs_add(world, NoordHolland, State);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_entity_t e4 = ecs_new_entity(world, "e4");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "State($x), LocatedIn($this, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(State, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(State, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e2, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(State, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 2));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(State, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 2));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(State, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 2));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(State, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Amsterdam), ecs_field_id(&it, 2));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_this_src_constrain_tgt_var_before_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Country);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, UnitedStates, Country);
|
|
ecs_add(world, Netherlands, Country);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_entity_t e4 = ecs_new_entity(world, "e4");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Country($x), LocatedIn($this, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Country, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Country, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Country, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e2, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Country, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 2));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Country, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 2));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Country, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 2));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Country, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 2));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Country, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Amsterdam), ecs_field_id(&it, 2));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_this_src_constrain_tgt_var_after_0_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, City);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, SanFrancisco, City);
|
|
ecs_add(world, LosAngeles, City);
|
|
ecs_add(world, Seattle, City);
|
|
ecs_add(world, Amsterdam, City);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_entity_t e4 = ecs_new_entity(world, "e4");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, $x), City($x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Amsterdam), ecs_field_id(&it, 1));
|
|
test_uint(City, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 2));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(City, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 2));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(City, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 2));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e2, it.entities[1]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_this_src_constrain_tgt_var_after_1_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, State);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, California, State);
|
|
ecs_add(world, Washington, State);
|
|
ecs_add(world, NoordHolland, State);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_entity_t e4 = ecs_new_entity(world, "e4");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, $x), State($x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(State, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 2));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(State, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(State, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e2, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(State, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 2));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(State, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 2));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(State, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_this_src_constrain_tgt_var_after_2_lvl(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Country);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add(world, UnitedStates, Country);
|
|
ecs_add(world, Netherlands, Country);
|
|
|
|
ecs_entity_t e1 = ecs_new_entity(world, "e1");
|
|
ecs_entity_t e2 = ecs_new_entity(world, "e2");
|
|
ecs_entity_t e3 = ecs_new_entity(world, "e3");
|
|
ecs_entity_t e4 = ecs_new_entity(world, "e4");
|
|
ecs_add_pair(world, e1, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e2, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e3, LocatedIn, LosAngeles);
|
|
ecs_add_pair(world, e4, LocatedIn, Amsterdam);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, $x), Country($x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Country, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 2));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Country, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Country, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, it.entities[0]);
|
|
test_uint(e2, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Country, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 2));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Country, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 2));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Country, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Country, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Country, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_src_tgt_same_var(void) {
|
|
ecs_log_set_level(-4);
|
|
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($x, $x)"
|
|
});
|
|
|
|
test_assert(r == NULL);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_src_tgt_same_var_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($x, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Amsterdam), ecs_field_id(&it, 1));
|
|
test_uint(Amsterdam, ecs_field_src(&it, 1));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(NoordHolland, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Seattle), ecs_field_id(&it, 1));
|
|
test_uint(Seattle, ecs_field_src(&it, 1));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(SanFrancisco, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(LosAngeles, ecs_field_src(&it, 1));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(California, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(Washington, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(UnitedStates, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Netherlands, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_src_tgt_same_this_var_reflexive(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_add_id(world, LocatedIn, EcsReflexive);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, $this)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int this_var = ecs_rule_find_var(r, "This");
|
|
test_assert(this_var != -1);
|
|
test_assert(this_var != 0);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Amsterdam), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Amsterdam, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, this_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Seattle), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Seattle, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, this_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, LosAngeles), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(LosAngeles, ecs_iter_get_var(&it, this_var));
|
|
test_uint(LosAngeles, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, this_var));
|
|
test_uint(California, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Washington, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, this_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, this_var));
|
|
test_uint(Netherlands, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_1_any_src_tgt_var(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn(_, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_not_transitive_ent_tgt(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "!LocatedIn($this, UnitedStates), Location($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(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
test_uint(Netherlands, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_not_transitive_var_tgt(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "!LocatedIn($this, $x), Location($this)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(EcsWildcard, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_not_transitive_ent_tgt_written(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Location($this), !LocatedIn($this, UnitedStates)"
|
|
});
|
|
|
|
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(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
test_uint(Netherlands, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_not_transitive_var_tgt_written(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Location($this), !LocatedIn($this, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(EcsWildcard, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_optional_transitive_ent_tgt(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "?LocatedIn($this, UnitedStates), Location($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(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
test_uint(Netherlands, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Location, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_optional_transitive_var_tgt(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "?LocatedIn($this, $x), Tag($this)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
|
|
ecs_add_pair(world, e2, LocatedIn, Earth);
|
|
ecs_add_pair(world, e3, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e4, LocatedIn, Washington);
|
|
ecs_add_pair(world, e4, LocatedIn, NoordHolland);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(false, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(EcsWildcard, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(Tag, ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_optional_transitive_ent_tgt_written(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Location($this), ?LocatedIn($this, UnitedStates)"
|
|
});
|
|
|
|
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(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
test_uint(Netherlands, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Location, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_optional_transitive_var_tgt_written(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "Tag($this), ?LocatedIn($this, $x)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_entity_t e1 = ecs_new(world, Tag);
|
|
ecs_entity_t e2 = ecs_new(world, Tag);
|
|
ecs_entity_t e3 = ecs_new(world, Tag);
|
|
ecs_entity_t e4 = ecs_new(world, Tag);
|
|
|
|
ecs_add_pair(world, e2, LocatedIn, Earth);
|
|
ecs_add_pair(world, e3, LocatedIn, SanFrancisco);
|
|
ecs_add_pair(world, e4, LocatedIn, Washington);
|
|
ecs_add_pair(world, e4, LocatedIn, NoordHolland);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(false, ecs_field_is_set(&it, 2));
|
|
test_uint(EcsWildcard, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e2, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(SanFrancisco, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e3, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(Tag, ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 2));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 2));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e4, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_2_var_src_w_same_tgt_ent(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
ECS_TAG(world, Tag);
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($x, California), LocatedIn($y, California), Tag($x), Tag($y)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
int y_var = ecs_rule_find_var(r, "y");
|
|
test_assert(y_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_entity_t e1 = ecs_new_w_pair(world, LocatedIn, SanFrancisco);
|
|
ecs_entity_t e2 = ecs_new_w_pair(world, LocatedIn, California);
|
|
ecs_entity_t e3 = ecs_new_w_pair(world, LocatedIn, Seattle);
|
|
ecs_entity_t e4 = ecs_new_w_pair(world, LocatedIn, Amsterdam);
|
|
|
|
ecs_add(world, e1, Tag);
|
|
ecs_add(world, e2, Tag);
|
|
ecs_add(world, e3, Tag);
|
|
ecs_add(world, e4, Tag);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(Tag, ecs_field_id(&it, 3));
|
|
test_uint(Tag, ecs_field_id(&it, 4));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 2));
|
|
test_uint(e2, ecs_field_src(&it, 3));
|
|
test_uint(e2, ecs_field_src(&it, 4));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(e2, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e2, ecs_iter_get_var(&it, y_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(Tag, ecs_field_id(&it, 3));
|
|
test_uint(Tag, ecs_field_id(&it, 4));
|
|
test_uint(e2, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 2));
|
|
test_uint(e2, ecs_field_src(&it, 3));
|
|
test_uint(e1, ecs_field_src(&it, 4));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(e2, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, ecs_iter_get_var(&it, y_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 2));
|
|
test_uint(Tag, ecs_field_id(&it, 3));
|
|
test_uint(Tag, ecs_field_id(&it, 4));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e2, ecs_field_src(&it, 2));
|
|
test_uint(e1, ecs_field_src(&it, 3));
|
|
test_uint(e2, ecs_field_src(&it, 4));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(e1, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e2, ecs_iter_get_var(&it, y_var));
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(0, it.count);
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 1));
|
|
test_uint(ecs_pair(LocatedIn, SanFrancisco), ecs_field_id(&it, 2));
|
|
test_uint(Tag, ecs_field_id(&it, 3));
|
|
test_uint(Tag, ecs_field_id(&it, 4));
|
|
test_uint(e1, ecs_field_src(&it, 1));
|
|
test_uint(e1, ecs_field_src(&it, 2));
|
|
test_uint(e1, ecs_field_src(&it, 3));
|
|
test_uint(e1, ecs_field_src(&it, 4));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 2));
|
|
test_uint(e1, ecs_iter_get_var(&it, x_var));
|
|
test_uint(e1, ecs_iter_get_var(&it, y_var));
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_self_target(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, $x:self)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
int x_var = ecs_rule_find_var(r, "x");
|
|
test_assert(x_var != -1);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Earth), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(Earth, ecs_iter_get_var(&it, x_var));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
test_uint(Netherlands, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, UnitedStates), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(UnitedStates, ecs_iter_get_var(&it, x_var));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, California), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(California, ecs_iter_get_var(&it, x_var));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Washington), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(Washington, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, Netherlands), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(Netherlands, ecs_iter_get_var(&it, x_var));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, NoordHolland), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(NoordHolland, ecs_iter_get_var(&it, x_var));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|
|
|
|
void RulesTransitive_any_target(void) {
|
|
ecs_world_t *world = ecs_init();
|
|
|
|
populate_facts(world);
|
|
|
|
ecs_rule_t *r = ecs_rule(world, {
|
|
.expr = "LocatedIn($this, _)"
|
|
});
|
|
|
|
test_assert(r != NULL);
|
|
|
|
{
|
|
ecs_iter_t it = ecs_rule_iter(world, r);
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(UnitedStates, it.entities[0]);
|
|
test_uint(Netherlands, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(California, it.entities[0]);
|
|
test_uint(Washington, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(2, it.count);
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(SanFrancisco, it.entities[0]);
|
|
test_uint(LosAngeles, it.entities[1]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(Seattle, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(NoordHolland, it.entities[0]);
|
|
|
|
test_bool(true, ecs_rule_next(&it));
|
|
test_uint(1, it.count);
|
|
test_uint(ecs_pair(LocatedIn, EcsWildcard), ecs_field_id(&it, 1));
|
|
test_uint(0, ecs_field_src(&it, 1));
|
|
test_bool(true, ecs_field_is_set(&it, 1));
|
|
test_uint(Amsterdam, it.entities[0]);
|
|
|
|
test_bool(false, ecs_rule_next(&it));
|
|
}
|
|
|
|
ecs_rule_fini(r);
|
|
|
|
ecs_fini(world);
|
|
}
|