#include struct Pair { int value; }; void ImplicitComponents_add(void) { flecs::world world; auto e = world.entity().add(); test_str(e.type().str().c_str(), "Position"); test_assert(e.has()); auto position = world.lookup("Position"); test_assert(position.id() != 0); } void ImplicitComponents_remove(void) { flecs::world world; auto e = world.entity().remove(); test_assert(!e.has()); auto position = world.lookup("Position"); test_assert(position.id() != 0); } void ImplicitComponents_has(void) { flecs::world world; auto e = world.entity(); test_assert(!e.has()); auto position = world.lookup("Position"); test_assert(position.id() != 0); } void ImplicitComponents_set(void) { flecs::world world; auto e = world.entity().set({10, 20}); test_str(e.type().str().c_str(), "Position"); test_assert(e.has()); auto *p = e.get(); test_int(p->x, 10); test_int(p->y, 20); auto position = world.lookup("Position"); test_assert(position.id() != 0); } void ImplicitComponents_get(void) { flecs::world world; auto e = world.entity(); auto *p = e.get(); test_assert(p == nullptr); auto position = world.lookup("Position"); test_assert(position.id() != 0); } void ImplicitComponents_add_pair(void) { flecs::world world; auto e = world.entity().add(); test_str(e.type().str().c_str(), "(Pair,Position)"); test_assert((e.has())); auto position = world.lookup("Position"); test_assert(position.id() != 0); auto pair = world.lookup("Pair"); test_assert(pair.id() != 0); } void ImplicitComponents_remove_pair(void) { flecs::world world; auto e = world.entity().remove(); test_assert((!e.has())); auto position = world.lookup("Position"); test_assert(position.id() != 0); auto pair = world.lookup("Pair"); test_assert(pair.id() != 0); } void ImplicitComponents_module(void) { flecs::world world; world.module(); auto position = world.lookup("Position"); test_assert(position.id() != 0); } void ImplicitComponents_system(void) { flecs::world world; world.system() .each([](flecs::entity e, Position& p, Velocity& v) { }); auto position = world.lookup("Position"); test_assert(position.id() != 0); auto velocity = world.lookup("Velocity"); test_assert(velocity.id() != 0); } void ImplicitComponents_system_optional(void) { flecs::world world; int rotation_count = 0; int mass_count = 0; world.system() .each([&](flecs::entity e, Rotation* r, Mass* m) { if (r) { rotation_count ++; } if (m) { mass_count ++; } }); world.entity().set({10}); world.entity().set({20}); world.entity() .set({30}) .set({40}); auto rotation = world.lookup("Rotation"); test_assert(rotation.id() != 0); auto mass = world.lookup("Mass"); test_assert(mass.id() != 0); auto rcomp = world.component(); test_assert(rcomp == rotation); auto mcomp = world.component(); test_assert(mcomp == mass); world.progress(); test_int(rotation_count, 2); test_int(mass_count, 2); } void ImplicitComponents_system_const(void) { flecs::world world; int count = 0; world.system() .each([&](flecs::entity e, Position& p, const Velocity& v) { p.x += v.x; p.y += v.y; count ++; }); auto position = world.lookup("Position"); test_assert(position.id() != 0); auto velocity = world.lookup("Velocity"); test_assert(velocity.id() != 0); auto e = world.entity() .set({10, 20}) .set({1, 2}); auto pcomp = world.component(); test_assert(pcomp == position); auto vcomp = world.component(); test_assert(vcomp == velocity); world.progress(); test_int(count, 1); const Position *p = e.get(); test_int(p->x, 11); test_int(p->y, 22); } void ImplicitComponents_query(void) { flecs::world world; auto q = world.query(); q.each([](flecs::entity e, Position& p, Velocity &v) { }); auto position = world.lookup("Position"); test_assert(position.id() != 0); auto velocity = world.lookup("Velocity"); test_assert(velocity.id() != 0); } void ImplicitComponents_implicit_name(void) { flecs::world world; auto pcomp = world.component(); auto position = world.lookup("Position"); test_assert(position.id() != 0); test_assert(pcomp == position); } void ImplicitComponents_reinit(void) { flecs::world world; auto comp_1 = world.component(); test_assert(flecs::type_id() == comp_1.id()); // Reset component id using internals (currently the only way to simulate // registration across translation units) flecs::_::cpp_type::reset(); world.entity() .add(); test_assert(flecs::type_id() == comp_1.id()); } namespace Foo { struct Position { float x; float y; }; } void ImplicitComponents_reinit_scoped(void) { flecs::world world; auto comp_1 = world.component(); test_assert(flecs::type_id() == comp_1.id()); // Reset component id using internals (currently the only way to simulate // registration across translation units) flecs::_::cpp_type::reset(); world.entity() .add(); test_assert(flecs::type_id() == comp_1.id()); } static int position_ctor_invoked = 0; ECS_CTOR(Position, ptr, { position_ctor_invoked ++; }) void ImplicitComponents_reinit_w_lifecycle(void) { flecs::world world; auto comp_1 = world.component(); test_assert(flecs::type_id() == comp_1.id()); // Explicitly register constructor ecs_type_hooks_t cl{}; cl.ctor = ecs_ctor(Position); ecs_set_hooks_id(world.c_ptr(), comp_1.id(), &cl); auto e = world.entity() .add(); test_assert(e.has()); test_int(position_ctor_invoked, 1); // Reset component id using internals (currently the only way to simulate // registration across translation units) flecs::_::cpp_type::reset(); e = world.entity() .add(); test_assert(e.has()); test_int(position_ctor_invoked, 2); test_assert(flecs::type_id() == comp_1.id()); } void ImplicitComponents_first_use_in_system(void) { flecs::world world; world.system() .each([](flecs::entity e, Position& p) { e.add(); }); auto e = world.entity().add(); world.progress(); test_assert(e.has()); } namespace ns { struct NsTag { }; } void ImplicitComponents_first_use_tag_in_system(void) { flecs::world world; world.system() .each([](flecs::entity e, Position& p) { e.add(); e.add(); }); auto e = world.entity().add(); world.progress(); test_assert(e.has()); } enum Color { Red, Green, Blue }; void ImplicitComponents_first_use_enum_in_system(void) { flecs::world world; world.system() .each([](flecs::entity e, Position& p) { e.add(); e.add(Color::Green); }); auto e = world.entity().add(); world.progress(); test_assert(e.has()); test_assert(e.has()); test_assert(e.has(Color::Green)); test_assert(world.component().has(flecs::Exclusive)); } void ImplicitComponents_use_const(void) { flecs::world world; world.use(); auto e = world.entity() .set({10, 20}); test_assert(e.has()); const Position *p = e.get(); test_int(p->x, 10); test_int(p->y, 20); } void ImplicitComponents_use_const_w_stage(void) { flecs::world world; world.use(); auto e = world.entity() .set({10, 20}); world.system() .each([](flecs::entity e, Position&) { e.set({1, 2}); }); world.progress(); test_assert(e.has()); const Velocity *v = e.get(); test_int(v->x, 1); test_int(v->y, 2); } void ImplicitComponents_use_const_w_threads(void) { flecs::world world; world.use(); auto e = world.entity() .set({10, 20}); world.system() .each([](flecs::entity e, Position&) { e.set({1, 2}); }); world.set_threads(2); world.progress(); test_assert(e.has()); const Velocity *v = e.get(); test_int(v->x, 1); test_int(v->y, 2); } void ImplicitComponents_implicit_base(void) { flecs::world world; auto v = world.use(); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); } void ImplicitComponents_implicit_const(void) { flecs::world world; auto v = world.use(); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); } void ImplicitComponents_implicit_ref(void) { flecs::world world; auto v = world.use(); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); } void ImplicitComponents_implicit_ptr(void) { flecs::world world; auto v = world.use(); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); } void ImplicitComponents_implicit_const_ref(void) { flecs::world world; auto v = world.use(); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); test_int(v.id(), flecs::type_id()); } void ImplicitComponents_vector_elem_type(void) { flecs::world world; { flecs::entity v = world.vector(); test_assert(v != 0); } flecs::reset(); { flecs::entity v = world.vector(); test_assert(v != 0); } }