#define CATCH_CONFIG_MAIN #include #include #include "ki/pclass/TypeSystem.h" #include "ki/pclass/HashCalculator.h" using namespace ki; PCLASS(TestClassTypeA) { public: using PropertyClass::PropertyClass; }; PCLASS(TestClassTypeB) { public: using PropertyClass::PropertyClass; }; TEST_CASE("TypeSystem and Type definition", "[pclass]") { std::unique_ptr hash_calculator = ki::make_unique(); auto type_system = ki::make_unique(hash_calculator); SECTION("Define class") { const auto class_name = "class TestClassTypeA"; const auto class_hash = type_system->get_hash_calculator() .calculate_type_hash(class_name); auto &defined_class = type_system->define_class(class_name); REQUIRE(type_system->has_type(class_name)); REQUIRE(type_system->has_type(class_hash)); auto &retrieved_class_name = type_system->get_type(class_name); auto &retrieved_class_hash = type_system->get_type(class_hash); REQUIRE(&retrieved_class_name == &defined_class); REQUIRE(&retrieved_class_hash == &defined_class); } SECTION("Define derived class") { const auto base_class_name = "class TestClassTypeA"; auto &base_class = type_system->define_class(base_class_name); REQUIRE(type_system->has_type(base_class_name)); const auto derived_class_name = "class TestClassTypeB"; auto &derived_class = type_system->define_class(derived_class_name, base_class); REQUIRE(type_system->has_type(derived_class_name)); } SECTION("Define class with non-class ancestor") { try { // Attempt to define a type that inherits "int". type_system->define_class( "class TestClassTypeA", type_system->get_type("int") ); FAIL(); } catch (runtime_error &e) { SUCCEED(); } } SECTION("Get a type that does not exist by name") { try { auto &made_up_struct = type_system->get_type("struct MadeUp"); FAIL(); } catch (runtime_error &e) { SUCCEED(); } } SECTION("Get a type that does not exist by hash") { try { auto &made_up_struct = type_system->get_type(0xDEADA55); FAIL(); } catch (runtime_error &e) { SUCCEED(); } } SECTION("Define type with the same name") { try { const auto class_name = "class TestClassTypeA"; type_system->define_class(class_name); type_system->define_class(class_name); FAIL(); } catch (runtime_error &e) { SUCCEED(); } } SECTION("Define type with the same name") { try { const auto class_name = "class TestClassTypeA"; type_system->define_class(class_name); type_system->define_class(class_name); FAIL(); } catch (runtime_error &e) { SUCCEED(); } } SECTION("Define type with the same hash") { try { type_system->define_class("a"); type_system->define_class("a "); FAIL(); } catch (runtime_error &e) { SUCCEED(); } } } TEST_CASE("PropertyClass and PropertyList", "[pclass]") { // TODO: Test PropertyClass instances } TEST_CASE("Enums", "[pclass]") { // TODO: Test Enums }