#include namespace ns { struct NestedNameSpaceType { }; class NestedModule { public: NestedModule(flecs::world& world) { world.module(); flecs::component(world, "Velocity"); } }; class SimpleModule { public: SimpleModule(flecs::world& world) { world.module(); world.import(); flecs::component(world, "Position"); } }; class NestedTypeModule { public: struct NestedType { }; NestedTypeModule(flecs::world& world) { world.module(); world.component(); world.component(); } }; class NamedModule { public: NamedModule(flecs::world& world) { world.module("::my_scope::NamedModule"); flecs::component(world, "Position"); } }; class ImplicitModule { public: ImplicitModule(flecs::world& world) { world.component(); } }; class NamedModuleInRoot { public: NamedModuleInRoot(flecs::world& world) { world.module("::NamedModuleInRoot"); world.component(); } }; } struct Module { Module(flecs::world& world) { world.module(); world.component(); } }; void Module_import(void) { flecs::world world; auto m = world.import(); test_assert(m.id() != 0); test_str(m.path().c_str(), "::ns::SimpleModule"); test_assert(m.has(flecs::Module)); auto e = flecs::entity(world) .add(); test_assert(e.id() != 0); test_assert(e.has()); } void Module_lookup_from_scope(void) { flecs::world world; world.import(); auto ns_entity = world.lookup("ns"); test_assert(ns_entity.id() != 0); auto module_entity = world.lookup("ns::SimpleModule"); test_assert(module_entity.id() != 0); auto position_entity = world.lookup("ns::SimpleModule::Position"); test_assert(position_entity.id() != 0); auto nested_module = ns_entity.lookup("SimpleModule"); test_assert(module_entity.id() == nested_module.id()); auto module_position = module_entity.lookup("Position"); test_assert(position_entity.id() == module_position.id()); auto ns_position = ns_entity.lookup("SimpleModule::Position"); test_assert(position_entity.id() == ns_position.id()); } void Module_nested_module(void) { flecs::world world; world.import(); auto velocity = world.lookup("ns::NestedModule::Velocity"); test_assert(velocity.id() != 0); test_str(velocity.path().c_str(), "::ns::NestedModule::Velocity"); } void Module_nested_type_module(void) { flecs::world world; world.import(); auto ns_entity = world.lookup("ns"); test_assert(ns_entity.id() != 0); auto module_entity = world.lookup("ns::NestedTypeModule"); test_assert(module_entity.id() != 0); auto type_entity = world.lookup("ns::NestedTypeModule::NestedType"); test_assert(type_entity.id() != 0); auto ns_type_entity = world.lookup("ns::NestedTypeModule::NestedNameSpaceType"); test_assert(ns_type_entity.id() != 0); int32_t childof_count = 0; type_entity.each(flecs::ChildOf, [&](flecs::entity) { childof_count ++; }); test_int(childof_count, 1); childof_count = 0; ns_type_entity.each(flecs::ChildOf, [&](flecs::entity) { childof_count ++; }); test_int(childof_count, 1); } void Module_component_redefinition_outside_module(void) { flecs::world world; world.import(); auto pos_comp = world.lookup("ns::SimpleModule::Position"); test_assert(pos_comp.id() != 0); auto pos = world.component(); test_assert(pos.id() != 0); test_assert(pos.id() == pos_comp.id()); int32_t childof_count = 0; pos_comp.each(flecs::ChildOf, [&](flecs::entity) { childof_count ++; }); test_int(childof_count, 1); } void Module_module_tag_on_namespace(void) { flecs::world world; auto mid = world.import(); test_assert(mid.has(flecs::Module)); auto nsid = world.lookup("ns"); test_assert(nsid.has(flecs::Module)); } static int module_ctor_invoked = 0; static int module_dtor_invoked = 0; class Module_w_dtor { public: Module_w_dtor(flecs::world& world) { world.module(); module_ctor_invoked ++; world.system<>().iter([](flecs::iter& it) { }); } ~Module_w_dtor() { module_dtor_invoked ++; } }; void Module_dtor_on_fini(void) { { flecs::world ecs; test_int(module_ctor_invoked, 0); test_int(module_dtor_invoked, 0); ecs.import(); test_int(module_ctor_invoked, 1); test_int(module_dtor_invoked, 0); } test_int(module_dtor_invoked, 1); } void Module_register_w_root_name() { flecs::world ecs; auto m = ecs.import(); auto m_lookup = ecs.lookup("::my_scope::NamedModule"); test_assert(m != 0); test_assert(m == m_lookup); test_assert(ecs.lookup("::ns::NamedModule") == 0); } void Module_implicit_module(void) { flecs::world ecs; auto m = ecs.import(); auto m_lookup = ecs.lookup("::ns::ImplicitModule"); test_assert(m != 0); test_assert(m == m_lookup); auto p = ecs.component(); auto p_lookup = ecs.lookup("::ns::ImplicitModule::Position"); test_assert(p != 0); test_assert(p == p_lookup); } void Module_module_in_namespace_w_root_name(void) { flecs::world ecs; auto m = ecs.import(); auto m_lookup = ecs.lookup("::NamedModuleInRoot"); test_assert(m != 0); test_assert(m == m_lookup); test_str(m.path(), "::NamedModuleInRoot"); auto p = ecs.component(); auto p_lookup = ecs.lookup("::NamedModuleInRoot::Position"); test_assert(p != 0); test_assert(p == p_lookup); } void Module_module_as_entity(void) { flecs::world world; auto m = world.import(); test_assert(m != 0); auto e = world.entity(); test_assert(m == e); } void Module_module_as_component(void) { flecs::world world; auto m = world.import(); test_assert(m != 0); auto e = world.component(); test_assert(m == e); } void Module_module_with_core_name(void) { flecs::world world; flecs::entity m = world.import(); test_assert(m != 0); test_str(m.path().c_str(), "::Module"); flecs::entity pos = m.lookup("Position"); test_assert(pos != 0); test_str(pos.path().c_str(), "::Module::Position"); test_assert(pos == world.id()); }