diff --git a/untests/meta_registry_tests.cpp b/untests/meta_registry_tests.cpp index 03befc5..532b6b1 100644 --- a/untests/meta_registry_tests.cpp +++ b/untests/meta_registry_tests.cpp @@ -68,15 +68,6 @@ TEST_CASE("meta/registry") { ) ); - SUBCASE("get_xxx_by_name") { - CHECK(registry.get_class_by_name("vmath::ivec2")); - CHECK(registry.get_field_by_name("vmath::ivec2::x")); - CHECK(registry.get_function_by_name("vmath::iadd2")); - CHECK(registry.get_method_by_name("vmath::ivec2::dot")); - CHECK(registry.get_namespace_by_name("vmath")); - CHECK(registry.get_variable_by_name("vmath::ivec2::zero")); - } - SUBCASE("class_template") { CHECK(registry.resolve()); @@ -160,6 +151,150 @@ TEST_CASE("meta/registry") { SUBCASE("variable_instance") { CHECK_FALSE(registry.resolve(&ivec3::zero)); } + + SUBCASE("resolve/class") { + ivec2 v2; + ivec3 v3; + + REQUIRE(registry.resolve()); + REQUIRE(registry.resolve(v2)); + REQUIRE(registry.resolve(std::as_const(v2))); + REQUIRE(registry.resolve(static_cast(v2))); + + REQUIRE(registry.resolve()); + REQUIRE(registry.resolve(v3)); + REQUIRE(registry.resolve(std::as_const(v3))); + REQUIRE(registry.resolve(static_cast(v3))); + + const meta::class_info v2_info = meta::class_("ivec2"); + const meta::class_info v3_info = meta::class_("ivec3"); + CHECK(v2_info.fid() != v3_info.fid()); + + CHECK(v2_info.fid() == registry.resolve()->get_class()->fid()); + CHECK(v2_info.fid() == registry.resolve(v2)->get_class()->fid()); + CHECK(v2_info.fid() == registry.resolve(std::as_const(v2))->get_class()->fid()); + CHECK(v2_info.fid() == registry.resolve(static_cast(v2))->get_class()->fid()); + + CHECK(v3_info.fid() == registry.resolve()->get_class()->fid()); + CHECK(v3_info.fid() == registry.resolve(v3)->get_class()->fid()); + CHECK(v3_info.fid() == registry.resolve(std::as_const(v3))->get_class()->fid()); + CHECK(v3_info.fid() == registry.resolve(static_cast(v3))->get_class()->fid()); + + { + REQUIRE(registry.get_class_by_name("vmath::ivec2")); + REQUIRE(registry.get_class_by_name("vmath::ivec3")); + + CHECK(v2_info.fid() == registry.get_class_by_name("vmath::ivec2")->fid()); + CHECK(v3_info.fid() == registry.get_class_by_name("vmath::ivec3")->fid()); + } + } + + SUBCASE("resolve/field") { + REQUIRE(registry.resolve<&ivec2::x>()); + REQUIRE(registry.resolve<&ivec2::y>()); + CHECK_FALSE(registry.resolve(&ivec2::x)); + CHECK_FALSE(registry.resolve(&ivec2::y)); + + REQUIRE(registry.resolve<&ivec3::x>()); + REQUIRE(registry.resolve<&ivec3::y>()); + CHECK_FALSE(registry.resolve(&ivec3::x)); + CHECK_FALSE(registry.resolve(&ivec3::y)); + + const meta::field_info v2_x_info = meta::field_<&ivec2::x>("x"); + const meta::field_info v2_y_info = meta::field_<&ivec2::y>("y"); + CHECK(v2_x_info.fid() != v2_y_info.fid()); + + const meta::field_info v3_x_info = meta::field_<&ivec3::x>("x"); + const meta::field_info v3_y_info = meta::field_<&ivec3::y>("y"); + CHECK(v3_x_info.fid() != v3_y_info.fid()); + + CHECK(v2_x_info.fid() != v3_x_info.fid()); + CHECK(v2_y_info.fid() != v3_y_info.fid()); + + CHECK(v2_x_info.fid() == registry.resolve<&ivec2::x>()->get_field()->fid()); + CHECK(v2_y_info.fid() == registry.resolve<&ivec2::y>()->get_field()->fid()); + + CHECK(v3_x_info.fid() == registry.resolve<&ivec3::x>()->get_field()->fid()); + CHECK(v3_y_info.fid() == registry.resolve<&ivec3::y>()->get_field()->fid()); + + { + REQUIRE(registry.get_field_by_name("vmath::ivec2::x")); + REQUIRE(registry.get_field_by_name("vmath::ivec2::y")); + REQUIRE(registry.get_field_by_name("vmath::ivec3::x")); + REQUIRE(registry.get_field_by_name("vmath::ivec3::y")); + + CHECK(v2_x_info.fid() == registry.get_field_by_name("vmath::ivec2::x")->fid()); + CHECK(v2_y_info.fid() == registry.get_field_by_name("vmath::ivec2::y")->fid()); + CHECK(v3_x_info.fid() == registry.get_field_by_name("vmath::ivec3::x")->fid()); + CHECK(v3_y_info.fid() == registry.get_field_by_name("vmath::ivec3::y")->fid()); + } + } + + SUBCASE("resolve/function") { + REQUIRE(registry.resolve<&iadd2>()); + REQUIRE(registry.resolve<&iadd3>()); + CHECK_FALSE(registry.resolve(&iadd2)); + CHECK_FALSE(registry.resolve(&iadd3)); + + const meta::function_info iadd2_info = meta::function_<&iadd2>("iadd2"); + const meta::function_info iadd3_info = meta::function_<&iadd3>("iadd3"); + CHECK(iadd2_info.fid() != iadd3_info.fid()); + + CHECK(iadd2_info.fid() == registry.resolve<&iadd2>()->get_function()->fid()); + CHECK(iadd3_info.fid() == registry.resolve<&iadd3>()->get_function()->fid()); + + { + REQUIRE(registry.get_function_by_name("vmath::iadd2")); + REQUIRE(registry.get_function_by_name("vmath::iadd3")); + + CHECK(iadd2_info.fid() == registry.get_function_by_name("vmath::iadd2")->fid()); + CHECK(iadd3_info.fid() == registry.get_function_by_name("vmath::iadd3")->fid()); + } + } + + SUBCASE("resolve/method") { + REQUIRE(registry.resolve<&ivec2::dot>()); + REQUIRE(registry.resolve<&ivec3::dot>()); + CHECK_FALSE(registry.resolve(&ivec2::dot)); + CHECK_FALSE(registry.resolve(&ivec3::dot)); + + const meta::method_info v2_dot_info = meta::method_<&ivec2::dot>("dot"); + const meta::method_info v3_dot_info = meta::method_<&ivec3::dot>("dot"); + CHECK(v2_dot_info.fid() != v3_dot_info.fid()); + + CHECK(v2_dot_info.fid() == registry.resolve<&ivec2::dot>()->get_method()->fid()); + CHECK(v3_dot_info.fid() == registry.resolve<&ivec3::dot>()->get_method()->fid()); + + { + REQUIRE(registry.get_method_by_name("vmath::ivec2::dot")); + REQUIRE(registry.get_method_by_name("vmath::ivec3::dot")); + + CHECK(v2_dot_info.fid() == registry.get_method_by_name("vmath::ivec2::dot")->fid()); + CHECK(v3_dot_info.fid() == registry.get_method_by_name("vmath::ivec3::dot")->fid()); + } + } + + SUBCASE("resolve/variable") { + REQUIRE(registry.resolve<&ivec2::zero>()); + REQUIRE(registry.resolve<&ivec3::zero>()); + CHECK_FALSE(registry.resolve(&ivec2::zero)); + CHECK_FALSE(registry.resolve(&ivec3::zero)); + + const meta::variable_info v2_zero_info = meta::variable_<&ivec2::zero>("zero"); + const meta::variable_info v3_zero_info = meta::variable_<&ivec3::zero>("zero"); + CHECK(v2_zero_info.fid() != v3_zero_info.fid()); + + CHECK(v2_zero_info.fid() == registry.resolve<&ivec2::zero>()->get_variable()->fid()); + CHECK(v3_zero_info.fid() == registry.resolve<&ivec3::zero>()->get_variable()->fid()); + + { + REQUIRE(registry.get_variable_by_name("vmath::ivec2::zero")); + REQUIRE(registry.get_variable_by_name("vmath::ivec3::zero")); + + CHECK(v2_zero_info.fid() == registry.get_variable_by_name("vmath::ivec2::zero")->fid()); + CHECK(v3_zero_info.fid() == registry.get_variable_by_name("vmath::ivec3::zero")->fid()); + } + } } TEST_CASE("meta/registry/merge") {