4390 lines
96 KiB
C++
4390 lines
96 KiB
C++
#include <cpp_api.h>
|
|
|
|
struct Parent {
|
|
struct EntityType { };
|
|
};
|
|
|
|
void Entity_new(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
}
|
|
|
|
void Entity_new_named(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = flecs::entity(world, "Foo");
|
|
test_assert(entity);
|
|
test_str(entity.name().c_str(), "Foo");
|
|
}
|
|
|
|
void Entity_new_named_from_scope(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = flecs::entity(world, "Foo");
|
|
test_assert(entity);
|
|
test_str(entity.name().c_str(), "Foo");
|
|
|
|
auto prev = world.set_scope(entity);
|
|
|
|
auto child = world.entity("Bar");
|
|
test_assert(child != 0);
|
|
|
|
world.set_scope(prev);
|
|
|
|
test_str(child.name().c_str(), "Bar");
|
|
test_str(child.path().c_str(), "::Foo::Bar");
|
|
}
|
|
|
|
void Entity_new_nested_named_from_scope(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = flecs::entity(world, "Foo");
|
|
test_assert(entity);
|
|
test_str(entity.name().c_str(), "Foo");
|
|
|
|
auto prev = world.set_scope(entity);
|
|
|
|
auto child = world.entity("Bar::Hello");
|
|
test_assert(child != 0);
|
|
|
|
world.set_scope(prev);
|
|
|
|
test_str(child.name().c_str(), "Hello");
|
|
test_str(child.path().c_str(), "::Foo::Bar::Hello");
|
|
}
|
|
|
|
void Entity_new_nested_named_from_nested_scope(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = flecs::entity(world, "Foo::Bar");
|
|
test_assert(entity);
|
|
test_str(entity.name().c_str(), "Bar");
|
|
test_str(entity.path().c_str(), "::Foo::Bar");
|
|
|
|
auto prev = world.set_scope(entity);
|
|
|
|
auto child = world.entity("Hello::World");
|
|
test_assert(child != 0);
|
|
|
|
world.set_scope(prev);
|
|
|
|
test_str(child.name().c_str(), "World");
|
|
test_str(child.path().c_str(), "::Foo::Bar::Hello::World");
|
|
}
|
|
|
|
void Entity_new_add(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
|
|
auto entity = world.entity()
|
|
.add<Position>();
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
}
|
|
|
|
void Entity_new_add_2(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
world.component<Velocity>();
|
|
|
|
auto entity = world.entity()
|
|
.add<Position>()
|
|
.add<Velocity>();
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
test_assert(entity.has<Velocity>());
|
|
}
|
|
|
|
void Entity_new_set(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
|
|
auto entity = world.entity()
|
|
.set<Position>({10, 20});
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
|
|
const Position *p = entity.get<Position>();
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_new_set_2(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
world.component<Velocity>();
|
|
|
|
auto entity = world.entity()
|
|
.set<Position>({10, 20})
|
|
.set<Velocity>({1, 2});
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
test_assert(entity.has<Velocity>());
|
|
|
|
const Position *p = entity.get<Position>();
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Velocity *v = entity.get<Velocity>();
|
|
test_int(v->x, 1);
|
|
test_int(v->y, 2);
|
|
}
|
|
|
|
void Entity_add(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add<Position>();
|
|
test_assert(entity.has<Position>());
|
|
}
|
|
|
|
void Entity_remove(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add<Position>();
|
|
test_assert(entity.has<Position>());
|
|
|
|
entity.remove<Position>();
|
|
test_assert(!entity.has<Position>());
|
|
}
|
|
|
|
void Entity_set(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.set<Position>({10, 20});
|
|
test_assert(entity.has<Position>());
|
|
|
|
const Position *p = entity.get<Position>();
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_emplace_2(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.emplace<Position>(10.0f, 20.0f)
|
|
.emplace<Velocity>(30.0f, 40.0f);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
|
|
const Position *p = e.get<Position>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Velocity *v = e.get<Velocity>();
|
|
test_assert(v != NULL);
|
|
test_int(v->x, 30);
|
|
test_int(v->y, 40);
|
|
}
|
|
|
|
void Entity_emplace_after_add(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.add<Position>()
|
|
.emplace<Velocity>(30.0f, 40.0f);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
|
|
const Velocity *v = e.get<Velocity>();
|
|
test_assert(v != NULL);
|
|
test_int(v->x, 30);
|
|
test_int(v->y, 40);
|
|
}
|
|
|
|
void Entity_emplace_after_add_pair(void) {
|
|
flecs::world ecs;
|
|
|
|
auto dummy = ecs.entity();
|
|
|
|
auto e = ecs.entity()
|
|
.add(flecs::ChildOf, dummy)
|
|
.emplace<Velocity>(30.0f, 40.0f);
|
|
|
|
test_assert(e.has(flecs::ChildOf, dummy));
|
|
test_assert(e.has<Velocity>());
|
|
|
|
const Velocity *v = e.get<Velocity>();
|
|
test_assert(v != NULL);
|
|
test_int(v->x, 30);
|
|
test_int(v->y, 40);
|
|
}
|
|
|
|
void Entity_emplace_pair(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.emplace<Position, Tag>(10.0f, 20.0f);
|
|
|
|
test_assert((e.has<Position, Tag>()));
|
|
|
|
const Position *p = e.get<Position, Tag>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_emplace_pair_w_entity(void) {
|
|
flecs::world ecs;
|
|
|
|
auto tag = ecs.entity();
|
|
|
|
auto e = ecs.entity()
|
|
.emplace_first<Position>(tag, 10.0f, 20.0f);
|
|
|
|
test_assert((e.has<Position>(tag)));
|
|
|
|
const Position *p = e.get<Position>(tag);
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_emplace_pair_type(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.emplace<flecs::pair<Position, Tag>>(10.0f, 20.0f);
|
|
|
|
test_assert((e.has<Position, Tag>()));
|
|
|
|
const Position *p = e.get<Position, Tag>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_emplace_pair_second(void) {
|
|
flecs::world ecs;
|
|
|
|
auto tag = ecs.entity();
|
|
|
|
auto e = ecs.entity()
|
|
.emplace_second<Position>(tag, 10.0f, 20.0f);
|
|
|
|
test_assert((e.has_second<Position>(tag)));
|
|
|
|
const Position *p = e.get_second<Position>(tag);
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_add_2(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
world.component<Velocity>();
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add<Position>()
|
|
.add<Velocity>();
|
|
|
|
test_assert(entity.has<Position>());
|
|
test_assert(entity.has<Velocity>());
|
|
}
|
|
|
|
void Entity_add_entity(void) {
|
|
flecs::world world;
|
|
|
|
auto tag = world.entity();
|
|
test_assert(tag != 0);
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add(tag);
|
|
test_assert(entity.has(tag));
|
|
}
|
|
|
|
void Entity_add_childof(void) {
|
|
flecs::world world;
|
|
|
|
auto parent = world.entity();
|
|
test_assert(parent != 0);
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add(flecs::ChildOf, parent);
|
|
test_assert(entity.has(flecs::ChildOf, parent));
|
|
}
|
|
|
|
void Entity_add_instanceof(void) {
|
|
flecs::world world;
|
|
|
|
auto base = world.entity();
|
|
test_assert(base != 0);
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add(flecs::IsA, base);
|
|
test_assert(entity.has(flecs::IsA, base));
|
|
}
|
|
|
|
void Entity_remove_2(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
world.component<Velocity>();
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add<Position>()
|
|
.add<Velocity>();
|
|
|
|
test_assert(entity.has<Position>());
|
|
test_assert(entity.has<Velocity>());
|
|
|
|
entity.remove<Position>()
|
|
.remove<Velocity>();
|
|
|
|
test_assert(!entity.has<Position>());
|
|
test_assert(!entity.has<Velocity>());
|
|
}
|
|
|
|
void Entity_set_2(void) {
|
|
flecs::world world;
|
|
|
|
world.component<Position>();
|
|
world.component<Velocity>();
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.set<Position>({10, 20})
|
|
.set<Velocity>({1, 2});
|
|
test_assert(entity.has<Position>());
|
|
test_assert(entity.has<Velocity>());
|
|
|
|
const Position *p = entity.get<Position>();
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Velocity *v = entity.get<Velocity>();
|
|
test_int(v->x, 1);
|
|
test_int(v->y, 2);
|
|
}
|
|
|
|
void Entity_remove_entity(void) {
|
|
flecs::world world;
|
|
|
|
auto tag = world.entity();
|
|
test_assert(tag != 0);
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add(tag);
|
|
test_assert(entity.has(tag));
|
|
|
|
entity.remove(tag);
|
|
test_assert(!entity.has(tag));
|
|
}
|
|
|
|
void Entity_remove_childof(void) {
|
|
flecs::world world;
|
|
|
|
auto parent = world.entity();
|
|
test_assert(parent != 0);
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add(flecs::ChildOf, parent);
|
|
test_assert(entity.has(flecs::ChildOf, parent));
|
|
|
|
entity.remove(flecs::ChildOf, parent);
|
|
test_assert(!entity.has(flecs::ChildOf, parent));
|
|
}
|
|
|
|
void Entity_remove_instanceof(void) {
|
|
flecs::world world;
|
|
|
|
auto base = world.entity();
|
|
test_assert(base != 0);
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
entity.add(flecs::IsA, base);
|
|
test_assert(entity.has(flecs::IsA, base));
|
|
|
|
entity.remove(flecs::IsA, base);
|
|
test_assert(!entity.has(flecs::IsA, base));
|
|
}
|
|
|
|
void Entity_get_generic(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
|
|
auto entity = world.entity()
|
|
.set<Position>({10, 20});
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
|
|
const void *void_p = entity.get(position);
|
|
test_assert(void_p != nullptr);
|
|
|
|
const Position *p = static_cast<const Position*>(void_p);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_get_mut_generic(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
|
|
auto entity = world.entity()
|
|
.set<Position>({10, 20});
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
|
|
bool invoked;
|
|
world.observer<Position>()
|
|
.event(flecs::OnSet)
|
|
.each([&invoked](flecs::entity e, Position& p) {
|
|
invoked = true;
|
|
});
|
|
|
|
void *void_p = entity.get_mut(position);
|
|
test_assert(void_p != nullptr);
|
|
|
|
Position *p = static_cast<Position*>(void_p);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
entity.modified(position);
|
|
test_bool(invoked, true);
|
|
}
|
|
|
|
void Entity_get_generic_w_id(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
flecs::id id = position;
|
|
|
|
auto entity = world.entity()
|
|
.set<Position>({10, 20});
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
|
|
const void *void_p = entity.get(id);
|
|
test_assert(void_p != nullptr);
|
|
|
|
const Position *p = static_cast<const Position*>(void_p);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_get_generic_w_id_t(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
flecs::id_t id = position;
|
|
|
|
auto entity = world.entity()
|
|
.set<Position>({10, 20});
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
|
|
const void *void_p = entity.get(id);
|
|
test_assert(void_p != nullptr);
|
|
|
|
const Position *p = static_cast<const Position*>(void_p);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_get_mut_generic_w_id(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
flecs::id id = position;
|
|
|
|
auto entity = world.entity()
|
|
.set<Position>({10, 20});
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
|
|
bool invoked;
|
|
world.observer<Position>()
|
|
.event(flecs::OnSet)
|
|
.each([&invoked](flecs::entity e, Position& p) {
|
|
invoked = true;
|
|
});
|
|
|
|
void *void_p = entity.get_mut(id);
|
|
test_assert(void_p != nullptr);
|
|
|
|
Position *p = static_cast<Position*>(void_p);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
entity.modified(id);
|
|
test_bool(invoked, true);
|
|
}
|
|
|
|
void Entity_get_mut_generic_w_id_t(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
flecs::id_t id = position;
|
|
|
|
auto entity = world.entity()
|
|
.set<Position>({10, 20});
|
|
|
|
test_assert(entity);
|
|
test_assert(entity.has<Position>());
|
|
|
|
bool invoked;
|
|
world.observer<Position>()
|
|
.event(flecs::OnSet)
|
|
.each([&invoked](flecs::entity e, Position& p) {
|
|
invoked = true;
|
|
});
|
|
|
|
void *void_p = entity.get_mut(id);
|
|
test_assert(void_p != nullptr);
|
|
|
|
Position *p = static_cast<Position*>(void_p);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
entity.modified(id);
|
|
test_bool(invoked, true);
|
|
}
|
|
|
|
void Entity_set_generic(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
|
|
Position p = {10, 20};
|
|
|
|
auto e = world.entity()
|
|
.set_ptr(position, sizeof(Position), &p);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has(position));
|
|
|
|
const Position *ptr = e.get<Position>();
|
|
test_int(ptr->x, 10);
|
|
test_int(ptr->y, 20);
|
|
}
|
|
|
|
void Entity_set_generic_w_id(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
flecs::id id = position;
|
|
|
|
Position p = {10, 20};
|
|
|
|
auto e = world.entity()
|
|
.set_ptr(id, sizeof(Position), &p);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has(id));
|
|
|
|
const Position *ptr = e.get<Position>();
|
|
test_int(ptr->x, 10);
|
|
test_int(ptr->y, 20);
|
|
}
|
|
|
|
void Entity_set_generic_w_id_t(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
flecs::id_t id = position;
|
|
|
|
Position p = {10, 20};
|
|
|
|
auto e = world.entity()
|
|
.set_ptr(id, sizeof(Position), &p);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has(id));
|
|
|
|
const Position *ptr = e.get<Position>();
|
|
test_int(ptr->x, 10);
|
|
test_int(ptr->y, 20);
|
|
}
|
|
|
|
void Entity_set_generic_no_size(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
|
|
Position p = {10, 20};
|
|
|
|
auto e = world.entity()
|
|
.set_ptr(position, &p);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has(position));
|
|
|
|
const Position *ptr = e.get<Position>();
|
|
test_int(ptr->x, 10);
|
|
test_int(ptr->y, 20);
|
|
}
|
|
|
|
void Entity_set_generic_no_size_w_id(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
flecs::id id = position;
|
|
|
|
Position p = {10, 20};
|
|
|
|
auto e = world.entity()
|
|
.set_ptr(id, &p);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has(id));
|
|
|
|
const Position *ptr = e.get<Position>();
|
|
test_int(ptr->x, 10);
|
|
test_int(ptr->y, 20);
|
|
}
|
|
|
|
void Entity_set_generic_no_size_w_id_t(void) {
|
|
flecs::world world;
|
|
|
|
auto position = world.component<Position>();
|
|
flecs::id_t id = position;
|
|
|
|
Position p = {10, 20};
|
|
|
|
auto e = world.entity()
|
|
.set_ptr(id, &p);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has(id));
|
|
|
|
const Position *ptr = e.get<Position>();
|
|
test_int(ptr->x, 10);
|
|
test_int(ptr->y, 20);
|
|
}
|
|
|
|
void Entity_add_role(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = world.entity();
|
|
|
|
entity = entity.add_flags(flecs::Pair);
|
|
|
|
test_assert(entity & ECS_PAIR);
|
|
}
|
|
|
|
void Entity_remove_role(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = world.entity();
|
|
|
|
flecs::entity_t id = entity;
|
|
|
|
entity = entity.add_flags(flecs::Pair);
|
|
|
|
test_assert(entity & ECS_PAIR);
|
|
|
|
entity = entity.remove_flags();
|
|
|
|
test_assert(entity == id);
|
|
}
|
|
|
|
void Entity_has_role(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = world.entity();
|
|
|
|
entity = entity.add_flags(flecs::Pair);
|
|
|
|
test_assert(entity.has_flags(flecs::Pair));
|
|
|
|
entity = entity.remove_flags();
|
|
|
|
test_assert(!entity.has_flags(flecs::Pair));
|
|
}
|
|
|
|
void Entity_pair_role(void) {
|
|
flecs::world world;
|
|
|
|
auto a = world.entity();
|
|
auto b = world.entity();
|
|
|
|
auto pair = flecs::id(a, b);
|
|
pair = pair.add_flags(flecs::Pair);
|
|
|
|
test_assert(pair.has_flags(flecs::Pair));
|
|
|
|
auto rel = pair.first();
|
|
auto obj = pair.second();
|
|
|
|
test_assert(rel == a);
|
|
test_assert(obj == b);
|
|
}
|
|
|
|
void Entity_equals(void) {
|
|
flecs::world world;
|
|
|
|
auto e1 = world.entity();
|
|
auto e2 = world.entity();
|
|
|
|
auto e1_2 = world.entity(e1);
|
|
auto e2_2 = world.entity(e2);
|
|
|
|
test_assert(e1 == e1_2);
|
|
test_assert(e2 == e2_2);
|
|
test_assert(e1 >= e1_2);
|
|
test_assert(e1 <= e1_2);
|
|
test_assert(e2 >= e2_2);
|
|
test_assert(e2 <= e2_2);
|
|
test_assert(e1 != e2);
|
|
|
|
test_assert(!(e2 == e1_2));
|
|
test_assert(!(e1 == e2_2));
|
|
test_assert(!(e2 <= e1_2));
|
|
test_assert(!(e1 >= e2_2));
|
|
test_assert(!(e2 != e2));
|
|
}
|
|
|
|
void Entity_compare_0(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity();
|
|
auto e0 = world.entity(0);
|
|
auto e0_2 = world.entity(0);
|
|
|
|
test_assert(e != e0);
|
|
test_assert(e > e0);
|
|
test_assert(e >= e0);
|
|
test_assert(e0 < e);
|
|
test_assert(e0 <= e);
|
|
|
|
test_assert(e0 == e0_2);
|
|
test_assert(e0 >= e0_2);
|
|
test_assert(e0 <= e0_2);
|
|
}
|
|
|
|
void Entity_compare_id_t(void) {
|
|
flecs::world world;
|
|
|
|
auto e1 = world.entity();
|
|
auto e2 = world.entity();
|
|
|
|
flecs::id_t id1 = e1;
|
|
flecs::id_t id2 = e2;
|
|
|
|
test_assert(e1 == id1);
|
|
test_assert(e2 == id2);
|
|
|
|
test_assert(e1 != id2);
|
|
test_assert(e2 != id1);
|
|
|
|
test_assert(e1 >= id1);
|
|
test_assert(e2 >= id2);
|
|
|
|
test_assert(e1 <= id1);
|
|
test_assert(e2 <= id2);
|
|
|
|
test_assert(e1 <= id2);
|
|
test_assert(e2 >= id1);
|
|
|
|
test_assert(e1 < id2);
|
|
test_assert(e2 > id1);
|
|
|
|
|
|
test_assert(!(e2 == id1));
|
|
test_assert(!(e1 == id2));
|
|
|
|
test_assert(!(e2 != id2));
|
|
test_assert(!(e1 != id1));
|
|
|
|
test_assert(!(e1 >= id2));
|
|
test_assert(!(e2 <= id1));
|
|
|
|
test_assert(!(e2 < id2));
|
|
test_assert(!(e1 > id1));
|
|
}
|
|
|
|
void Entity_compare_id(void) {
|
|
flecs::world world;
|
|
|
|
auto e1 = world.entity();
|
|
auto e2 = world.entity();
|
|
|
|
flecs::id id1 = e1;
|
|
flecs::id id2 = e2;
|
|
|
|
test_assert(e1 == id1);
|
|
test_assert(e2 == id2);
|
|
|
|
test_assert(e1 != id2);
|
|
test_assert(e2 != id1);
|
|
|
|
test_assert(e1 >= id1);
|
|
test_assert(e2 >= id2);
|
|
|
|
test_assert(e1 <= id1);
|
|
test_assert(e2 <= id2);
|
|
|
|
test_assert(e1 <= id2);
|
|
test_assert(e2 >= id1);
|
|
|
|
test_assert(e1 < id2);
|
|
test_assert(e2 > id1);
|
|
|
|
|
|
test_assert(!(e2 == id1));
|
|
test_assert(!(e1 == id2));
|
|
|
|
test_assert(!(e2 != id2));
|
|
test_assert(!(e1 != id1));
|
|
|
|
test_assert(!(e1 >= id2));
|
|
test_assert(!(e2 <= id1));
|
|
|
|
test_assert(!(e2 < id2));
|
|
test_assert(!(e1 > id1));
|
|
}
|
|
|
|
void Entity_compare_literal(void) {
|
|
flecs::world world;
|
|
|
|
auto e1 = world.entity(500);
|
|
auto e2 = world.entity(600);
|
|
|
|
test_assert(e1 == 500);
|
|
test_assert(e2 == 600);
|
|
|
|
test_assert(e1 != 600);
|
|
test_assert(e2 != 500);
|
|
|
|
test_assert(e1 >= 500);
|
|
test_assert(e2 >= 600);
|
|
|
|
test_assert(e1 <= 500);
|
|
test_assert(e2 <= 600);
|
|
|
|
test_assert(e1 <= 600);
|
|
test_assert(e2 >= 500);
|
|
|
|
test_assert(e1 < 600);
|
|
test_assert(e2 > 500);
|
|
|
|
|
|
test_assert(!(e2 == 500));
|
|
test_assert(!(e1 == 600));
|
|
|
|
test_assert(!(e2 != 600));
|
|
test_assert(!(e1 != 500));
|
|
|
|
test_assert(!(e1 >= 600));
|
|
test_assert(!(e2 <= 500));
|
|
|
|
test_assert(!(e2 < 600));
|
|
test_assert(!(e1 > 500));
|
|
}
|
|
|
|
void Entity_greater_than(void) {
|
|
flecs::world world;
|
|
|
|
auto e1 = world.entity();
|
|
auto e2 = world.entity();
|
|
|
|
test_assert(e2 > e1);
|
|
test_assert(e2 >= e1);
|
|
}
|
|
|
|
void Entity_less_than(void) {
|
|
flecs::world world;
|
|
|
|
auto e1 = world.entity();
|
|
auto e2 = world.entity();
|
|
|
|
test_assert(e1 < e2);
|
|
test_assert(e1 <= e2);
|
|
}
|
|
|
|
void Entity_not_0_or_1(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity();
|
|
|
|
flecs::id_t id = e;
|
|
|
|
test_assert(id != 0);
|
|
test_assert(id != 1);
|
|
}
|
|
|
|
void Entity_not_true_or_false(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity();
|
|
|
|
flecs::id_t id = e;
|
|
|
|
test_assert(id != true);
|
|
test_assert(id != false);
|
|
}
|
|
|
|
void Entity_has_childof(void) {
|
|
flecs::world world;
|
|
|
|
auto parent = world.entity();
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::ChildOf, parent);
|
|
|
|
test_assert(e.has(flecs::ChildOf, parent));
|
|
}
|
|
|
|
void Entity_has_instanceof(void) {
|
|
flecs::world world;
|
|
|
|
auto base = world.entity();
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert(e.has(flecs::IsA, base));
|
|
}
|
|
|
|
void Entity_has_instanceof_indirect(void) {
|
|
flecs::world world;
|
|
|
|
auto base_of_base = world.entity();
|
|
|
|
auto base = world.entity()
|
|
.add(flecs::IsA, base_of_base);
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert(e.has(flecs::IsA, base_of_base));
|
|
}
|
|
|
|
void Entity_null_string(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity();
|
|
|
|
test_str(e.name().c_str(), "");
|
|
}
|
|
|
|
void Entity_set_name(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity();
|
|
test_str(e.name().c_str(), "");
|
|
|
|
e.set_name("Foo");
|
|
test_str(e.name().c_str(), "Foo");
|
|
}
|
|
|
|
void Entity_change_name(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity("Bar");
|
|
test_str(e.name().c_str(), "Bar");
|
|
|
|
e.set_name("Foo");
|
|
test_str(e.name().c_str(), "Foo");
|
|
}
|
|
|
|
void Entity_delete(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity()
|
|
.add<Position>()
|
|
.add<Velocity>();
|
|
|
|
e.destruct();
|
|
|
|
test_assert(!e.is_alive());
|
|
|
|
auto e2 = world.entity();
|
|
|
|
// Entity ids should be equal without the generation
|
|
test_assert((uint32_t)e2 == (uint32_t)e);
|
|
test_assert(e2 != e);
|
|
}
|
|
|
|
void Entity_clear(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity()
|
|
.add<Position>()
|
|
.add<Velocity>();
|
|
|
|
e.clear();
|
|
|
|
test_assert(!e.has<Position>());
|
|
test_assert(!e.has<Velocity>());
|
|
|
|
auto e2 = world.entity();
|
|
test_assert(e2 > e);
|
|
}
|
|
|
|
void Entity_foce_owned(void) {
|
|
flecs::world world;
|
|
|
|
auto prefab = world.prefab()
|
|
.add<Position>()
|
|
.add<Velocity>()
|
|
.override<Position>();
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, prefab);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.owns<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
test_assert(!e.owns<Velocity>());
|
|
}
|
|
|
|
void Entity_force_owned_2(void) {
|
|
flecs::world world;
|
|
|
|
auto prefab = world.prefab()
|
|
.add<Position>()
|
|
.add<Velocity>()
|
|
.override<Position>()
|
|
.override<Velocity>();
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, prefab);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.owns<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
test_assert(e.owns<Velocity>());
|
|
}
|
|
|
|
void Entity_force_owned_nested(void) {
|
|
flecs::world world;
|
|
|
|
auto prefab = world.prefab()
|
|
.add<Position>()
|
|
.add<Velocity>()
|
|
.override<Position>();
|
|
|
|
auto prefab_2 = world.prefab()
|
|
.add(flecs::IsA, prefab);
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, prefab_2);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.owns<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
test_assert(!e.owns<Velocity>());
|
|
}
|
|
|
|
struct MyTag { };
|
|
|
|
void Entity_tag_has_size_zero(void) {
|
|
flecs::world world;
|
|
|
|
auto comp = world.component<MyTag>();
|
|
|
|
auto ptr = comp.get<flecs::Component>();
|
|
test_int(ptr->size, 0);
|
|
test_int(ptr->alignment, 0);
|
|
}
|
|
|
|
void Entity_get_null_name(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity().set_name(nullptr);
|
|
|
|
auto n = e.name();
|
|
test_assert(n.size() == 0);
|
|
}
|
|
|
|
void Entity_get_target(void) {
|
|
flecs::world world;
|
|
|
|
auto Rel = world.entity();
|
|
|
|
auto obj1 = world.entity()
|
|
.add<Position>();
|
|
|
|
auto obj2 = world.entity()
|
|
.add<Velocity>();
|
|
|
|
auto obj3 = world.entity()
|
|
.add<Mass>();
|
|
|
|
auto child = world.entity()
|
|
.add(Rel, obj1)
|
|
.add(Rel, obj2)
|
|
.add(Rel, obj3);
|
|
|
|
auto p = child.target(Rel);
|
|
test_assert(p != 0);
|
|
test_assert(p == obj1);
|
|
|
|
p = child.target(Rel, 0);
|
|
test_assert(p != 0);
|
|
test_assert(p == obj1);
|
|
|
|
p = child.target(Rel, 1);
|
|
test_assert(p != 0);
|
|
test_assert(p == obj2);
|
|
|
|
p = child.target(Rel, 2);
|
|
test_assert(p != 0);
|
|
test_assert(p == obj3);
|
|
|
|
p = child.target(Rel, 3);
|
|
test_assert(p == 0);
|
|
}
|
|
|
|
void Entity_get_parent(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity();
|
|
flecs::entity child = world.entity().child_of(parent);
|
|
|
|
test_assert(child.target(flecs::ChildOf) == parent);
|
|
test_assert(child.parent() == parent);
|
|
}
|
|
|
|
void Entity_is_component_enabled(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity()
|
|
.add<Position>();
|
|
|
|
test_assert(e.enabled<Position>());
|
|
test_assert(!e.enabled<Velocity>());
|
|
}
|
|
|
|
void Entity_is_enabled_component_enabled(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity()
|
|
.add<Position>()
|
|
.enable<Position>();
|
|
|
|
test_assert(e.enabled<Position>());
|
|
}
|
|
|
|
void Entity_is_disabled_component_enabled(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity()
|
|
.add<Position>()
|
|
.disable<Position>();
|
|
|
|
test_assert(!e.enabled<Position>());
|
|
}
|
|
|
|
void Entity_is_pair_enabled(void) {
|
|
flecs::world world;
|
|
|
|
struct TgtA { };
|
|
struct TgtB { };
|
|
|
|
auto e = world.entity()
|
|
.add<Position, TgtA>();
|
|
|
|
test_assert((e.enabled<Position, TgtA>()));
|
|
test_assert((!e.enabled<Position, TgtB>()));
|
|
}
|
|
|
|
void Entity_is_enabled_pair_enabled(void) {
|
|
flecs::world world;
|
|
|
|
struct Tgt { };
|
|
|
|
auto e = world.entity()
|
|
.add<Position, Tgt>()
|
|
.enable<Position, Tgt>();
|
|
|
|
test_assert((e.enabled<Position, Tgt>()));
|
|
}
|
|
|
|
void Entity_is_disabled_pair_enabled(void) {
|
|
flecs::world world;
|
|
|
|
struct Tgt { };
|
|
|
|
auto e = world.entity()
|
|
.add<Position, Tgt>()
|
|
.disable<Position, Tgt>();
|
|
|
|
test_assert((!e.enabled<Position, Tgt>()));
|
|
}
|
|
|
|
void Entity_is_pair_enabled_w_ids(void) {
|
|
flecs::world world;
|
|
|
|
auto rel = world.entity();
|
|
auto tgt_a = world.entity();
|
|
auto tgt_b = world.entity();
|
|
|
|
auto e = world.entity()
|
|
.add(rel, tgt_a);
|
|
|
|
test_assert((e.enabled(rel, tgt_a)));
|
|
test_assert((!e.enabled(rel, tgt_b)));
|
|
}
|
|
|
|
void Entity_is_enabled_pair_enabled_w_ids(void) {
|
|
flecs::world world;
|
|
|
|
auto rel = world.entity();
|
|
auto tgt = world.entity();
|
|
|
|
auto e = world.entity()
|
|
.add(rel, tgt)
|
|
.enable(rel, tgt);
|
|
|
|
test_assert((e.enabled(rel, tgt)));
|
|
}
|
|
|
|
void Entity_is_disabled_pair_enabled_w_ids(void) {
|
|
flecs::world world;
|
|
|
|
auto rel = world.entity();
|
|
auto tgt = world.entity();
|
|
|
|
auto e = world.entity()
|
|
.add(rel, tgt)
|
|
.disable(rel, tgt);
|
|
|
|
test_assert((!e.enabled(rel, tgt)));
|
|
}
|
|
|
|
void Entity_is_pair_enabled_w_tgt_id(void) {
|
|
flecs::world world;
|
|
|
|
auto tgt_a = world.entity();
|
|
auto tgt_b = world.entity();
|
|
|
|
auto e = world.entity()
|
|
.add<Position>(tgt_a);
|
|
|
|
test_assert((e.enabled<Position>(tgt_a)));
|
|
test_assert((!e.enabled<Position>(tgt_b)));
|
|
}
|
|
|
|
void Entity_is_enabled_pair_enabled_w_tgt_id(void) {
|
|
flecs::world world;
|
|
|
|
auto tgt = world.entity();
|
|
|
|
auto e = world.entity()
|
|
.add<Position>(tgt)
|
|
.enable<Position>(tgt);
|
|
|
|
test_assert((e.enabled<Position>(tgt)));
|
|
}
|
|
|
|
void Entity_is_disabled_pair_enabled_w_tgt_id(void) {
|
|
flecs::world world;
|
|
|
|
auto tgt = world.entity();
|
|
|
|
auto e = world.entity()
|
|
.add<Position>(tgt)
|
|
.disable<Position>(tgt);
|
|
|
|
test_assert((!e.enabled<Position>(tgt)));
|
|
}
|
|
|
|
void Entity_get_type(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = world.entity();
|
|
test_assert(entity);
|
|
|
|
auto type_1 = entity.type();
|
|
test_int(type_1.count(), 0);
|
|
|
|
auto type_2 = entity.type();
|
|
test_int(type_2.count(), 0);
|
|
}
|
|
|
|
void Entity_get_nonempty_type(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = world.entity()
|
|
.add<Position>();
|
|
test_assert(entity);
|
|
|
|
auto type_1 = entity.type();
|
|
test_int(type_1.count(), 1);
|
|
test_int(type_1.get(0), world.id<Position>());
|
|
|
|
auto type_2 = entity.type();
|
|
test_int(type_2.count(), 1);
|
|
test_int(type_2.get(0), world.id<Position>());
|
|
}
|
|
|
|
void Entity_set_no_copy(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity()
|
|
.set<Pod>({10});
|
|
test_int(Pod::copy_invoked, 0);
|
|
|
|
test_assert(e.has<Pod>());
|
|
const Pod *p = e.get<Pod>();
|
|
test_assert(p != NULL);
|
|
test_int(p->value, 10);
|
|
}
|
|
|
|
void Entity_set_copy(void) {
|
|
flecs::world world;
|
|
|
|
Pod val(10);
|
|
|
|
auto e = world.entity()
|
|
.set<Pod>(val);
|
|
test_int(Pod::copy_invoked, 1);
|
|
|
|
test_assert(e.has<Pod>());
|
|
const Pod *p = e.get<Pod>();
|
|
test_assert(p != NULL);
|
|
test_int(p->value, 10);
|
|
}
|
|
|
|
void Entity_set_deduced(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity()
|
|
.set(Position{10, 20});
|
|
|
|
test_assert(e.has<Position>());
|
|
|
|
const Position *p = e.get<Position>();
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_override(void) {
|
|
flecs::world world;
|
|
|
|
auto base = world.entity()
|
|
.override<Position>();
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.owns<Position>());
|
|
}
|
|
|
|
void Entity_override_id(void) {
|
|
flecs::world world;
|
|
|
|
auto tag_a = world.entity();
|
|
auto tag_b = world.entity();
|
|
|
|
auto base = world.entity()
|
|
.override(tag_a)
|
|
.add(tag_b);
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert(e.has(tag_a));
|
|
test_assert(e.owns(tag_a));
|
|
|
|
test_assert(e.has(tag_b));
|
|
test_assert(!e.owns(tag_b));
|
|
}
|
|
|
|
void Entity_override_pair_w_tgt_id(void) {
|
|
flecs::world world;
|
|
|
|
auto tgt_a = world.entity();
|
|
auto tgt_b = world.entity();
|
|
|
|
auto base = world.entity()
|
|
.override<Position>(tgt_a)
|
|
.add<Position>(tgt_b);
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert(e.has<Position>(tgt_a));
|
|
test_assert(e.owns<Position>(tgt_a));
|
|
|
|
test_assert(e.has<Position>(tgt_b));
|
|
test_assert(!e.owns<Position>(tgt_b));
|
|
}
|
|
|
|
void Entity_override_pair_w_ids(void) {
|
|
flecs::world world;
|
|
|
|
auto rel = world.entity();
|
|
auto tgt_a = world.entity();
|
|
auto tgt_b = world.entity();
|
|
|
|
auto base = world.entity()
|
|
.override(rel, tgt_a)
|
|
.add(rel, tgt_b);
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert(e.has(rel, tgt_a));
|
|
test_assert(e.owns(rel, tgt_a));
|
|
|
|
test_assert(e.has(rel, tgt_b));
|
|
test_assert(!e.owns(rel, tgt_b));
|
|
}
|
|
|
|
void Entity_override_pair(void) {
|
|
flecs::world world;
|
|
|
|
struct TagA { };
|
|
struct TagB { };
|
|
|
|
auto base = world.entity()
|
|
.override<Position, TagA>()
|
|
.add<Position, TagB>();
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert((e.has<Position, TagA>()));
|
|
test_assert((e.owns<Position, TagA>()));
|
|
|
|
test_assert((e.has<Position, TagB>()));
|
|
test_assert((!e.owns<Position, TagB>()));
|
|
}
|
|
|
|
void Entity_set_override(void) {
|
|
flecs::world world;
|
|
|
|
auto base = world.entity()
|
|
.set_override<Position>({10, 20});
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.owns<Position>());
|
|
|
|
const Position* p = e.get<Position>();
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Position* p_base = base.get<Position>();
|
|
test_assert(p != p_base);
|
|
test_int(p_base->x, 10);
|
|
test_int(p_base->y, 20);
|
|
}
|
|
|
|
void Entity_set_override_lvalue(void) {
|
|
flecs::world world;
|
|
|
|
Position plvalue = {10, 20};
|
|
|
|
auto base = world.entity()
|
|
.set_override<Position>(plvalue);
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.owns<Position>());
|
|
|
|
const Position* p = e.get<Position>();
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Position* p_base = base.get<Position>();
|
|
test_assert(p != p_base);
|
|
test_int(p_base->x, 10);
|
|
test_int(p_base->y, 20);
|
|
}
|
|
|
|
void Entity_set_override_pair(void) {
|
|
flecs::world world;
|
|
|
|
struct Tgt { };
|
|
|
|
auto base = world.entity()
|
|
.set_override<Position, Tgt>({10, 20});
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert((e.has<Position, Tgt>()));
|
|
test_assert((e.owns<Position, Tgt>()));
|
|
|
|
const Position* p = e.get<Position, Tgt>();
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Position* p_base = base.get<Position, Tgt>();
|
|
test_assert(p != p_base);
|
|
test_int(p_base->x, 10);
|
|
test_int(p_base->y, 20);
|
|
}
|
|
|
|
void Entity_set_override_pair_w_tgt_id(void) {
|
|
flecs::world world;
|
|
|
|
auto tgt = world.entity();
|
|
|
|
auto base = world.entity()
|
|
.set_override<Position>(tgt, {10, 20});
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert((e.has<Position>(tgt)));
|
|
test_assert((e.owns<Position>(tgt)));
|
|
|
|
const Position* p = e.get<Position>(tgt);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Position* p_base = base.get<Position>(tgt);
|
|
test_assert(p != p_base);
|
|
test_int(p_base->x, 10);
|
|
test_int(p_base->y, 20);
|
|
}
|
|
|
|
void Entity_set_override_pair_w_rel_tag(void) {
|
|
flecs::world world;
|
|
|
|
struct Tgt { };
|
|
|
|
auto base = world.entity()
|
|
.set_override<Tgt, Position>({10, 20});
|
|
|
|
auto e = world.entity()
|
|
.add(flecs::IsA, base);
|
|
|
|
test_assert((e.has<Tgt, Position>()));
|
|
test_assert((e.owns<Tgt, Position>()));
|
|
|
|
const Position* p = e.get<Tgt, Position>();
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Position* p_base = base.get<Tgt, Position>();
|
|
test_assert(p != p_base);
|
|
test_int(p_base->x, 10);
|
|
test_int(p_base->y, 20);
|
|
}
|
|
|
|
void Entity_emplace_override(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity().emplace_override<NoDefaultCtor>(10);
|
|
test_assert(e.has<NoDefaultCtor>());
|
|
|
|
const NoDefaultCtor *ptr = e.get<NoDefaultCtor>();
|
|
test_assert(ptr != nullptr);
|
|
test_int(ptr->x_, 10);
|
|
}
|
|
|
|
void Entity_emplace_override_pair(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity().emplace_override<NoDefaultCtor, Tag>(10);
|
|
test_assert((e.has<NoDefaultCtor, Tag>()));
|
|
|
|
const NoDefaultCtor *ptr = e.get<NoDefaultCtor, Tag>();
|
|
test_assert(ptr != nullptr);
|
|
test_int(ptr->x_, 10);
|
|
}
|
|
|
|
void Entity_implicit_name_to_char(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = flecs::entity(world, "Foo");
|
|
test_assert(entity);
|
|
test_str(entity.name().c_str(), "Foo");
|
|
|
|
test_str(entity.name(), "Foo");
|
|
}
|
|
|
|
void Entity_path(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity("parent");
|
|
flecs::entity child = world.scope(parent).entity("child");
|
|
test_str(child.path().c_str(), "::parent::child");
|
|
}
|
|
|
|
void Entity_path_from(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity("parent");
|
|
flecs::entity child = world.scope(parent).entity("child");
|
|
flecs::entity grandchild = world.scope(child).entity("grandchild");
|
|
test_str(grandchild.path().c_str(), "::parent::child::grandchild");
|
|
test_str(grandchild.path_from(parent).c_str(), "child::grandchild");
|
|
}
|
|
|
|
void Entity_path_from_type(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity<Parent>();
|
|
flecs::entity child = world.scope(parent).entity("child");
|
|
flecs::entity grandchild = world.scope(child).entity("grandchild");
|
|
test_str(grandchild.path().c_str(), "::Parent::child::grandchild");
|
|
test_str(grandchild.path_from<Parent>().c_str(), "child::grandchild");
|
|
}
|
|
|
|
void Entity_path_custom_sep(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity("parent");
|
|
flecs::entity child = world.scope(parent).entity("child");
|
|
test_str(child.path("_", "").c_str(), "parent_child");
|
|
}
|
|
|
|
void Entity_path_from_custom_sep(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity("parent");
|
|
flecs::entity child = world.scope(parent).entity("child");
|
|
flecs::entity grandchild = world.scope(child).entity("grandchild");
|
|
test_str(grandchild.path().c_str(), "::parent::child::grandchild");
|
|
test_str(grandchild.path_from(parent, "_").c_str(), "child_grandchild");
|
|
}
|
|
|
|
void Entity_path_from_type_custom_sep(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity<Parent>();
|
|
flecs::entity child = world.scope(parent).entity("child");
|
|
flecs::entity grandchild = world.scope(child).entity("grandchild");
|
|
test_str(grandchild.path().c_str(), "::Parent::child::grandchild");
|
|
test_str(grandchild.path_from<Parent>("_").c_str(), "child_grandchild");
|
|
}
|
|
|
|
void Entity_implicit_path_to_char(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = flecs::entity(world, "Foo::Bar");
|
|
test_assert(entity);
|
|
test_str(entity.name().c_str(), "Bar");
|
|
|
|
test_str(entity.path(), "::Foo::Bar");
|
|
}
|
|
|
|
void Entity_implicit_type_str_to_char(void) {
|
|
flecs::world world;
|
|
|
|
auto entity = flecs::entity(world, "Foo");
|
|
test_assert(entity);
|
|
|
|
test_str(entity.type().str(), "(Identifier,Name)");
|
|
}
|
|
|
|
void Entity_entity_to_entity_view(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity e = world.entity()
|
|
.set<Position>({10, 20});
|
|
test_assert(e != 0);
|
|
|
|
flecs::entity_view ev = e;
|
|
test_assert(ev != 0);
|
|
test_assert(e == ev);
|
|
|
|
const Position *p = ev.get<Position>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_entity_view_to_entity_world(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity e = world.entity()
|
|
.set<Position>({10, 20});
|
|
test_assert(e != 0);
|
|
|
|
flecs::entity_view ev = e;
|
|
test_assert(ev != 0);
|
|
test_assert(e == ev);
|
|
|
|
flecs::entity ew = ev.mut(world);
|
|
ew.set<Position>({10, 20});
|
|
|
|
test_assert(ev.has<Position>());
|
|
const Position *p = ev.get<Position>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_entity_view_to_entity_stage(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity_view ev = world.entity();
|
|
|
|
auto stage = world.get_stage(0);
|
|
|
|
world.readonly_begin();
|
|
|
|
flecs::entity ew = ev.mut(stage);
|
|
|
|
ew.set<Position>({10, 20});
|
|
test_assert(!ew.has<Position>());
|
|
|
|
world.readonly_end();
|
|
|
|
test_assert(ew.has<Position>());
|
|
test_assert(ev.has<Position>());
|
|
|
|
const Position *p = ev.get<Position>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_create_entity_view_from_stage(void) {
|
|
flecs::world world;
|
|
|
|
auto stage = world.get_stage(0);
|
|
|
|
world.readonly_begin();
|
|
|
|
flecs::entity_view ev = stage.entity();
|
|
test_assert(ev != 0);
|
|
|
|
world.readonly_end();
|
|
|
|
// Ensure we can use created ev out of stage
|
|
auto ew = ev.mut(world);
|
|
ew.set<Position>({10, 20});
|
|
test_assert(ev.has<Position>());
|
|
|
|
const Position *p = ev.get<Position>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_set_template(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.set<Template<int>>({10, 20});
|
|
|
|
const Template<int> *ptr = e.get<Template<int>>();
|
|
test_int(ptr->x, 10);
|
|
test_int(ptr->y, 20);
|
|
}
|
|
|
|
void Entity_get_1_component_w_callback(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e_1 = ecs.entity()
|
|
.set<Position>({10, 20})
|
|
.set<Velocity>({1, 2});
|
|
|
|
auto e_2 = ecs.entity()
|
|
.set<Position>({11, 22});
|
|
|
|
auto e_3 = ecs.entity()
|
|
.set<Velocity>({1, 2});
|
|
|
|
test_bool(e_1.get([](const Position& p) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
}), true);
|
|
|
|
test_bool(e_2.get([](const Position& p) {
|
|
test_int(p.x, 11);
|
|
test_int(p.y, 22);
|
|
}), true);
|
|
|
|
test_bool(e_3.get([](const Position& p) {}), false);
|
|
}
|
|
|
|
void Entity_get_2_components_w_callback(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e_1 = ecs.entity()
|
|
.set<Position>({10, 20})
|
|
.set<Velocity>({1, 2});
|
|
|
|
auto e_2 = ecs.entity()
|
|
.set<Position>({11, 22});
|
|
|
|
auto e_3 = ecs.entity()
|
|
.set<Velocity>({1, 2});
|
|
|
|
test_bool(e_1.get([](const Position& p, const Velocity& v) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
}), true);
|
|
|
|
test_bool(e_2.get([](const Position& p, const Velocity& v) {}), false);
|
|
|
|
test_bool(e_3.get([](const Position& p, const Velocity& v) {}), false);
|
|
}
|
|
|
|
void Entity_get_mut_1_component_w_callback(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e_1 = ecs.entity()
|
|
.set<Position>({10, 20})
|
|
.set<Velocity>({1, 2});
|
|
|
|
auto e_2 = ecs.entity()
|
|
.set<Position>({11, 22});
|
|
|
|
auto e_3 = ecs.entity()
|
|
.set<Velocity>({1, 2});
|
|
|
|
test_bool(e_1.get([](Position& p) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
p.x ++;
|
|
p.y += 2;
|
|
}), true);
|
|
|
|
test_bool(e_2.get([](Position& p) {
|
|
test_int(p.x, 11);
|
|
test_int(p.y, 22);
|
|
p.x ++;
|
|
p.y += 2;
|
|
}), true);
|
|
|
|
const Position*
|
|
p = e_1.get<Position>();
|
|
test_int(p->x, 11);
|
|
test_int(p->y, 22);
|
|
|
|
p = e_2.get<Position>();
|
|
test_int(p->x, 12);
|
|
test_int(p->y, 24);
|
|
|
|
test_bool(e_3.get([](const Position& p) {}), false);
|
|
}
|
|
|
|
void Entity_get_mut_2_components_w_callback(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e_1 = ecs.entity()
|
|
.set<Position>({10, 20})
|
|
.set<Velocity>({1, 2});
|
|
|
|
auto e_2 = ecs.entity()
|
|
.set<Position>({11, 22});
|
|
|
|
auto e_3 = ecs.entity()
|
|
.set<Velocity>({1, 2});
|
|
|
|
test_bool(e_1.get([](Position& p, Velocity& v) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
|
|
p.x ++;
|
|
p.y += 2;
|
|
v.x += 3;
|
|
v.y += 4;
|
|
}), true);
|
|
|
|
test_bool(e_2.get([](const Position& p, const Velocity& v) {}), false);
|
|
|
|
test_bool(e_3.get([](const Position& p, const Velocity& v) {}), false);
|
|
|
|
const Position* p = e_1.get<Position>();
|
|
test_int(p->x, 11);
|
|
test_int(p->y, 22);
|
|
|
|
const Velocity* v = e_1.get<Velocity>();
|
|
test_int(v->x, 4);
|
|
test_int(v->y, 6);
|
|
}
|
|
|
|
void Entity_get_component_w_callback_nested(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.set<Position>({10, 20})
|
|
.set<Velocity>({1, 2});
|
|
|
|
test_bool(e.get([&](const Position& p) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_bool(e.get([](const Velocity& v) {
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
}), true);
|
|
}), true);
|
|
}
|
|
|
|
void Entity_get_mut_component_w_callback_nested(void) {
|
|
install_test_abort();
|
|
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.set<Position>({10, 20})
|
|
.set<Velocity>({1, 2});
|
|
|
|
test_bool(e.get([&](Position& p) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_expect_abort();
|
|
test_bool(e.get([](Velocity& v) {
|
|
}), false);
|
|
}), true);
|
|
}
|
|
|
|
void Entity_set_1_component_w_callback(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.set([](Position& p){
|
|
p.x = 10;
|
|
p.y = 20;
|
|
});
|
|
|
|
test_assert(e.has<Position>());
|
|
|
|
const Position *p = e.get<Position>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_set_2_components_w_callback(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.set([](Position& p, Velocity& v){
|
|
p = {10, 20};
|
|
v = {1, 2};
|
|
});
|
|
|
|
test_assert(e.has<Position>());
|
|
|
|
const Position *p = e.get<Position>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Velocity *v = e.get<Velocity>();
|
|
test_assert(v != NULL);
|
|
test_int(v->x, 1);
|
|
test_int(v->y, 2);
|
|
}
|
|
|
|
void Entity_set_3_components_w_callback(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.set([](Position& p, Velocity& v, Mass& m){
|
|
p = {10, 20};
|
|
v = {1, 2};
|
|
m = {50};
|
|
});
|
|
|
|
test_assert(e.has<Position>());
|
|
|
|
const Position *p = e.get<Position>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
|
|
const Velocity *v = e.get<Velocity>();
|
|
test_assert(v != NULL);
|
|
test_int(v->x, 1);
|
|
test_int(v->y, 2);
|
|
|
|
const Mass *m = e.get<Mass>();
|
|
test_assert(m != NULL);
|
|
test_int(m->value, 50);
|
|
}
|
|
|
|
void Entity_defer_set_1_component(void) {
|
|
flecs::world ecs;
|
|
|
|
ecs.defer_begin();
|
|
|
|
auto e = ecs.entity()
|
|
.set([](Position& p){
|
|
p.x = 10;
|
|
p.y = 20;
|
|
});
|
|
|
|
test_assert(!e.has<Position>());
|
|
|
|
ecs.defer_end();
|
|
|
|
test_assert(e.has<Position>());
|
|
|
|
e.get([](const Position& p) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
});
|
|
}
|
|
|
|
void Entity_defer_set_2_components(void) {
|
|
flecs::world ecs;
|
|
|
|
ecs.defer_begin();
|
|
|
|
auto e = ecs.entity()
|
|
.set([](Position& p, Velocity& v){
|
|
p = {10, 20};
|
|
v = {1, 2};
|
|
});
|
|
|
|
test_assert(!e.has<Position>());
|
|
test_assert(!e.has<Velocity>());
|
|
|
|
ecs.defer_end();
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
|
|
e.get([](const Position& p, const Velocity& v) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
});
|
|
}
|
|
|
|
void Entity_defer_set_3_components(void) {
|
|
flecs::world ecs;
|
|
|
|
ecs.defer_begin();
|
|
|
|
auto e = ecs.entity()
|
|
.set([](Position& p, Velocity& v, Mass& m){
|
|
p = {10, 20};
|
|
v = {1, 2};
|
|
m = {50};
|
|
});
|
|
|
|
test_assert(!e.has<Position>());
|
|
test_assert(!e.has<Velocity>());
|
|
test_assert(!e.has<Mass>());
|
|
|
|
ecs.defer_end();
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
test_assert(e.has<Mass>());
|
|
|
|
e.get([](const Position& p, const Velocity& v, const Mass& m) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
|
|
test_int(m.value, 50);
|
|
});
|
|
}
|
|
|
|
void Entity_set_2_w_on_set(void) {
|
|
flecs::world ecs;
|
|
|
|
int32_t position_set = 0;
|
|
int32_t velocity_set = 0;
|
|
|
|
ecs.observer<Position>()
|
|
.event(flecs::OnSet)
|
|
.each([&](flecs::entity e, Position& p) {
|
|
position_set ++;
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
});
|
|
|
|
ecs.observer<Velocity>()
|
|
.event(flecs::OnSet)
|
|
.each([&](flecs::entity e, Velocity& v) {
|
|
velocity_set ++;
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
});
|
|
|
|
auto e = ecs.entity()
|
|
.set([](Position& p, Velocity& v){
|
|
p = {10, 20};
|
|
v = {1, 2};
|
|
});
|
|
|
|
test_int(position_set, 1);
|
|
test_int(velocity_set, 1);
|
|
|
|
test_bool(e.get([](const Position& p, const Velocity& v) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
}), true);
|
|
}
|
|
|
|
void Entity_defer_set_2_w_on_set(void) {
|
|
flecs::world ecs;
|
|
|
|
int32_t position_set = 0;
|
|
int32_t velocity_set = 0;
|
|
|
|
ecs.observer<Position>()
|
|
.event(flecs::OnSet)
|
|
.each([&](flecs::entity e, Position& p) {
|
|
position_set ++;
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
});
|
|
|
|
ecs.observer<Velocity>()
|
|
.event(flecs::OnSet)
|
|
.each([&](flecs::entity e, Velocity& v) {
|
|
velocity_set ++;
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
});
|
|
|
|
ecs.defer_begin();
|
|
|
|
auto e = ecs.entity()
|
|
.set([](Position& p, Velocity& v){
|
|
p = {10, 20};
|
|
v = {1, 2};
|
|
});
|
|
|
|
test_int(position_set, 0);
|
|
test_int(velocity_set, 0);
|
|
|
|
ecs.defer_end();
|
|
|
|
test_int(position_set, 1);
|
|
test_int(velocity_set, 1);
|
|
|
|
test_bool(e.get([](const Position& p, const Velocity& v) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
}), true);
|
|
}
|
|
|
|
void Entity_set_2_after_fluent(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.set<Mass>({50})
|
|
.set([](Position& p, Velocity& v){
|
|
p = {10, 20};
|
|
v = {1, 2};
|
|
});
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
test_assert(e.has<Mass>());
|
|
|
|
test_bool(e.get([](const Position& p, const Velocity& v, const Mass& m) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
|
|
test_int(m.value, 50);
|
|
}), true);
|
|
}
|
|
|
|
void Entity_set_2_before_fluent(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.set([](Position& p, Velocity& v){
|
|
p = {10, 20};
|
|
v = {1, 2};
|
|
})
|
|
.set<Mass>({50});
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
test_assert(e.has<Mass>());
|
|
|
|
test_bool(e.get([](const Position& p, const Velocity& v, const Mass& m) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
|
|
test_int(m.value, 50);
|
|
}), true);
|
|
}
|
|
|
|
void Entity_set_2_after_set_1(void) {
|
|
flecs::world ecs;
|
|
|
|
int called = 0;
|
|
|
|
auto e = ecs.entity().set<Position>({5, 10});
|
|
test_assert(e.has<Position>());
|
|
|
|
test_bool(e.get([](const Position& p) {
|
|
test_int(p.x, 5);
|
|
test_int(p.y, 10);
|
|
}), true);
|
|
|
|
// Set both Position and Velocity
|
|
e.set([](Position& p, Velocity& v) {
|
|
p = {10, 20};
|
|
v = {1, 2};
|
|
});
|
|
|
|
test_bool(e.get([&](const Position& p, const Velocity& v) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
|
|
called ++;
|
|
}), true);
|
|
|
|
test_int(called, 1);
|
|
}
|
|
|
|
void Entity_set_2_after_set_2(void) {
|
|
flecs::world ecs;
|
|
|
|
int called = 0;
|
|
|
|
auto e = ecs.entity()
|
|
.set<Position>({5, 10})
|
|
.set<Velocity>({1, 2});
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
|
|
test_bool(e.get([&](const Position& p, const Velocity& v) {
|
|
test_int(p.x, 5);
|
|
test_int(p.y, 10);
|
|
|
|
test_int(v.x, 1);
|
|
test_int(v.y, 2);
|
|
|
|
called ++;
|
|
}), true);
|
|
|
|
test_int(called, 1);
|
|
|
|
// Set both Position and Velocity (doesn't add any components)
|
|
e.set([](Position& p, Velocity& v) {
|
|
p = {10, 20};
|
|
v = {3, 4};
|
|
});
|
|
|
|
test_bool(e.get([&](const Position& p, const Velocity& v) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
|
|
test_int(v.x, 3);
|
|
test_int(v.y, 4);
|
|
|
|
called ++;
|
|
}), true);
|
|
|
|
test_int(called, 2);
|
|
}
|
|
|
|
void Entity_with_self(void) {
|
|
flecs::world ecs;
|
|
|
|
auto Tag = ecs.entity().with([&]{
|
|
auto e1 = ecs.entity(); e1.set<Self>({e1});
|
|
auto e2 = ecs.entity(); e2.set<Self>({e2});
|
|
auto e3 = ecs.entity(); e3.set<Self>({e3});
|
|
});
|
|
|
|
// Ensures that while Self is (implicitly) registered within the with, it
|
|
// does not get the tag.
|
|
auto self = ecs.component<Self>();
|
|
test_assert(!self.has(Tag));
|
|
|
|
int count = 0;
|
|
auto q = ecs.query_builder<>().term(Tag).build();
|
|
|
|
q.each([&](flecs::entity e) {
|
|
test_assert(e.has(Tag));
|
|
|
|
test_bool(e.get([&](const Self& s){
|
|
test_assert(s.value == e);
|
|
}), true);
|
|
|
|
count ++;
|
|
});
|
|
|
|
test_int(count, 3);
|
|
}
|
|
|
|
void Entity_with_relation_type_self(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Likes { };
|
|
|
|
auto Bob = ecs.entity().with<Likes>([&]{
|
|
auto e1 = ecs.entity(); e1.set<Self>({e1});
|
|
auto e2 = ecs.entity(); e2.set<Self>({e2});
|
|
auto e3 = ecs.entity(); e3.set<Self>({e3});
|
|
});
|
|
|
|
// Ensures that while Self is (implicitly) registered within the with, it
|
|
// does not get the tag.
|
|
auto self = ecs.component<Self>();
|
|
test_assert(!self.has<Likes>(Bob));
|
|
|
|
int count = 0;
|
|
auto q = ecs.query_builder<>().term<Likes>(Bob).build();
|
|
|
|
q.each([&](flecs::entity e) {
|
|
test_assert(e.has<Likes>(Bob));
|
|
|
|
test_bool(e.get([&](const Self& s){
|
|
test_assert(s.value == e);
|
|
}), true);
|
|
|
|
count ++;
|
|
});
|
|
|
|
test_int(count, 3);
|
|
}
|
|
|
|
void Entity_with_relation_self(void) {
|
|
flecs::world ecs;
|
|
|
|
auto Likes = ecs.entity();
|
|
|
|
auto Bob = ecs.entity().with(Likes, [&]{
|
|
auto e1 = ecs.entity(); e1.set<Self>({e1});
|
|
auto e2 = ecs.entity(); e2.set<Self>({e2});
|
|
auto e3 = ecs.entity(); e3.set<Self>({e3});
|
|
});
|
|
|
|
// Ensures that while Self is (implicitly) registered within the with, it
|
|
// does not get the tag.
|
|
auto self = ecs.component<Self>();
|
|
test_assert(!self.has(Likes, Bob));
|
|
|
|
int count = 0;
|
|
auto q = ecs.query_builder<>().term(Likes, Bob).build();
|
|
|
|
q.each([&](flecs::entity e) {
|
|
test_assert(e.has(Likes, Bob));
|
|
|
|
test_bool(e.get([&](const Self& s){
|
|
test_assert(s.value == e);
|
|
}), true);
|
|
|
|
count ++;
|
|
});
|
|
|
|
test_int(count, 3);
|
|
}
|
|
|
|
void Entity_with_self_w_name(void) {
|
|
flecs::world ecs;
|
|
|
|
auto Tier1 = ecs.entity("Tier1").with([&]{
|
|
auto Tier2 = ecs.entity("Tier2");
|
|
Tier2.set<Self>({Tier2});
|
|
});
|
|
|
|
auto Tier2 = ecs.lookup("Tier2");
|
|
test_assert(Tier2 != 0);
|
|
|
|
test_assert(Tier2.has(Tier1));
|
|
}
|
|
|
|
void Entity_with_self_nested(void) {
|
|
flecs::world ecs;
|
|
|
|
auto Tier1 = ecs.entity("Tier1").with([&]{
|
|
ecs.entity("Tier2").with([&]{
|
|
ecs.entity("Tier3");
|
|
});
|
|
});
|
|
|
|
auto Tier2 = ecs.lookup("Tier2");
|
|
test_assert(Tier2 != 0);
|
|
|
|
auto Tier3 = ecs.lookup("Tier3");
|
|
test_assert(Tier3 != 0);
|
|
|
|
test_assert(Tier2.has(Tier1));
|
|
test_assert(Tier3.has(Tier2));
|
|
}
|
|
|
|
void Entity_with_scope(void) {
|
|
flecs::world ecs;
|
|
|
|
auto parent = ecs.entity("P").scope([&]{
|
|
auto e1 = ecs.entity("C1"); e1.set<Self>({e1});
|
|
auto e2 = ecs.entity("C2"); e2.set<Self>({e2});
|
|
auto e3 = ecs.entity("C3"); e3.set<Self>({e3});
|
|
|
|
// Ensure relative lookups work
|
|
test_assert(ecs.lookup("C1") == e1);
|
|
test_assert(ecs.lookup("C2") == e2);
|
|
test_assert(ecs.lookup("C3") == e3);
|
|
|
|
test_assert(ecs.lookup("::P::C1") == e1);
|
|
test_assert(ecs.lookup("::P::C2") == e2);
|
|
test_assert(ecs.lookup("::P::C3") == e3);
|
|
});
|
|
|
|
// Ensure entities are created in correct scope
|
|
test_assert(ecs.lookup("C1") == 0);
|
|
test_assert(ecs.lookup("C2") == 0);
|
|
test_assert(ecs.lookup("C3") == 0);
|
|
|
|
test_assert(parent.lookup("C1") != 0);
|
|
test_assert(parent.lookup("C2") != 0);
|
|
test_assert(parent.lookup("C3") != 0);
|
|
|
|
test_assert(ecs.lookup("P::C1") == parent.lookup("C1"));
|
|
test_assert(ecs.lookup("P::C2") == parent.lookup("C2"));
|
|
test_assert(ecs.lookup("P::C3") == parent.lookup("C3"));
|
|
|
|
// Ensures that while Self is (implicitly) registered within the with, it
|
|
// does not become a child of the parent.
|
|
auto self = ecs.component<Self>();
|
|
test_assert(!self.has(flecs::ChildOf, parent));
|
|
|
|
int count = 0;
|
|
auto q = ecs.query_builder<>().term(flecs::ChildOf, parent).build();
|
|
|
|
q.each([&](flecs::entity e) {
|
|
test_assert(e.has(flecs::ChildOf, parent));
|
|
|
|
test_bool(e.get([&](const Self& s){
|
|
test_assert(s.value == e);
|
|
}), true);
|
|
|
|
count ++;
|
|
});
|
|
|
|
test_int(count, 3);
|
|
}
|
|
|
|
void Entity_with_scope_nested(void) {
|
|
flecs::world ecs;
|
|
|
|
auto parent = ecs.entity("P").scope([&]{
|
|
auto child = ecs.entity("C").scope([&]{
|
|
auto gchild = ecs.entity("GC");
|
|
test_assert(gchild == ecs.lookup("GC"));
|
|
test_assert(gchild == ecs.lookup("::P::C::GC"));
|
|
});
|
|
|
|
// Ensure relative lookups work
|
|
test_assert(ecs.lookup("C") == child);
|
|
test_assert(ecs.lookup("::P::C") == child);
|
|
test_assert(ecs.lookup("::P::C::GC") != 0);
|
|
});
|
|
|
|
test_assert(0 == ecs.lookup("C"));
|
|
test_assert(0 == ecs.lookup("GC"));
|
|
test_assert(0 == ecs.lookup("C::GC"));
|
|
|
|
auto child = ecs.lookup("P::C");
|
|
test_assert(0 != child);
|
|
test_assert(child.has(flecs::ChildOf, parent));
|
|
|
|
auto gchild = ecs.lookup("P::C::GC");
|
|
test_assert(0 != gchild);
|
|
test_assert(gchild.has(flecs::ChildOf, child));
|
|
}
|
|
|
|
void Entity_with_scope_nested_same_name_as_parent(void) {
|
|
flecs::world ecs;
|
|
|
|
auto parent = ecs.entity("P").scope([&]{
|
|
auto child = ecs.entity("C").scope([&]{
|
|
auto gchild = ecs.entity("C");
|
|
test_assert(gchild == ecs.lookup("C"));
|
|
test_assert(gchild == ecs.lookup("::P::C::C"));
|
|
});
|
|
|
|
// Ensure relative lookups work
|
|
test_assert(ecs.lookup("C") == child);
|
|
test_assert(ecs.lookup("::P::C") == child);
|
|
test_assert(ecs.lookup("::P::C::C") != 0);
|
|
});
|
|
|
|
test_assert(0 == ecs.lookup("C"));
|
|
test_assert(0 == ecs.lookup("C"));
|
|
test_assert(0 == ecs.lookup("C::C"));
|
|
|
|
auto child = ecs.lookup("P::C");
|
|
test_assert(0 != child);
|
|
test_assert(child.has(flecs::ChildOf, parent));
|
|
|
|
auto gchild = ecs.lookup("P::C::C");
|
|
test_assert(0 != gchild);
|
|
test_assert(gchild.has(flecs::ChildOf, child));
|
|
}
|
|
|
|
void Entity_no_recursive_lookup(void) {
|
|
flecs::world ecs;
|
|
|
|
auto p = ecs.entity("P");
|
|
auto c = ecs.entity("C").child_of(p);
|
|
auto gc = ecs.entity("GC").child_of(c);
|
|
|
|
test_assert(c.lookup("GC") == gc);
|
|
test_assert(c.lookup("C") == 0);
|
|
test_assert(c.lookup("P") == 0);
|
|
}
|
|
|
|
void Entity_defer_new_w_name(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e;
|
|
|
|
ecs.defer([&]{
|
|
e = ecs.entity("Foo");
|
|
test_assert(e != 0);
|
|
});
|
|
|
|
test_assert(e.has<flecs::Identifier>(flecs::Name));
|
|
test_str(e.name(), "Foo");
|
|
}
|
|
|
|
void Entity_defer_new_w_nested_name(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e;
|
|
|
|
ecs.defer([&]{
|
|
e = ecs.entity("Foo::Bar");
|
|
test_assert(e != 0);
|
|
});
|
|
|
|
test_assert(e.has<flecs::Identifier>(flecs::Name));
|
|
test_str(e.name(), "Bar");
|
|
test_str(e.path(), "::Foo::Bar");
|
|
}
|
|
|
|
|
|
void Entity_defer_new_w_scope_name(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e, parent = ecs.entity("Parent");
|
|
|
|
ecs.defer([&]{
|
|
parent.scope([&]{
|
|
e = ecs.entity("Foo");
|
|
test_assert(e != 0);
|
|
});
|
|
});
|
|
|
|
test_assert(e.has<flecs::Identifier>(flecs::Name));
|
|
test_str(e.name(), "Foo");
|
|
test_str(e.path(), "::Parent::Foo");
|
|
}
|
|
|
|
void Entity_defer_new_w_scope_nested_name(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e, parent = ecs.entity("Parent");
|
|
|
|
ecs.defer([&]{
|
|
parent.scope([&]{
|
|
e = ecs.entity("Foo::Bar");
|
|
test_assert(e != 0);
|
|
});
|
|
});
|
|
|
|
test_assert(e.has<flecs::Identifier>(flecs::Name));
|
|
test_str(e.name(), "Bar");
|
|
test_str(e.path(), "::Parent::Foo::Bar");
|
|
}
|
|
|
|
void Entity_defer_new_w_deferred_scope_nested_name(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e, parent;
|
|
|
|
ecs.defer([&]{
|
|
parent = ecs.entity("Parent").scope([&]{
|
|
e = ecs.entity("Foo::Bar");
|
|
test_assert(e != 0);
|
|
});
|
|
});
|
|
|
|
test_assert(parent.has<flecs::Identifier>(flecs::Name));
|
|
test_str(parent.name(), "Parent");
|
|
test_str(parent.path(), "::Parent");
|
|
|
|
test_assert(e.has<flecs::Identifier>(flecs::Name));
|
|
test_str(e.name(), "Bar");
|
|
test_str(e.path(), "::Parent::Foo::Bar");
|
|
}
|
|
|
|
void Entity_defer_new_w_scope(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e, parent = ecs.entity();
|
|
|
|
ecs.defer([&]{
|
|
parent.scope([&]{
|
|
e = ecs.entity();
|
|
test_assert(e != 0);
|
|
});
|
|
});
|
|
|
|
test_assert(e.has(flecs::ChildOf, parent));
|
|
}
|
|
|
|
void Entity_defer_new_w_with(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e, Tag = ecs.entity();
|
|
|
|
ecs.defer([&]{
|
|
Tag.with([&]{
|
|
e = ecs.entity();
|
|
test_assert(e != 0);
|
|
test_assert(!e.has(Tag));
|
|
});
|
|
});
|
|
|
|
test_assert(e.has(Tag));
|
|
}
|
|
|
|
void Entity_defer_new_w_name_scope_with(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e, Tag = ecs.entity(), parent = ecs.entity("Parent");
|
|
|
|
ecs.defer([&]{
|
|
Tag.with([&]{
|
|
parent.scope([&]{
|
|
e = ecs.entity("Foo");
|
|
test_assert(e != 0);
|
|
test_assert(!e.has(Tag));
|
|
});
|
|
test_assert(!e.has(Tag));
|
|
});
|
|
test_assert(!e.has(Tag));
|
|
});
|
|
|
|
test_assert(e.has(Tag));
|
|
test_assert(e.has<flecs::Identifier>(flecs::Name));
|
|
test_str(e.name(), "Foo");
|
|
test_str(e.path(), "::Parent::Foo");
|
|
}
|
|
|
|
void Entity_defer_new_w_nested_name_scope_with() {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e, Tag = ecs.entity(), parent = ecs.entity("Parent");
|
|
|
|
ecs.defer([&]{
|
|
Tag.with([&]{
|
|
parent.scope([&]{
|
|
e = ecs.entity("Foo::Bar");
|
|
test_assert(e != 0);
|
|
test_assert(!e.has(Tag));
|
|
});
|
|
test_assert(!e.has(Tag));
|
|
});
|
|
test_assert(!e.has(Tag));
|
|
});
|
|
|
|
test_assert(e.has(Tag));
|
|
test_assert(e.has<flecs::Identifier>(flecs::Name));
|
|
test_str(e.name(), "Bar");
|
|
test_str(e.path(), "::Parent::Foo::Bar");
|
|
}
|
|
|
|
void Entity_defer_w_with_implicit_component(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Tag { };
|
|
|
|
flecs::entity e;
|
|
|
|
ecs.defer([&]{
|
|
ecs.with<Tag>([&]{
|
|
e = ecs.entity();
|
|
test_assert(!e.has<Tag>());
|
|
});
|
|
test_assert(!e.has<Tag>());
|
|
});
|
|
|
|
test_assert(e.has<Tag>());
|
|
}
|
|
|
|
void Entity_defer_suspend_resume(void) {
|
|
flecs::world ecs;
|
|
|
|
struct TagA { };
|
|
struct TagB { };
|
|
|
|
flecs::entity e = ecs.entity();
|
|
|
|
ecs.defer([&]{
|
|
e.add<TagA>();
|
|
test_assert(!e.has<TagA>());
|
|
|
|
ecs.defer_suspend();
|
|
e.add<TagB>();
|
|
test_assert(!e.has<TagA>());
|
|
test_assert(e.has<TagB>());
|
|
ecs.defer_resume();
|
|
|
|
test_assert(!e.has<TagA>());
|
|
test_assert(e.has<TagB>());
|
|
});
|
|
|
|
test_assert(e.has<TagA>());
|
|
test_assert(e.has<TagB>());
|
|
}
|
|
|
|
void Entity_with_after_builder_method(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Likes { };
|
|
|
|
auto A = ecs.entity()
|
|
.set<Position>({10, 20})
|
|
.with([&]{
|
|
ecs.entity("X");
|
|
});
|
|
|
|
auto B = ecs.entity().set<Position>({30, 40})
|
|
.with<Likes>([&]{
|
|
ecs.entity("Y");
|
|
});
|
|
|
|
auto C = ecs.entity().set<Position>({50, 60})
|
|
.with(flecs::IsA, [&]{
|
|
ecs.entity("Z");
|
|
});
|
|
|
|
test_assert(A.get([](const Position& p) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
}));
|
|
|
|
test_assert(B.get([](const Position& p) {
|
|
test_int(p.x, 30);
|
|
test_int(p.y, 40);
|
|
}));
|
|
|
|
test_assert(C.get([](const Position& p) {
|
|
test_int(p.x, 50);
|
|
test_int(p.y, 60);
|
|
}));
|
|
|
|
auto X = ecs.lookup("X");
|
|
test_assert(X != 0);
|
|
test_assert(X.has(A));
|
|
|
|
auto Y = ecs.lookup("Y");
|
|
test_assert(Y != 0);
|
|
test_assert(Y.has<Likes>(B));
|
|
|
|
auto Z = ecs.lookup("Z");
|
|
test_assert(Z != 0);
|
|
test_assert(Z.has(flecs::IsA, C));
|
|
}
|
|
|
|
void Entity_with_before_builder_method(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Likes { };
|
|
|
|
auto A = ecs.entity()
|
|
.with([&]{
|
|
ecs.entity("X");
|
|
})
|
|
.set<Position>({10, 20});
|
|
|
|
auto B = ecs.entity().with<Likes>([&]{
|
|
ecs.entity("Y");
|
|
})
|
|
.set<Position>({30, 40});
|
|
|
|
auto C = ecs.entity().with(flecs::IsA, [&]{
|
|
ecs.entity("Z");
|
|
})
|
|
.set<Position>({50, 60});
|
|
|
|
test_assert(A.get([](const Position& p) {
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
}));
|
|
|
|
test_assert(B.get([](const Position& p) {
|
|
test_int(p.x, 30);
|
|
test_int(p.y, 40);
|
|
}));
|
|
|
|
test_assert(C.get([](const Position& p) {
|
|
test_int(p.x, 50);
|
|
test_int(p.y, 60);
|
|
}));
|
|
|
|
auto X = ecs.lookup("X");
|
|
test_assert(X != 0);
|
|
test_assert(X.has(A));
|
|
|
|
auto Y = ecs.lookup("Y");
|
|
test_assert(Y != 0);
|
|
test_assert(Y.has<Likes>(B));
|
|
|
|
auto Z = ecs.lookup("Z");
|
|
test_assert(Z != 0);
|
|
test_assert(Z.has(flecs::IsA, C));
|
|
}
|
|
|
|
void Entity_scope_after_builder_method(void) {
|
|
flecs::world ecs;
|
|
|
|
ecs.entity("P")
|
|
.set<Position>({10, 20})
|
|
.scope([&]{
|
|
ecs.entity("C");
|
|
});
|
|
|
|
auto C = ecs.lookup("P::C");
|
|
test_assert(C != 0);
|
|
}
|
|
|
|
void Entity_scope_before_builder_method(void) {
|
|
flecs::world ecs;
|
|
|
|
ecs.entity("P")
|
|
.scope([&]{
|
|
ecs.entity("C");
|
|
})
|
|
.set<Position>({10, 20});
|
|
|
|
auto C = ecs.lookup("P::C");
|
|
test_assert(C != 0);
|
|
}
|
|
|
|
void Entity_emplace(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity()
|
|
.emplace<Position>(10.0f, 20.0f);
|
|
|
|
test_assert(e.has<Position>());
|
|
|
|
const Position *p = e.get<Position>();
|
|
test_assert(p != NULL);
|
|
test_int(p->x, 10);
|
|
test_int(p->y, 20);
|
|
}
|
|
|
|
void Entity_entity_id_str(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id = ecs.entity("Foo");
|
|
|
|
test_str("Foo", id.str());
|
|
}
|
|
|
|
void Entity_pair_id_str(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id = ecs.pair( ecs.entity("Rel"), ecs.entity("Obj") );
|
|
|
|
test_str("(Rel,Obj)", id.str());
|
|
}
|
|
|
|
void Entity_role_id_str(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id = flecs::id(ecs, ECS_OVERRIDE | ecs.entity("Foo"));
|
|
|
|
test_str("OVERRIDE|Foo", id.str());
|
|
}
|
|
|
|
void Entity_id_str_from_entity_view(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity_view id = ecs.entity("Foo");
|
|
|
|
test_str("Foo", id.str());
|
|
}
|
|
|
|
void Entity_id_str_from_entity(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity id = ecs.entity("Foo");
|
|
|
|
test_str("Foo", id.str());
|
|
}
|
|
|
|
void Entity_null_entity(void) {
|
|
flecs::entity e = flecs::entity::null();
|
|
test_assert(e.id() == 0);
|
|
}
|
|
|
|
void Entity_null_entity_w_world(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e = flecs::entity::null(ecs);
|
|
test_assert(e.id() == 0);
|
|
test_assert(e.world().c_ptr() == ecs.c_ptr());
|
|
}
|
|
|
|
void Entity_null_entity_w_0(void) {
|
|
flecs::entity e = flecs::entity(static_cast<flecs::id_t>(0));
|
|
test_assert(e.id() == 0);
|
|
test_assert(e.world().c_ptr() == nullptr);
|
|
}
|
|
|
|
void Entity_null_entity_w_world_w_0(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e = flecs::entity::null(ecs);
|
|
test_assert(e.id() == 0);
|
|
test_assert(e.world().c_ptr() == ecs.c_ptr());
|
|
}
|
|
|
|
void Entity_entity_view_null_entity(void) {
|
|
flecs::entity_view e = flecs::entity::null();
|
|
test_assert(e.id() == 0);
|
|
}
|
|
|
|
void Entity_entity_view_null_entity_w_world(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity_view e = flecs::entity::null(ecs);
|
|
test_assert(e.id() == 0);
|
|
test_assert(e.world().c_ptr() == ecs.c_ptr());
|
|
}
|
|
|
|
void Entity_entity_view_null_entity_w_0(void) {
|
|
flecs::entity_view e = flecs::entity(static_cast<flecs::id_t>(0));
|
|
test_assert(e.id() == 0);
|
|
test_assert(e.world().c_ptr() == nullptr);
|
|
}
|
|
|
|
void Entity_entity_view_null_entity_w_world_w_0(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity_view e = flecs::entity::null(ecs);
|
|
test_assert(e.id() == 0);
|
|
test_assert(e.world().c_ptr() == ecs.c_ptr());
|
|
}
|
|
|
|
void Entity_is_wildcard(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e1 = ecs.entity();
|
|
auto e2 = ecs.entity();
|
|
|
|
auto p0 = e1;
|
|
auto p1 = ecs.pair(e1, e2);
|
|
auto p2 = ecs.pair(e1, flecs::Wildcard);
|
|
auto p3 = ecs.pair(flecs::Wildcard, e2);
|
|
auto p4 = ecs.pair(flecs::Wildcard, flecs::Wildcard);
|
|
|
|
test_bool(e1.is_wildcard(), false);
|
|
test_bool(e2.is_wildcard(), false);
|
|
test_bool(p0.is_wildcard(), false);
|
|
test_bool(p1.is_wildcard(), false);
|
|
test_bool(p2.is_wildcard(), true);
|
|
test_bool(p3.is_wildcard(), true);
|
|
test_bool(p4.is_wildcard(), true);
|
|
}
|
|
|
|
void Entity_has_id_t(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id_t id_1 = ecs.entity();
|
|
test_assert(id_1 != 0);
|
|
|
|
flecs::id_t id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add(id_1);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.has(id_1), true);
|
|
test_bool(e.has(id_2), false);
|
|
}
|
|
|
|
void Entity_has_pair_id_t(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id_t id_1 = ecs.entity();
|
|
test_assert(id_1 != 0);
|
|
|
|
flecs::id_t id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
flecs::id_t id_3 = ecs.entity();
|
|
test_assert(id_3 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add(id_1, id_2);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.has(id_1, id_2), true);
|
|
test_bool(e.has(id_1, id_3), false);
|
|
}
|
|
|
|
void Entity_has_pair_id_t_w_type(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel { };
|
|
|
|
flecs::id_t id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
flecs::id_t id_3 = ecs.entity();
|
|
test_assert(id_3 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add<Rel>(id_2);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.has<Rel>(id_2), true);
|
|
test_bool(e.has<Rel>(id_3), false);
|
|
}
|
|
|
|
void Entity_has_id(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id_1 = ecs.entity();
|
|
test_assert(id_1 != 0);
|
|
|
|
flecs::id id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add(id_1);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.has(id_1), true);
|
|
test_bool(e.has(id_2), false);
|
|
}
|
|
|
|
void Entity_has_pair_id(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id_1 = ecs.entity();
|
|
test_assert(id_1 != 0);
|
|
|
|
flecs::id id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
flecs::id id_3 = ecs.entity();
|
|
test_assert(id_3 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add(id_1, id_2);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.has(id_1, id_2), true);
|
|
test_bool(e.has(id_1, id_3), false);
|
|
}
|
|
|
|
void Entity_has_pair_id_w_type(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel { };
|
|
|
|
flecs::id id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
flecs::id id_3 = ecs.entity();
|
|
test_assert(id_3 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add<Rel>(id_2);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.has<Rel>(id_2), true);
|
|
test_bool(e.has<Rel>(id_3), false);
|
|
}
|
|
|
|
void Entity_has_wildcard_id(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id = ecs.entity();
|
|
test_assert(id != 0);
|
|
|
|
auto e1 = ecs.entity().add(id);
|
|
auto e2 = ecs.entity();
|
|
|
|
test_assert(e1 != 0);
|
|
test_assert(e2 != 0);
|
|
|
|
test_bool(e1.has(flecs::Wildcard), true);
|
|
test_bool(e2.has(flecs::Wildcard), false);
|
|
}
|
|
|
|
void Entity_has_wildcard_pair_id(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id rel = ecs.entity();
|
|
test_assert(rel != 0);
|
|
|
|
flecs::id obj = ecs.entity();
|
|
test_assert(obj != 0);
|
|
|
|
flecs::id obj_2 = ecs.entity();
|
|
test_assert(obj_2 != 0);
|
|
|
|
flecs::id w1 = ecs.id(rel, flecs::Wildcard);
|
|
flecs::id w2 = ecs.id(flecs::Wildcard, obj);
|
|
|
|
auto e1 = ecs.entity().add(rel, obj);
|
|
auto e2 = ecs.entity().add(rel, obj_2);
|
|
|
|
test_assert(e1 != 0);
|
|
test_assert(e2 != 0);
|
|
|
|
test_bool(e1.has(w1), true);
|
|
test_bool(e1.has(w2), true);
|
|
|
|
test_bool(e2.has(w1), true);
|
|
test_bool(e2.has(w2), false);
|
|
}
|
|
|
|
void Entity_owns_id_t(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id_t id_1 = ecs.entity();
|
|
test_assert(id_1 != 0);
|
|
|
|
flecs::id_t id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add(id_1);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.owns(id_1), true);
|
|
test_bool(e.owns(id_2), false);
|
|
}
|
|
|
|
void Entity_owns_pair_id_t(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id_t id_1 = ecs.entity();
|
|
test_assert(id_1 != 0);
|
|
|
|
flecs::id_t id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
flecs::id_t id_3 = ecs.entity();
|
|
test_assert(id_3 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add(id_1, id_2);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.owns(id_1, id_2), true);
|
|
test_bool(e.owns(id_1, id_3), false);
|
|
}
|
|
|
|
void Entity_owns_pair_id_t_w_type(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel { };
|
|
|
|
flecs::id_t id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
flecs::id_t id_3 = ecs.entity();
|
|
test_assert(id_3 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add<Rel>(id_2);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.owns<Rel>(id_2), true);
|
|
test_bool(e.owns<Rel>(id_3), false);
|
|
}
|
|
|
|
void Entity_owns_id(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id_1 = ecs.entity();
|
|
test_assert(id_1 != 0);
|
|
|
|
flecs::id id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add(id_1);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.owns(id_1), true);
|
|
test_bool(e.owns(id_2), false);
|
|
}
|
|
|
|
void Entity_owns_pair_id(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id_1 = ecs.entity();
|
|
test_assert(id_1 != 0);
|
|
|
|
flecs::id id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
flecs::id id_3 = ecs.entity();
|
|
test_assert(id_3 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add(id_1, id_2);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.owns(id_1, id_2), true);
|
|
test_bool(e.owns(id_1, id_3), false);
|
|
}
|
|
|
|
void Entity_owns_wildcard_id(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id = ecs.entity();
|
|
test_assert(id != 0);
|
|
|
|
auto e1 = ecs.entity().add(id);
|
|
auto e2 = ecs.entity();
|
|
|
|
test_assert(e1 != 0);
|
|
test_assert(e2 != 0);
|
|
|
|
test_bool(e1.owns(flecs::Wildcard), true);
|
|
test_bool(e2.owns(flecs::Wildcard), false);
|
|
}
|
|
|
|
void Entity_owns_wildcard_pair(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id rel = ecs.entity();
|
|
test_assert(rel != 0);
|
|
|
|
flecs::id obj = ecs.entity();
|
|
test_assert(obj != 0);
|
|
|
|
flecs::id obj_2 = ecs.entity();
|
|
test_assert(obj_2 != 0);
|
|
|
|
flecs::id w1 = ecs.id(rel, flecs::Wildcard);
|
|
flecs::id w2 = ecs.id(flecs::Wildcard, obj);
|
|
|
|
auto e1 = ecs.entity().add(rel, obj);
|
|
auto e2 = ecs.entity().add(rel, obj_2);
|
|
|
|
test_assert(e1 != 0);
|
|
test_assert(e2 != 0);
|
|
|
|
test_bool(e1.owns(w1), true);
|
|
test_bool(e1.owns(w2), true);
|
|
|
|
test_bool(e2.owns(w1), true);
|
|
test_bool(e2.owns(w2), false);
|
|
}
|
|
|
|
void Entity_owns_pair_id_w_type(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel { };
|
|
|
|
flecs::id id_2 = ecs.entity();
|
|
test_assert(id_2 != 0);
|
|
|
|
flecs::id id_3 = ecs.entity();
|
|
test_assert(id_3 != 0);
|
|
|
|
auto e = ecs.entity()
|
|
.add<Rel>(id_2);
|
|
|
|
test_assert(e != 0);
|
|
test_bool(e.owns<Rel>(id_2), true);
|
|
test_bool(e.owns<Rel>(id_3), false);
|
|
}
|
|
|
|
void Entity_id_from_world(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
test_assert(e != 0);
|
|
|
|
flecs::id id_1 = ecs.id(e);
|
|
test_assert(id_1 != 0);
|
|
test_assert(id_1 == e);
|
|
test_assert(id_1.world() == ecs);
|
|
test_bool(id_1.is_pair(), false);
|
|
test_bool(id_1.is_wildcard(), false);
|
|
|
|
flecs::id id_2 = ecs.id(flecs::Wildcard);
|
|
test_assert(id_2 != 0);
|
|
test_assert(id_2 == flecs::Wildcard);
|
|
test_assert(id_2.world() == ecs);
|
|
test_bool(id_2.is_pair(), false);
|
|
test_bool(id_2.is_wildcard(), true);
|
|
}
|
|
|
|
void Entity_id_pair_from_world(void) {
|
|
flecs::world ecs;
|
|
|
|
auto rel = ecs.entity();
|
|
test_assert(rel != 0);
|
|
|
|
auto obj = ecs.entity();
|
|
test_assert(obj != 0);
|
|
|
|
flecs::id id_1 = ecs.id(rel, obj);
|
|
test_assert(id_1 != 0);
|
|
test_assert(id_1.first() == rel);
|
|
test_assert(id_1.second() == obj);
|
|
test_assert(id_1.world() == ecs);
|
|
test_bool(id_1.is_pair(), true);
|
|
test_bool(id_1.is_wildcard(), false);
|
|
|
|
flecs::id id_2 = ecs.id(rel, flecs::Wildcard);
|
|
test_assert(id_2 != 0);
|
|
test_assert(id_2.first() == rel);
|
|
test_assert(id_2.second() == flecs::Wildcard);
|
|
test_assert(id_2.world() == ecs);
|
|
test_bool(id_2.is_pair(), true);
|
|
test_bool(id_2.is_wildcard(), true);
|
|
}
|
|
|
|
void Entity_id_default_from_world(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::id id_default = ecs.id();
|
|
test_assert(id_default == 0);
|
|
}
|
|
|
|
void Entity_is_a(void) {
|
|
flecs::world world;
|
|
|
|
auto base = world.entity();
|
|
|
|
auto e = world.entity().is_a(base);
|
|
|
|
test_assert(e.has(flecs::IsA, base));
|
|
}
|
|
|
|
void Entity_is_a_w_type(void) {
|
|
flecs::world world;
|
|
|
|
struct Prefab { };
|
|
|
|
auto base = world.entity<Prefab>();
|
|
|
|
auto e = world.entity().is_a<Prefab>();
|
|
|
|
test_assert(e.has(flecs::IsA, base));
|
|
test_assert(e.has_second<Prefab>(flecs::IsA));
|
|
}
|
|
|
|
void Entity_child_of(void) {
|
|
flecs::world world;
|
|
|
|
auto base = world.entity();
|
|
|
|
auto e = world.entity().child_of(base);
|
|
|
|
test_assert(e.has(flecs::ChildOf, base));
|
|
}
|
|
|
|
void Entity_child_of_w_type(void) {
|
|
flecs::world world;
|
|
|
|
struct Parent { };
|
|
|
|
auto base = world.entity<Parent>();
|
|
|
|
auto e = world.entity().child_of<Parent>();
|
|
|
|
test_assert(e.has(flecs::ChildOf, base));
|
|
test_assert(e.has_second<Parent>(flecs::ChildOf));
|
|
}
|
|
|
|
void Entity_slot_of(void) {
|
|
flecs::world world;
|
|
|
|
auto base = world.prefab();
|
|
auto base_child = world.prefab()
|
|
.child_of(base)
|
|
.slot_of(base);
|
|
|
|
test_assert(base_child.has(flecs::SlotOf, base));
|
|
|
|
auto inst = world.entity().is_a(base);
|
|
test_assert(inst.has(base_child, flecs::Wildcard));
|
|
}
|
|
|
|
void Entity_slot_of_w_type(void) {
|
|
flecs::world world;
|
|
|
|
struct Parent { };
|
|
|
|
auto base = world.prefab<Parent>();
|
|
auto base_child = world.prefab()
|
|
.child_of(base)
|
|
.slot_of<Parent>();
|
|
|
|
test_assert(base_child.has(flecs::SlotOf, base));
|
|
|
|
auto inst = world.entity().is_a(base);
|
|
test_assert(inst.has(base_child, flecs::Wildcard));
|
|
}
|
|
|
|
void Entity_slot(void) {
|
|
flecs::world world;
|
|
|
|
auto base = world.prefab();
|
|
auto base_child = world.prefab()
|
|
.child_of(base).slot();
|
|
|
|
test_assert(base_child.has(flecs::SlotOf, base));
|
|
|
|
auto inst = world.entity().is_a(base);
|
|
test_assert(inst.has(base_child, flecs::Wildcard));
|
|
}
|
|
|
|
void Entity_id_get_entity(void) {
|
|
flecs::world world;
|
|
|
|
auto e = world.entity();
|
|
|
|
auto id = world.id(e);
|
|
|
|
test_assert(id.entity() == e);
|
|
}
|
|
|
|
void Entity_id_get_invalid_entity(void) {
|
|
install_test_abort();
|
|
|
|
flecs::world world;
|
|
|
|
auto r = world.entity();
|
|
auto o = world.entity();
|
|
|
|
auto id = world.id(r, o);
|
|
|
|
test_expect_abort();
|
|
|
|
id.entity();
|
|
}
|
|
|
|
void Entity_each_in_stage(void) {
|
|
flecs::world world;
|
|
|
|
struct Rel { };
|
|
struct Obj { };
|
|
|
|
auto e = world.entity().add<Rel, Obj>();
|
|
test_assert((e.has<Rel, Obj>()));
|
|
|
|
world.readonly_begin();
|
|
|
|
auto s = world.get_stage(0);
|
|
auto em = e.mut(s);
|
|
test_assert((em.has<Rel, Obj>()));
|
|
|
|
int count = 0;
|
|
|
|
em.each<Rel>([&](flecs::entity obj) {
|
|
count ++;
|
|
test_assert(obj == world.id<Obj>());
|
|
});
|
|
|
|
test_int(count, 1);
|
|
|
|
world.readonly_end();
|
|
}
|
|
|
|
void Entity_iter_recycled_parent(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
e.destruct();
|
|
|
|
auto e2 = ecs.entity();
|
|
test_assert(e != e2);
|
|
test_assert((uint32_t)e.id() == (uint32_t)e2.id());
|
|
|
|
auto e_child = ecs.entity().child_of(e2);
|
|
int32_t count = 0;
|
|
|
|
e2.children([&](flecs::entity child){
|
|
count ++;
|
|
test_assert(child == e_child);
|
|
});
|
|
|
|
test_int(count, 1);
|
|
}
|
|
|
|
void Entity_get_lambda_from_stage(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity().set<Position>({10, 20});
|
|
|
|
ecs.readonly_begin();
|
|
|
|
flecs::world stage = ecs.get_stage(0);
|
|
|
|
bool invoked = false;
|
|
e.mut(stage).get([&](const Position& p) {
|
|
invoked = true;
|
|
test_int(p.x, 10);
|
|
test_int(p.y, 20);
|
|
});
|
|
test_bool(invoked, true);
|
|
|
|
ecs.readonly_end();
|
|
}
|
|
|
|
void Entity_default_ctor(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity e1;
|
|
flecs::entity e2 = {};
|
|
|
|
flecs::entity_view e3;
|
|
flecs::entity_view e4 = {};
|
|
|
|
flecs::id id1;
|
|
flecs::id id2 = {};
|
|
|
|
e1 = ecs.entity();
|
|
e2 = ecs.entity();
|
|
e3 = ecs.entity();
|
|
e4 = ecs.entity();
|
|
|
|
test_assert(e1 != 0);
|
|
test_assert(e2 != 0);
|
|
test_assert(e3 != 0);
|
|
test_assert(e4 != 0);
|
|
|
|
test_assert(id2 == 0);
|
|
}
|
|
|
|
void Entity_get_obj_by_template(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel {};
|
|
|
|
flecs::entity e1 = ecs.entity();
|
|
flecs::entity o1 = ecs.entity();
|
|
flecs::entity o2 = ecs.entity();
|
|
|
|
e1.add<Rel>(o1);
|
|
e1.add<Rel>(o2);
|
|
|
|
test_assert(o1 == e1.target<Rel>());
|
|
test_assert(o1 == e1.target<Rel>(0));
|
|
test_assert(o2 == e1.target<Rel>(1));
|
|
}
|
|
|
|
void Entity_create_named_twice_deferred(void) {
|
|
flecs::world ecs;
|
|
|
|
ecs.defer_begin();
|
|
|
|
auto e1 = ecs.entity("e");
|
|
auto e2 = ecs.entity("e");
|
|
|
|
auto f1 = ecs.entity("p::f");
|
|
auto f2 = ecs.entity("p::f");
|
|
|
|
auto g1 = ecs.scope(ecs.entity("q")).entity("g");
|
|
auto g2 = ecs.scope(ecs.entity("q")).entity("g");
|
|
|
|
ecs.defer_end();
|
|
|
|
test_str(e1.path().c_str(), "::e");
|
|
test_str(f1.path().c_str(), "::p::f");
|
|
test_str(g1.path().c_str(), "::q::g");
|
|
|
|
test_assert(e1 == e2);
|
|
test_assert(f1 == f2);
|
|
test_assert(g1 == g2);
|
|
}
|
|
|
|
struct PositionInitialized {
|
|
PositionInitialized() { }
|
|
PositionInitialized(float x_, float y_) : x(x_), y(y_) { }
|
|
float x = -1.0;
|
|
float y = -1.0;
|
|
};
|
|
|
|
void Entity_clone(void) {
|
|
flecs::world ecs;
|
|
|
|
PositionInitialized v(10, 20);
|
|
|
|
auto src = ecs.entity().add<Tag>().set<PositionInitialized>(v);
|
|
auto dst = src.clone(false);
|
|
test_assert(dst.has<Tag>());
|
|
test_assert(dst.has<PositionInitialized>());
|
|
|
|
const PositionInitialized *ptr = dst.get<PositionInitialized>();
|
|
test_assert(ptr != NULL);
|
|
test_int(ptr->x, -1);
|
|
test_int(ptr->y, -1);
|
|
}
|
|
|
|
void Entity_clone_w_value(void) {
|
|
flecs::world ecs;
|
|
|
|
PositionInitialized v = {10, 20};
|
|
|
|
auto src = ecs.entity().add<Tag>().set<PositionInitialized>(v);
|
|
auto dst = src.clone();
|
|
test_assert(dst.has<Tag>());
|
|
test_assert(dst.has<PositionInitialized>());
|
|
|
|
const PositionInitialized *ptr = dst.get<PositionInitialized>();
|
|
test_assert(ptr != NULL);
|
|
test_int(ptr->x, 10);
|
|
test_int(ptr->y, 20);
|
|
}
|
|
|
|
void Entity_clone_to_existing(void) {
|
|
flecs::world ecs;
|
|
|
|
PositionInitialized v = {10, 20};
|
|
|
|
auto src = ecs.entity().add<Tag>().set<PositionInitialized>(v);
|
|
auto dst = ecs.entity();
|
|
auto result = src.clone(true, dst);
|
|
test_assert(result == dst);
|
|
|
|
test_assert(dst.has<Tag>());
|
|
test_assert(dst.has<PositionInitialized>());
|
|
|
|
const PositionInitialized *ptr = dst.get<PositionInitialized>();
|
|
test_assert(ptr != NULL);
|
|
test_int(ptr->x, 10);
|
|
test_int(ptr->y, 20);
|
|
}
|
|
|
|
void Entity_clone_to_existing_overlap(void) {
|
|
install_test_abort();
|
|
flecs::world ecs;
|
|
|
|
PositionInitialized v = {10, 20};
|
|
|
|
auto src = ecs.entity().add<Tag>().set<PositionInitialized>(v);
|
|
auto dst = ecs.entity().add<PositionInitialized>();
|
|
|
|
test_expect_abort();
|
|
src.clone(true, dst);
|
|
}
|
|
|
|
void Entity_set_doc_name(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity("foo_bar")
|
|
.set_doc_name("Foo Bar");
|
|
|
|
test_str(e.name(), "foo_bar");
|
|
test_str(e.doc_name(), "Foo Bar");
|
|
}
|
|
|
|
void Entity_set_doc_brief(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity("foo_bar")
|
|
.set_doc_brief("Foo Bar");
|
|
|
|
test_str(e.name(), "foo_bar");
|
|
test_str(e.doc_brief(), "Foo Bar");
|
|
}
|
|
|
|
void Entity_set_doc_detail(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity("foo_bar")
|
|
.set_doc_detail("Foo Bar");
|
|
|
|
test_str(e.name(), "foo_bar");
|
|
test_str(e.doc_detail(), "Foo Bar");
|
|
}
|
|
|
|
void Entity_set_doc_link(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity("foo_bar")
|
|
.set_doc_link("Foo Bar");
|
|
|
|
test_str(e.name(), "foo_bar");
|
|
test_str(e.doc_link(), "Foo Bar");
|
|
}
|
|
|
|
void Entity_entity_w_root_name(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity("::foo");
|
|
test_str(e.name(), "foo");
|
|
test_str(e.path(), "::foo");
|
|
}
|
|
|
|
void Entity_entity_w_root_name_from_scope(void) {
|
|
flecs::world ecs;
|
|
|
|
auto p = ecs.entity("parent");
|
|
ecs.set_scope(p);
|
|
auto e = ecs.entity("::foo");
|
|
ecs.set_scope(0);
|
|
|
|
test_str(e.name(), "foo");
|
|
test_str(e.path(), "::foo");
|
|
}
|
|
|
|
struct EntityType { };
|
|
|
|
void Entity_entity_w_type(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity<EntityType>();
|
|
|
|
test_str(e.name().c_str(), "EntityType");
|
|
test_str(e.path().c_str(), "::EntityType");
|
|
test_assert(!e.has<flecs::Component>());
|
|
|
|
auto e_2 = ecs.entity<EntityType>();
|
|
test_assert(e == e_2);
|
|
}
|
|
|
|
struct Turret {
|
|
struct Base { };
|
|
};
|
|
|
|
struct Railgun {
|
|
struct Base { };
|
|
struct Head { };
|
|
struct Beam { };
|
|
};
|
|
|
|
void Entity_prefab_hierarchy_w_types(void) {
|
|
flecs::world ecs;
|
|
|
|
auto turret = ecs.prefab<Turret>();
|
|
auto turret_base = ecs.prefab<Turret::Base>();
|
|
|
|
test_assert(turret != 0);
|
|
test_assert(turret_base != 0);
|
|
test_assert(turret_base.has(flecs::ChildOf, turret));
|
|
|
|
test_str(turret.path().c_str(), "::Turret");
|
|
test_str(turret_base.path().c_str(), "::Turret::Base");
|
|
|
|
test_str(turret.symbol(), "Turret");
|
|
test_str(turret_base.symbol(), "Turret.Base");
|
|
|
|
auto railgun = ecs.prefab<Railgun>().is_a<Turret>();
|
|
auto railgun_base = railgun.lookup("Base");
|
|
auto railgun_head = ecs.prefab<Railgun::Head>();
|
|
auto railgun_beam = ecs.prefab<Railgun::Beam>();
|
|
|
|
test_assert(railgun != 0);
|
|
test_assert(railgun_base != 0);
|
|
test_assert(railgun_head != 0);
|
|
test_assert(railgun_beam != 0);
|
|
test_assert(railgun_base.has(flecs::ChildOf, railgun));
|
|
test_assert(railgun_head.has(flecs::ChildOf, railgun));
|
|
test_assert(railgun_beam.has(flecs::ChildOf, railgun));
|
|
|
|
test_str(railgun.path().c_str(), "::Railgun");
|
|
test_str(railgun_base.path().c_str(), "::Railgun::Base");
|
|
test_str(railgun_head.path().c_str(), "::Railgun::Head");
|
|
test_str(railgun_beam.path().c_str(), "::Railgun::Beam");
|
|
|
|
test_str(railgun.symbol().c_str(), "Railgun");
|
|
test_str(railgun_head.symbol().c_str(), "Railgun.Head");
|
|
test_str(railgun_beam.symbol().c_str(), "Railgun.Beam");
|
|
}
|
|
|
|
struct Base { };
|
|
|
|
void Entity_prefab_hierarchy_w_root_types(void) {
|
|
flecs::world ecs;
|
|
|
|
auto turret = ecs.prefab<Turret>();
|
|
auto turret_base = ecs.prefab<Base>().child_of<Turret>();
|
|
|
|
test_assert(turret != 0);
|
|
test_assert(turret_base != 0);
|
|
test_assert(turret_base.has(flecs::ChildOf, turret));
|
|
|
|
test_str(turret.path().c_str(), "::Turret");
|
|
test_str(turret_base.path().c_str(), "::Turret::Base");
|
|
|
|
test_str(turret.symbol(), "Turret");
|
|
test_str(turret_base.symbol(), "Base");
|
|
|
|
auto inst = ecs.entity().is_a<Turret>();
|
|
test_assert(inst != 0);
|
|
|
|
auto inst_base = inst.lookup("Base");
|
|
test_assert(inst_base != 0);
|
|
}
|
|
|
|
void Entity_prefab_hierarchy_w_child_override(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Foo {};
|
|
struct Bar {};
|
|
|
|
auto t = ecs.prefab<Turret>();
|
|
auto tb = ecs.prefab<Turret::Base>().add<Foo>();
|
|
test_assert(t != 0);
|
|
test_assert(tb != 0);
|
|
|
|
auto r = ecs.prefab<Railgun>().is_a<Turret>();
|
|
auto rb = ecs.prefab<Railgun::Base>().add<Bar>();
|
|
test_assert(r != 0);
|
|
test_assert(rb != 0);
|
|
|
|
auto i = ecs.entity().is_a<Railgun>();
|
|
test_assert(i != 0);
|
|
auto ib = i.lookup("Base");
|
|
test_assert(ib != 0);
|
|
test_assert(ib.has<Foo>());
|
|
test_assert(ib.has<Bar>());
|
|
}
|
|
|
|
void Entity_entity_w_nested_type(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity<Parent::EntityType>();
|
|
auto p = ecs.entity<Parent>();
|
|
|
|
test_str(e.name().c_str(), "EntityType");
|
|
test_str(e.path().c_str(), "::Parent::EntityType");
|
|
test_assert(e.has(flecs::ChildOf, p));
|
|
test_assert(!e.has<flecs::Component>());
|
|
|
|
auto e_2 = ecs.entity<Parent::EntityType>();
|
|
test_assert(e == e_2);
|
|
}
|
|
|
|
void Entity_entity_array(void) {
|
|
struct TagA {};
|
|
struct TagB {};
|
|
|
|
flecs::world ecs;
|
|
|
|
flecs::to_array({
|
|
ecs.entity(),
|
|
ecs.entity(),
|
|
ecs.entity()
|
|
}).each([](flecs::entity e) { e.add<TagA>().add<TagB>(); });
|
|
|
|
test_int( ecs.count<TagA>(), 3 );
|
|
test_int( ecs.count<TagB>(), 3 );
|
|
}
|
|
|
|
void Entity_entity_w_type_defer(void) {
|
|
flecs::world ecs;
|
|
|
|
ecs.defer_begin();
|
|
auto e = ecs.entity<Tag>();
|
|
ecs.defer_end();
|
|
|
|
test_str(e.name(), "Tag");
|
|
test_str(e.symbol(), "Tag");
|
|
test_assert(ecs.id<Tag>() == e);
|
|
}
|
|
|
|
void Entity_add_if_true_T(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
|
|
e.add_if<Tag>(true);
|
|
test_assert( e.has<Tag>());
|
|
}
|
|
|
|
void Entity_add_if_false_T(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
|
|
e.add_if<Tag>(false);
|
|
test_assert( !e.has<Tag>());
|
|
|
|
e.add<Tag>();
|
|
test_assert( e.has<Tag>());
|
|
e.add_if<Tag>(false);
|
|
test_assert( !e.has<Tag>());
|
|
}
|
|
|
|
void Entity_add_if_true_id(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
auto t = ecs.entity();
|
|
|
|
e.add_if(true, t);
|
|
test_assert( e.has(t));
|
|
}
|
|
|
|
void Entity_add_if_false_id(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
auto t = ecs.entity();
|
|
|
|
e.add_if(false, t);
|
|
test_assert( !e.has(t));
|
|
e.add(t);
|
|
test_assert( e.has(t));
|
|
e.add_if(false, t);
|
|
test_assert( !e.has(t));
|
|
}
|
|
|
|
void Entity_add_if_true_R_O(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel { };
|
|
struct Obj { };
|
|
|
|
auto e = ecs.entity();
|
|
|
|
e.add_if<Rel, Obj>(true);
|
|
test_assert( (e.has<Rel, Obj>()) );
|
|
}
|
|
|
|
void Entity_add_if_false_R_O(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel { };
|
|
struct Obj { };
|
|
|
|
auto e = ecs.entity();
|
|
|
|
e.add_if<Rel, Obj>(false);
|
|
test_assert( (!e.has<Rel, Obj>()));
|
|
e.add<Rel, Obj>();
|
|
test_assert( (e.has<Rel, Obj>()));
|
|
e.add_if<Rel, Obj>(false);
|
|
test_assert( (!e.has<Rel, Obj>()));
|
|
}
|
|
|
|
void Entity_add_if_true_R_o(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel { };
|
|
|
|
auto e = ecs.entity();
|
|
auto o = ecs.entity();
|
|
|
|
e.add_if<Rel>(true, o);
|
|
test_assert( e.has<Rel>(o));
|
|
}
|
|
|
|
void Entity_add_if_false_R_o(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel { };
|
|
|
|
auto e = ecs.entity();
|
|
auto o = ecs.entity();
|
|
|
|
e.add_if<Rel>(false, o);
|
|
test_assert( !e.has<Rel>(o));
|
|
e.add<Rel>(o);
|
|
test_assert( e.has<Rel>(o));
|
|
e.add_if<Rel>(false, o);
|
|
test_assert( !e.has<Rel>(o));
|
|
}
|
|
|
|
void Entity_add_if_true_r_o(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
auto r = ecs.entity();
|
|
auto o = ecs.entity();
|
|
|
|
e.add_if(true, r, o);
|
|
test_assert( e.has(r, o));
|
|
}
|
|
|
|
void Entity_add_if_false_r_o() {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
auto r = ecs.entity();
|
|
auto o = ecs.entity();
|
|
|
|
e.add_if(false, r, o);
|
|
test_assert( !e.has(r, o));
|
|
e.add(r, o);
|
|
test_assert( e.has(r, o));
|
|
e.add_if(false, r, o);
|
|
test_assert( !e.has(r, o));
|
|
}
|
|
|
|
void Entity_add_if_exclusive_r_o(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
auto r = ecs.entity().add(flecs::Exclusive);
|
|
auto o_1 = ecs.entity();
|
|
auto o_2 = ecs.entity();
|
|
|
|
e.add(r, o_1);
|
|
test_assert(e.has(r, o_1));
|
|
|
|
e.add_if(true, r, o_2);
|
|
test_assert(!e.has(r, o_1));
|
|
test_assert(e.has(r, o_2));
|
|
|
|
e.add_if(false, r, o_1);
|
|
test_assert(!e.has(r, o_1));
|
|
test_assert(!e.has(r, o_2));
|
|
}
|
|
|
|
void Entity_add_if_exclusive_R_o(void) {
|
|
flecs::world ecs;
|
|
|
|
struct First { };
|
|
|
|
ecs.component<First>().add(flecs::Exclusive);
|
|
|
|
auto e = ecs.entity();
|
|
auto o_1 = ecs.entity();
|
|
auto o_2 = ecs.entity();
|
|
|
|
e.add<First>(o_1);
|
|
test_assert(e.has<First>(o_1));
|
|
|
|
e.add_if<First>(true, o_2);
|
|
test_assert(!e.has<First>(o_1));
|
|
test_assert(e.has<First>(o_2));
|
|
|
|
e.add_if<First>(false, o_1);
|
|
test_assert(!e.has<First>(o_1));
|
|
test_assert(!e.has<First>(o_2));
|
|
}
|
|
|
|
void Entity_add_if_exclusive_R_O(void) {
|
|
flecs::world ecs;
|
|
|
|
struct R { };
|
|
struct O_1 { };
|
|
struct O_2 { };
|
|
|
|
ecs.component<R>().add(flecs::Exclusive);
|
|
|
|
auto e = ecs.entity();
|
|
|
|
e.add<R, O_1>();
|
|
test_assert((e.has<R, O_1>()));
|
|
|
|
e.add_if<R, O_2>(true);
|
|
test_assert((!e.has<R, O_1>()));
|
|
test_assert((e.has<R, O_2>()));
|
|
|
|
e.add_if<R, O_1>(false);
|
|
test_assert((!e.has<R, O_1>()));
|
|
test_assert((!e.has<R, O_2>()));
|
|
}
|
|
|
|
void Entity_add_if_pair_w_0_object(void) {
|
|
flecs::world ecs;
|
|
|
|
auto e = ecs.entity();
|
|
auto r = ecs.entity();
|
|
auto o_1 = ecs.entity();
|
|
|
|
e.add(r, o_1);
|
|
test_assert(e.has(r, o_1));
|
|
|
|
e.add_if(0, r, 0);
|
|
test_assert(!e.has(r, o_1));
|
|
test_assert(!e.has(r, flecs::Wildcard));
|
|
}
|
|
|
|
void Entity_children_w_custom_relation(void) {
|
|
flecs::world ecs;
|
|
|
|
flecs::entity rel = ecs.entity();
|
|
|
|
flecs::entity parent = ecs.entity();
|
|
flecs::entity child_1 = ecs.entity().add(rel, parent);
|
|
flecs::entity child_2 = ecs.entity().add(rel, parent);
|
|
ecs.entity().child_of(parent);
|
|
|
|
bool child_1_found = false;
|
|
bool child_2_found = false;
|
|
int32_t count = 0;
|
|
|
|
parent.children(rel, [&](flecs::entity child) {
|
|
if (child == child_1) {
|
|
child_1_found = true;
|
|
} else if (child == child_2) {
|
|
child_2_found = true;
|
|
}
|
|
count ++;
|
|
});
|
|
|
|
test_int(count, 2);
|
|
test_assert(child_1_found == true);
|
|
test_assert(child_2_found == true);
|
|
}
|
|
|
|
void Entity_children_w_custom_relation_type(void) {
|
|
flecs::world ecs;
|
|
|
|
struct Rel { };
|
|
|
|
flecs::entity parent = ecs.entity();
|
|
flecs::entity child_1 = ecs.entity().add<Rel>(parent);
|
|
flecs::entity child_2 = ecs.entity().add<Rel>(parent);
|
|
ecs.entity().child_of(parent);
|
|
|
|
bool child_1_found = false;
|
|
bool child_2_found = false;
|
|
int32_t count = 0;
|
|
|
|
parent.children<Rel>([&](flecs::entity child) {
|
|
if (child == child_1) {
|
|
child_1_found = true;
|
|
} else if (child == child_2) {
|
|
child_2_found = true;
|
|
}
|
|
count ++;
|
|
});
|
|
|
|
test_int(count, 2);
|
|
test_assert(child_1_found == true);
|
|
test_assert(child_2_found == true);
|
|
}
|
|
|
|
void Entity_children_w_this(void) {
|
|
flecs::world ecs;
|
|
|
|
int32_t count = 0;
|
|
ecs.entity(flecs::This).children([&](flecs::entity) {
|
|
count ++;
|
|
});
|
|
test_assert(count == 0);
|
|
}
|
|
|
|
void Entity_children_w_wildcard(void) {
|
|
flecs::world ecs;
|
|
|
|
int32_t count = 0;
|
|
ecs.entity(flecs::Wildcard).children([&](flecs::entity) {
|
|
count ++;
|
|
});
|
|
test_assert(count == 0);
|
|
}
|
|
|
|
void Entity_children_w_any(void) {
|
|
flecs::world ecs;
|
|
|
|
int32_t count = 0;
|
|
ecs.entity(flecs::Any).children([&](flecs::entity) {
|
|
count ++;
|
|
});
|
|
test_assert(count == 0);
|
|
}
|
|
|
|
void Entity_children_from_root(void) {
|
|
flecs::world ecs;
|
|
|
|
int32_t count = 0;
|
|
ecs.entity(0).children([&](flecs::entity e) {
|
|
test_assert(e == ecs.entity("flecs"));
|
|
count ++;
|
|
});
|
|
test_assert(count == 1);
|
|
}
|
|
|
|
void Entity_children_from_root_world(void) {
|
|
flecs::world ecs;
|
|
|
|
int32_t count = 0;
|
|
ecs.children([&](flecs::entity e) {
|
|
test_assert(e == ecs.entity("flecs"));
|
|
count ++;
|
|
});
|
|
test_assert(count == 1);
|
|
}
|
|
|
|
void Entity_get_depth(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity e1 = world.entity();
|
|
flecs::entity e2 = world.entity().child_of(e1);
|
|
flecs::entity e3 = world.entity().child_of(e2);
|
|
flecs::entity e4 = world.entity().child_of(e3);
|
|
|
|
test_int(0, e1.depth(flecs::ChildOf));
|
|
test_int(1, e2.depth(flecs::ChildOf));
|
|
test_int(2, e3.depth(flecs::ChildOf));
|
|
test_int(3, e4.depth(flecs::ChildOf));
|
|
}
|
|
|
|
void Entity_get_depth_w_type(void) {
|
|
flecs::world world;
|
|
|
|
struct Rel { };
|
|
world.component<Rel>().add(flecs::Traversable);
|
|
|
|
flecs::entity e1 = world.entity();
|
|
flecs::entity e2 = world.entity().add<Rel>(e1);
|
|
flecs::entity e3 = world.entity().add<Rel>(e2);
|
|
flecs::entity e4 = world.entity().add<Rel>(e3);
|
|
|
|
test_int(0, e1.depth<Rel>());
|
|
test_int(1, e2.depth<Rel>());
|
|
test_int(2, e3.depth<Rel>());
|
|
test_int(3, e4.depth<Rel>());
|
|
}
|
|
|
|
void Entity_to_view(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity e = world.entity();
|
|
flecs::entity_view ev = e.view();
|
|
test_assert(e == ev);
|
|
}
|
|
|
|
void Entity_to_view_from_stage(void) {
|
|
flecs::world world;
|
|
|
|
auto stage = world.get_stage(0);
|
|
|
|
flecs::entity e = stage.entity();
|
|
flecs::entity_view ev = e.view();
|
|
test_assert(e == ev);
|
|
test_assert(e.world() == stage);
|
|
test_assert(ev.world() == world);
|
|
}
|
|
|
|
void Entity_set_alias(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity e = world.entity("parent::child");
|
|
e.set_alias("parent_child");
|
|
|
|
test_assert(e == world.lookup("parent::child"));
|
|
test_assert(e == world.lookup("parent_child"));
|
|
}
|
|
|
|
void Entity_emplace_w_observer(void) {
|
|
flecs::world ecs;
|
|
|
|
ecs.observer<Position>()
|
|
.event(flecs::OnAdd)
|
|
.each([](flecs::entity e, Position&) {
|
|
e.emplace<Velocity>(1.0f, 2.0f);
|
|
});
|
|
|
|
auto e = ecs.entity()
|
|
.emplace<Position>(10.0f, 20.0f);
|
|
|
|
test_assert(e.has<Position>());
|
|
test_assert(e.has<Velocity>());
|
|
test_int(e.get<Velocity>()->x, 1);
|
|
test_int(e.get<Velocity>()->y, 2);
|
|
test_int(e.get<Position>()->x, 10);
|
|
test_int(e.get<Position>()->y, 20);
|
|
}
|
|
|
|
void Entity_scoped_world(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity();
|
|
flecs::entity child = parent.scope().entity();
|
|
test_assert(child.parent() == parent);
|
|
}
|
|
|
|
void Entity_entity_lookup_not_recursive(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity("parent");
|
|
flecs::entity child = world.scope(parent).entity("child");
|
|
flecs::entity foo = world.scope(parent).entity("foo");
|
|
|
|
test_assert(child.lookup("foo") == 0);
|
|
test_assert(child.lookup("foo", true) == foo);
|
|
}
|
|
|
|
void Entity_world_lookup_not_recursive(void) {
|
|
flecs::world world;
|
|
|
|
flecs::entity parent = world.entity("parent");
|
|
flecs::entity child = world.scope(parent).entity("child");
|
|
flecs::entity foo = world.scope(parent).entity("foo");
|
|
|
|
test_assert(world.scope(child).lookup("foo") == foo);
|
|
test_assert(world.scope(child).lookup("foo", false) == 0);
|
|
}
|