diff --git a/src/class_diagram/generators/json/class_diagram_generator.cc b/src/class_diagram/generators/json/class_diagram_generator.cc index 22aae5ac..340065ee 100644 --- a/src/class_diagram/generators/json/class_diagram_generator.cc +++ b/src/class_diagram/generators/json/class_diagram_generator.cc @@ -76,6 +76,8 @@ void to_json(nlohmann::json &j, const class_method &c) j["is_move_assignment"] = c.is_move_assignment(); j["is_copy_assignment"] = c.is_copy_assignment(); j["is_operator"] = c.is_operator(); + j["template_parameters"] = c.template_params(); + j["display_name"] = c.display_name(); j["parameters"] = c.parameters(); } @@ -156,7 +158,10 @@ void generator::generate_top_level_elements(nlohmann::json &parent) const { for (const auto &p : model()) { if (auto *pkg = dynamic_cast(p.get()); pkg) { - if (!pkg->is_empty()) + if (!pkg->is_empty() && + !pkg->all_of([this](const common::model::element &e) { + return !model().should_include(e); + })) generate(*pkg, parent); } else if (auto *cls = dynamic_cast(p.get()); cls) { @@ -198,7 +203,10 @@ void generator::generate(const package &p, nlohmann::json &parent) const for (const auto &subpackage : p) { if (dynamic_cast(subpackage.get()) != nullptr) { const auto &sp = dynamic_cast(*subpackage); - if (!sp.is_empty()) { + if (!sp.is_empty() && + !sp.all_of([this](const common::model::element &e) { + return !model().should_include(e); + })) { if (config().generate_packages()) generate(sp, package_object); else @@ -282,6 +290,9 @@ void generator::generate_relationships( const class_ &c, nlohmann::json &parent) const { for (const auto &r : c.relationships()) { + if (!model().should_include(r)) + continue; + auto target_element = model().get(r.destination()); if (!target_element.has_value()) { LOG_DBG("Skipping {} relation from {} to {} due " @@ -310,6 +321,9 @@ void generator::generate_relationships( const enum_ &c, nlohmann::json &parent) const { for (const auto &r : c.relationships()) { + if (!model().should_include(r)) + continue; + auto target_element = model().get(r.destination()); if (!target_element.has_value()) { LOG_DBG("Skipping {} relation from {} to {} due " @@ -328,6 +342,9 @@ void generator::generate_relationships( const concept_ &c, nlohmann::json &parent) const { for (const auto &r : c.relationships()) { + if (!model().should_include(r)) + continue; + auto target_element = model().get(r.destination()); if (!target_element.has_value()) { LOG_DBG("Skipping {} relation from {} to {} due " diff --git a/src/class_diagram/generators/mermaid/class_diagram_generator.cc b/src/class_diagram/generators/mermaid/class_diagram_generator.cc index 416e0ae8..f5bbb17d 100644 --- a/src/class_diagram/generators/mermaid/class_diagram_generator.cc +++ b/src/class_diagram/generators/mermaid/class_diagram_generator.cc @@ -281,8 +281,7 @@ void generator::generate_member( void generator::generate(const concept_ &c, std::ostream &ostr) const { - ostr << indent(1) << "class" - << " " << c.alias(); + ostr << indent(1) << "class" << " " << c.alias(); ostr << " {" << '\n'; ostr << indent(2) << "<>\n"; diff --git a/src/class_diagram/model/class_method.cc b/src/class_diagram/model/class_method.cc index 9d2052ea..7daf4c47 100644 --- a/src/class_diagram/model/class_method.cc +++ b/src/class_diagram/model/class_method.cc @@ -26,6 +26,26 @@ class_method::class_method(common::model::access_t access, { } +void class_method::update(const common::model::namespace_ &un) +{ + if (template_params().empty()) { + set_display_name(name()); + } + else { + std::stringstream template_params_str; + render_template_params(template_params_str, un, true); + set_display_name( + fmt::format("{}{}", name(), template_params_str.str())); + } +} + +std::string class_method::display_name() const { return display_name_; } + +void class_method::set_display_name(const std::string &display_name) +{ + display_name_ = display_name; +} + bool class_method::is_pure_virtual() const { return is_pure_virtual_; } void class_method::is_pure_virtual(bool is_pure_virtual) diff --git a/src/class_diagram/model/class_method.h b/src/class_diagram/model/class_method.h index 4cf4344b..da8fe5fa 100644 --- a/src/class_diagram/model/class_method.h +++ b/src/class_diagram/model/class_method.h @@ -46,6 +46,17 @@ public: ~class_method() override = default; + void update(const common::model::namespace_& un); + + /** + * @brief Method name including template parameters/arguments if any + * + * @return String representation of the methods display name + */ + std::string display_name() const; + + void set_display_name(const std::string &display_name); + /** * @brief Whether the method is pure virtual. * @@ -282,5 +293,7 @@ private: bool is_move_assignment_{false}; bool is_copy_assignment_{false}; bool is_operator_{false}; + + std::string display_name_; }; } // namespace clanguml::class_diagram::model diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index fef69cd3..6b05d751 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -1187,7 +1187,8 @@ void translation_unit_visitor::process_method( } class_method method{common::access_specifier_to_access_t(mf.getAccess()), - util::trim(method_name), method_return_type}; + util::trim(method_name), + config().simplify_template_type(method_return_type)}; process_method_properties(mf, c, method_name, method); @@ -1266,6 +1267,8 @@ void translation_unit_visitor::process_method( process_function_parameter_find_relationships_in_autotype(c, atsp); } + method.update(config().using_namespace()); + if (diagram().should_include(method)) { LOG_DBG("Adding method: {}", method.name()); @@ -1390,6 +1393,8 @@ void translation_unit_visitor::process_template_method( process_function_parameter(*param, method, c); } + method.update(config().using_namespace()); + if (diagram().should_include(method)) { LOG_DBG("Adding method: {}", method.name()); @@ -1678,7 +1683,9 @@ void translation_unit_visitor::process_static_field( class_member field{ common::access_specifier_to_access_t(field_declaration.getAccess()), - field_declaration.getNameAsString(), type_name}; + field_declaration.getNameAsString(), + config().simplify_template_type(type_name)}; + field.is_static(true); process_comment(field_declaration, field); @@ -1769,7 +1776,7 @@ void translation_unit_visitor::process_field( class_member field{ common::access_specifier_to_access_t(field_declaration.getAccess()), - field_name, field_type_str}; + field_name, config().simplify_template_type(field_type_str)}; // Parse the field comment process_comment(field_declaration, field); diff --git a/src/common/model/diagram.cc b/src/common/model/diagram.cc index b551792d..39168e27 100644 --- a/src/common/model/diagram.cc +++ b/src/common/model/diagram.cc @@ -78,6 +78,11 @@ bool diagram::should_include(const namespace_ &ns) const return filter_->should_include(ns); } +bool diagram::should_include(relationship r) const +{ + return should_include(r.type()); +} + bool diagram::should_include(const relationship_t r) const { if (filter_.get() == nullptr) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index dec53b5c..3ce15f5f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -102,7 +102,7 @@ foreach(TEST_NAME ${TEST_NAMES}) target_sources(${TEST_NAME} PUBLIC FILE_SET CXX_MODULES FILES ${TEST_CASE_MODULE_SOURCES}) endif(ENABLE_CXX_MODULES_TEST_CASES) - target_sources(${TEST_NAME} PUBLIC ${TEST_NAME}.cc test_cases_checks.h + target_sources(${TEST_NAME} PUBLIC ${TEST_NAME}.cc ${TEST_CASE_SOURCES} catch.h) else() target_sources(${TEST_NAME} PUBLIC ${TEST_NAME}.cc catch.h) diff --git a/tests/t00028/test_case.h b/tests/t00028/test_case.h index 3598f279..6a1980ad 100644 --- a/tests/t00028/test_case.h +++ b/tests/t00028/test_case.h @@ -30,31 +30,39 @@ TEST_CASE("t00028") REQUIRE(model->name() == "t00028_class"); - CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { - REQUIRE(IsClass(src, "A")); - REQUIRE(IsClass(src, "B")); - REQUIRE(IsClass(src, "C")); - REQUIRE(IsClass(src, "D")); - REQUIRE(IsClassTemplate(src, "E")); - REQUIRE(IsEnum(src, "F")); - REQUIRE(IsClass(src, "R")); - REQUIRE(HasNote(src, "A", "top", "A class note.")); - REQUIRE(HasNote(src, "B", "left", "B class note.")); - REQUIRE(HasNote(src, "C", "bottom", "C class note.")); - const auto d_note = R"( + CHECK_CLASS_DIAGRAM( + config, diagram, *model, + [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, "D")); + REQUIRE(IsClassTemplate(src, "E")); + REQUIRE(IsEnum(src, "F")); + REQUIRE(IsClass(src, "R")); + REQUIRE(HasNote(src, "A", "top", "A class note.")); + REQUIRE(HasNote(src, "B", "left", "B class note.")); + REQUIRE(HasNote(src, "C", "bottom", "C class note.")); + const auto d_note = R"( D class note.)"; - REQUIRE(HasNote(src, "D", "left", d_note)); - REQUIRE(HasNote(src, "E", "left", "E template class note.")); - REQUIRE(HasNote(src, "F", "bottom", "F enum note.")); - REQUIRE(!HasNote(src, "G", "left", "G class note.")); - REQUIRE(HasNote(src, "R", "right", "R class note.")); - REQUIRE(HasMemberNote( - src, "R", "aaa", "left", "R contains an instance of A.")); - REQUIRE(!HasMemberNote(src, "R", "bbb", "right", "R class note.")); - REQUIRE(HasMemberNote(src, "R", "ccc", "left", "Reference to C.")); - }); + REQUIRE(HasNote(src, "D", "left", d_note)); + REQUIRE(HasNote(src, "E", "left", "E template class note.")); + REQUIRE(HasNote(src, "F", "bottom", "F enum note.")); + REQUIRE(HasNote(src, "R", "right", "R class note.")); + }, + [](const plantuml_t &src) { + REQUIRE(HasMemberNote(src, "R", "ccc", "left", "Reference to C.")); + REQUIRE(!HasMemberNote(src, "R", "bbb", "right", "R class note.")); + REQUIRE(HasMemberNote( + src, "R", "aaa", "left", "R contains an instance of A.")); + REQUIRE(!HasNote(src, "G", "left", "G class note.")); + }, + [](const mermaid_t &src) { + REQUIRE(HasNote(src, "R", "left", "R contains an instance of A.")); + REQUIRE(!HasNote(src, "G", "left", "G class note.")); + }); /* { auto src = generate_class_puml(diagram, *model); diff --git a/tests/t00031/test_case.h b/tests/t00031/test_case.h index d4ab8482..c0c7bb90 100644 --- a/tests/t00031/test_case.h +++ b/tests/t00031/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00031/test_case.cc + * tests/t00031/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00031", "[test-case][class]") +TEST_CASE("t00031") { + using namespace clanguml::test; + auto [config, db] = load_config("t00031"); auto diagram = config.diagrams["t00031_class"]; @@ -28,55 +30,20 @@ TEST_CASE("t00031", "[test-case][class]") REQUIRE(model->name() == "t00031_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsEnum(src, "B")); + REQUIRE(IsClass(src, "D")); + REQUIRE(IsClassTemplate(src, "C")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsEnum(_A("B"))); - REQUIRE_THAT(src, IsClassTemplate("C", "T")); - REQUIRE_THAT(src, IsClass(_A("D"))); - - REQUIRE_THAT(src, - IsAssociation( - _A("R"), _A("A"), "+aaa", "", "", "[#red,dashed,thickness=2]")); - REQUIRE_THAT(src, - IsComposition(_A("R"), _A("B"), "+bbb", "", "", - "[#green,dashed,thickness=4]")); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("B"))); - REQUIRE_THAT(src, - IsAggregation(_A("R"), _A("C"), "+ccc", "", "", - "[#blue,dotted,thickness=8]")); - REQUIRE_THAT(src, - IsAssociation(_A("R"), _A("D"), "+ddd", "", "", - "[#blue,plain,thickness=16]")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClassTemplate(j, "C")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsEnum; - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsEnum(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsAssociation( + src, "R", "A", "aaa", "", "", "[#red,dashed,thickness=2]")); + REQUIRE(IsComposition( + src, "R", "B", "bbb", "", "", "[#green,dashed,thickness=4]")); + REQUIRE(IsDependency(src, "R", "B")); + REQUIRE(IsAggregation( + src, "R", "C", "ccc", "", "", "[#blue,dotted,thickness=8]")); + REQUIRE(IsAssociation( + src, "R", "D", "ddd", "", "", "[#blue,plain,thickness=16]")); + }); } \ No newline at end of file diff --git a/tests/t00032/test_case.h b/tests/t00032/test_case.h index 09dad790..1277d186 100644 --- a/tests/t00032/test_case.h +++ b/tests/t00032/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00032/test_case.cc + * tests/t00032/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00032", "[test-case][class]") +TEST_CASE("t00032") { + using namespace clanguml::test; + auto [config, db] = load_config("t00032"); auto diagram = config.diagrams["t00032_class"]; @@ -28,83 +30,24 @@ TEST_CASE("t00032", "[test-case][class]") REQUIRE(model->name() == "t00032_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "Base")); + REQUIRE(IsClass(src, "TBase")); + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, "R")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClassTemplate(src, "Overload")); - REQUIRE_THAT(src, IsClass(_A("Base"))); - REQUIRE_THAT(src, IsClass(_A("TBase"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT(src, IsClassTemplate("Overload", "T,L,Ts...")); - - REQUIRE_THAT(src, IsBaseClass(_A("Base"), _A("Overload"))); - REQUIRE_THAT( - src, IsBaseClass(_A("TBase"), _A("Overload"))); - REQUIRE_THAT( - src, IsBaseClass(_A("A"), _A("Overload"))); - REQUIRE_THAT( - src, IsBaseClass(_A("B"), _A("Overload"))); - REQUIRE_THAT( - src, IsBaseClass(_A("C"), _A("Overload"))); - REQUIRE_THAT( - src, !IsDependency(_A("Overload"), _A("TBase"))); - REQUIRE_THAT( - src, !IsDependency(_A("Overload"), _A("A"))); - REQUIRE_THAT( - src, !IsDependency(_A("Overload"), _A("B"))); - REQUIRE_THAT( - src, !IsDependency(_A("Overload"), _A("C"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsBaseClass(j, "A", "Overload")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, IsClass(_A("Base"))); - REQUIRE_THAT(src, IsClass(_A("TBase"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT(src, IsClass(_A("Overload"))); - - REQUIRE_THAT(src, IsBaseClass(_A("Base"), _A("Overload"))); - REQUIRE_THAT( - src, IsBaseClass(_A("TBase"), _A("Overload"))); - REQUIRE_THAT( - src, IsBaseClass(_A("A"), _A("Overload"))); - REQUIRE_THAT( - src, IsBaseClass(_A("B"), _A("Overload"))); - REQUIRE_THAT( - src, IsBaseClass(_A("C"), _A("Overload"))); - REQUIRE_THAT( - src, !IsDependency(_A("Overload"), _A("TBase"))); - REQUIRE_THAT( - src, !IsDependency(_A("Overload"), _A("A"))); - REQUIRE_THAT( - src, !IsDependency(_A("Overload"), _A("B"))); - REQUIRE_THAT( - src, !IsDependency(_A("Overload"), _A("C"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsBaseClass(src, "Base", "Overload")); + REQUIRE(IsBaseClass(src, "TBase", "Overload")); + REQUIRE(IsBaseClass(src, "A", "Overload")); + REQUIRE(IsBaseClass(src, "B", "Overload")); + REQUIRE(IsBaseClass(src, "C", "Overload")); + REQUIRE(!IsDependency(src, "Overload", "TBase")); + REQUIRE(!IsDependency(src, "Overload", "A")); + REQUIRE(!IsDependency(src, "Overload", "B")); + REQUIRE(!IsDependency(src, "Overload", "C")); + }); } \ No newline at end of file diff --git a/tests/t00033/test_case.h b/tests/t00033/test_case.h index d5fdd3e7..40290923 100644 --- a/tests/t00033/test_case.h +++ b/tests/t00033/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00033/test_case.cc + * tests/t00033/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00033", "[test-case][class]") +TEST_CASE("t00033") { + using namespace clanguml::test; + auto [config, db] = load_config("t00033"); auto diagram = config.diagrams["t00033_class"]; @@ -28,70 +30,21 @@ TEST_CASE("t00033", "[test-case][class]") REQUIRE(model->name() == "t00033_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "B")); + REQUIRE(IsClassTemplate(src, "C")); + REQUIRE(IsClass(src, "D")); + REQUIRE(IsClass(src, "R")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, IsClassTemplate("A", "T")); - REQUIRE_THAT(src, IsClassTemplate("B", "T")); - REQUIRE_THAT(src, IsClassTemplate("C", "T")); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT(src, - IsDependency(_A("A>>>"), - _A("B>>"))); - REQUIRE_THAT( - src, IsDependency(_A("B>>"), _A("C"))); - REQUIRE_THAT(src, IsDependency(_A("C"), _A("D"))); - - REQUIRE_THAT(src, IsInstantiation(_A("C"), _A("C"), "up")); - REQUIRE_THAT(src, - IsInstantiation(_A("B"), _A("B>>"), "up")); - REQUIRE_THAT(src, - IsInstantiation( - _A("A"), _A("A>>>"), "up")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A>>>")); REQUIRE(IsDependency( - j, "A>>>", "B>>")); + src, "A>>>", "B>>")); + REQUIRE(IsDependency(src, "B>>", "C")); + REQUIRE(IsDependency(src, "C", "D")); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT(src, - IsDependency(_A("A>>>"), - _A("B>>"))); - REQUIRE_THAT( - src, IsDependency(_A("B>>"), _A("C"))); - REQUIRE_THAT(src, IsDependency(_A("C"), _A("D"))); - - REQUIRE_THAT(src, IsInstantiation(_A("C"), _A("C"))); - REQUIRE_THAT( - src, IsInstantiation(_A("B"), _A("B>>"))); - REQUIRE_THAT(src, - IsInstantiation(_A("A"), _A("A>>>"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsInstantiation(src, "C", "C", "up")); + REQUIRE(IsInstantiation(src, "B", "B>>", "up")); + REQUIRE( + IsInstantiation(src, "A", "A>>>", "up")); + }); } \ No newline at end of file diff --git a/tests/t00034/test_case.h b/tests/t00034/test_case.h index 8a6858f7..6a65ac59 100644 --- a/tests/t00034/test_case.h +++ b/tests/t00034/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00034/test_case.cc + * tests/t00034/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00034", "[test-case][class]") +TEST_CASE("t00034") { + using namespace clanguml::test; + auto [config, db] = load_config("t00034"); auto diagram = config.diagrams["t00034_class"]; @@ -28,52 +30,14 @@ TEST_CASE("t00034", "[test-case][class]") REQUIRE(model->name() == "t00034_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClassTemplate(src, "lift_void")); + REQUIRE(IsClassTemplate(src, "drop_void")); + REQUIRE(IsClass(src, "Void")); + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "R")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, IsClassTemplate("lift_void", "T")); - REQUIRE_THAT(src, IsClassTemplate("drop_void", "T")); - REQUIRE_THAT(src, IsClass(_A("Void"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT( - src, IsInstantiation(_A("lift_void"), _A("lift_void"))); - REQUIRE_THAT( - src, IsInstantiation(_A("drop_void"), _A("drop_void"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClassTemplate(j, "lift_void")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, IsClass(_A("lift_void"))); - REQUIRE_THAT(src, IsClass(_A("drop_void"))); - REQUIRE_THAT(src, IsClass(_A("Void"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT( - src, IsInstantiation(_A("lift_void"), _A("lift_void"))); - REQUIRE_THAT( - src, IsInstantiation(_A("drop_void"), _A("drop_void"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsInstantiation(src, "lift_void", "lift_void")); + REQUIRE(IsInstantiation(src, "drop_void", "drop_void")); + }); } \ No newline at end of file diff --git a/tests/t00035/test_case.h b/tests/t00035/test_case.h index 51018e78..95b0d2bf 100644 --- a/tests/t00035/test_case.h +++ b/tests/t00035/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00035/test_case.cc + * tests/t00035/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00035", "[test-case][class]") +TEST_CASE("t00035") { + using namespace clanguml::test; + auto [config, db] = load_config("t00035"); auto diagram = config.diagrams["t00035_class"]; @@ -28,50 +30,16 @@ TEST_CASE("t00035", "[test-case][class]") REQUIRE(model->name() == "t00035_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "Top")); + REQUIRE(IsClass(src, "Bottom")); + REQUIRE(IsClass(src, "Center")); + REQUIRE(IsClass(src, "Left")); + REQUIRE(IsClass(src, "Right")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, IsClass(_A("Top"))); - REQUIRE_THAT(src, IsClass(_A("Bottom"))); - REQUIRE_THAT(src, IsClass(_A("Center"))); - REQUIRE_THAT(src, IsClass(_A("Left"))); - REQUIRE_THAT(src, IsClass(_A("Right"))); - - REQUIRE_THAT(src, IsLayoutHint(_A("Center"), "up", _A("Top"))); - REQUIRE_THAT(src, IsLayoutHint(_A("Center"), "left", _A("Left"))); - REQUIRE_THAT(src, IsLayoutHint(_A("Center"), "right", _A("Right"))); - REQUIRE_THAT(src, IsLayoutHint(_A("Center"), "down", _A("Bottom"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "Top")); - REQUIRE(IsClass(j, "Bottom")); - REQUIRE(IsClass(j, "Center")); - REQUIRE(IsClass(j, "Left")); - REQUIRE(IsClass(j, "Right")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, IsClass(_A("Top"))); - REQUIRE_THAT(src, IsClass(_A("Bottom"))); - REQUIRE_THAT(src, IsClass(_A("Center"))); - REQUIRE_THAT(src, IsClass(_A("Left"))); - REQUIRE_THAT(src, IsClass(_A("Right"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsLayoutHint(src, "Center", "up", "Top")); + REQUIRE(IsLayoutHint(src, "Center", "left", "Left")); + REQUIRE(IsLayoutHint(src, "Center", "right", "Right")); + REQUIRE(IsLayoutHint(src, "Center", "down", "Bottom")); + }); } \ No newline at end of file diff --git a/tests/t00036/test_case.h b/tests/t00036/test_case.h index 12c58572..16c5fe68 100644 --- a/tests/t00036/test_case.h +++ b/tests/t00036/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t00036", "[test-case][class]") +TEST_CASE("t00036") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t00036"); auto diagram = config.diagrams["t00036_class"]; @@ -29,66 +32,23 @@ TEST_CASE("t00036", "[test-case][class]") REQUIRE(model->name() == "t00036_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClassTemplate(src, {"ns1::ns11", "A"})); + REQUIRE(IsClassTemplate(src, {"ns1::ns11", "A"})); + REQUIRE(IsClass(src, {"ns1::ns11::ns111", "B"})); + REQUIRE(IsClass(src, {"ns2::ns22", "C"})); + REQUIRE(IsEnum(src, {"ns1", "E"})); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(!IsClass(src, "DImpl")); - REQUIRE_THAT(src, IsClassTemplate("A", "T")); - REQUIRE_THAT(src, IsClassTemplate("A", "int")); - REQUIRE_THAT(src, IsEnum(_A("E"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, !IsClass(_A("DImpl"))); - REQUIRE_THAT(src, IsPackage("ns111")); - REQUIRE_THAT(src, IsPackage("ns22")); - REQUIRE_THAT(src, !IsPackage("ns3")); - REQUIRE_THAT(src, !IsPackage("ns33")); + REQUIRE(IsNamespacePackage(src, "ns1"s)); + REQUIRE(IsNamespacePackage(src, "ns1"s, "ns11"s)); + REQUIRE(IsNamespacePackage(src, "ns1"s, "ns11"s, "ns111"s)); + REQUIRE(IsNamespacePackage(src, "ns2"s)); + REQUIRE(IsNamespacePackage(src, "ns2"s, "ns22"s)); - REQUIRE_THAT(src, IsAggregation(_A("B"), _A("A"), "+a_int")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - using namespace std::string_literals; - - REQUIRE(IsClass(j, "ns1::ns11::A")); - REQUIRE(IsClass(j, "ns1::ns11::A")); - REQUIRE(IsClass(j, "ns1::ns11::ns111::B")); - REQUIRE(IsClass(j, "ns2::ns22::C")); - REQUIRE(IsEnum(j, "ns1::E")); - REQUIRE(IsNamespacePackage(j, "ns1"s)); - REQUIRE(IsNamespacePackage(j, "ns1"s, "ns11"s)); - REQUIRE(IsNamespacePackage(j, "ns1"s, "ns11"s, "ns111"s)); - REQUIRE(IsNamespacePackage(j, "ns2"s)); - REQUIRE(IsNamespacePackage(j, "ns2"s, "ns22"s)); - REQUIRE(IsNamespacePackage(j, "ns3"s)); - REQUIRE(IsNamespacePackage(j, "ns3"s, "ns33"s)); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsEnum; - - REQUIRE_THAT(src, IsClass(_A("ns1::ns11::A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns11::A"))); - REQUIRE_THAT(src, IsEnum(_A("ns1::E"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns11::ns111::B"))); - REQUIRE_THAT(src, IsClass(_A("ns2::ns22::C"))); - REQUIRE_THAT(src, !IsClass(_A("DImpl"))); - - REQUIRE_THAT(src, - IsAggregation( - _A("ns1::ns11::ns111::B"), _A("ns1::ns11::A"), "+a_int")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(!IsNamespacePackage(src, "ns3"s)); + REQUIRE(!IsNamespacePackage(src, "ns33"s)); + REQUIRE(!IsNamespacePackage(src, "ns3"s, "ns33"s)); + }); } \ No newline at end of file diff --git a/tests/t00037/test_case.h b/tests/t00037/test_case.h index e5e62d0f..6ad47529 100644 --- a/tests/t00037/test_case.h +++ b/tests/t00037/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00037/test_case.cc + * tests/t00037/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00037", "[test-case][class]") +TEST_CASE("t00037") { + using namespace clanguml::test; + auto [config, db] = load_config("t00037"); auto diagram = config.diagrams["t00037_class"]; @@ -29,49 +31,14 @@ TEST_CASE("t00037", "[test-case][class]") REQUIRE(model->name() == "t00037_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "ST")); + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "ST::(units)")); + REQUIRE(IsClass(src, "ST::(dimensions)")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, IsClass(_A("ST"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("ST::(units)"))); - REQUIRE_THAT(src, IsClass(_A("ST::(dimensions)"))); - REQUIRE_THAT(src, - IsAggregation(_A("ST"), _A("ST::(dimensions)"), "+dimensions")); - REQUIRE_THAT(src, IsAggregation(_A("ST"), _A("ST::(units)"), "-units")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "ST")); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "ST::(units)")); - REQUIRE(IsClass(j, "ST::(dimensions)")); - REQUIRE(IsAggregation(j, "ST", "ST::(dimensions)", "dimensions")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, IsClass(_A("ST"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("ST::(units)"))); - REQUIRE_THAT(src, IsClass(_A("ST::(dimensions)"))); - REQUIRE_THAT(src, - IsAggregation(_A("ST"), _A("ST::(dimensions)"), "+dimensions")); - REQUIRE_THAT(src, IsAggregation(_A("ST"), _A("ST::(units)"), "-units")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE( + IsAggregation(src, "ST", "ST::(dimensions)", "dimensions")); + REQUIRE(IsAggregation(src, "ST", "ST::(units)", "units")); + }); } \ No newline at end of file diff --git a/tests/t00038/test_case.h b/tests/t00038/test_case.h index 38363ddc..5b16987d 100644 --- a/tests/t00038/test_case.h +++ b/tests/t00038/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00038/test_case.cc + * tests/t00038/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00038", "[test-case][class]") +TEST_CASE("t00038") { + using namespace clanguml::test; + auto [config, db] = load_config("t00038"); auto diagram = config.diagrams["t00038_class"]; @@ -29,152 +31,56 @@ TEST_CASE("t00038", "[test-case][class]") REQUIRE(model->name() == "t00038_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, "thirdparty::ns1::E")); + REQUIRE(IsClass(src, "key_t")); + REQUIRE(IsClassTemplate(src, "map")); + REQUIRE(IsClassTemplate(src, + "map>")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClassTemplate(src, + "map>>")); + REQUIRE(IsClassTemplate(src, + "map>>>")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("thirdparty::ns1::E"))); - REQUIRE_THAT(src, IsClass(_A("key_t"))); - REQUIRE_THAT(src, IsClassTemplate("map", "T")); - REQUIRE_THAT(src, - IsClassTemplate("map", - "std::integral_constant")); - REQUIRE_THAT(src, - IsClassTemplate("map", - "std::vector>")); - REQUIRE_THAT(src, - IsClassTemplate("map", - "std::map>>")); + REQUIRE(IsEnum(src, "property_t")); - REQUIRE_THAT(src, IsEnum(_A("property_t"))); + REQUIRE(IsInstantiation(src, "map", + "map>>>")); - REQUIRE_THAT(src, - IsInstantiation(_A("map"), - _A("map>>>"))); + REQUIRE(IsDependency(src, + "map>", + "property_t")); - REQUIRE_THAT(src, - IsDependency(_A("map>"), - _A("property_t"))); + REQUIRE(IsDependency(src, + "map<" + "std::vector>>", + "property_t")); - REQUIRE_THAT(src, - IsDependency(_A("map<" - "std::vector>>"), - _A("property_t"))); + REQUIRE(IsDependency(src, + "map>>>", + "property_t")); - REQUIRE_THAT(src, - IsDependency( - _A("map>>>"), - _A("property_t"))); + REQUIRE(IsDependency(src, + "map>>>", + "key_t")); - REQUIRE_THAT(src, - IsDependency( - _A("map>>>"), - _A("key_t"))); + REQUIRE(IsDependency(src, + "map>", + "thirdparty::ns1::color_t")); - REQUIRE_THAT(src, - IsDependency( - _A("map>"), - _A("thirdparty::ns1::color_t"))); - - REQUIRE_THAT(src, - IsBaseClass(_A("thirdparty::ns1::E"), - _A("map>"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B")); - REQUIRE(IsClass(j, "C")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsEnum; - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("thirdparty::ns1::E"))); - REQUIRE_THAT(src, IsClass(_A("key_t"))); - REQUIRE_THAT(src, IsClass(_A("map"))); - REQUIRE_THAT(src, - IsClass(_A("map>"))); - REQUIRE_THAT(src, - IsClass(_A( - "map>>"))); - REQUIRE_THAT(src, - IsClass(_A("map>>>"))); - - REQUIRE_THAT(src, IsEnum(_A("property_t"))); - - REQUIRE_THAT(src, - IsInstantiation(_A("map"), - _A("map>>>"))); - - REQUIRE_THAT(src, - IsDependency(_A("map>"), - _A("property_t"))); - - REQUIRE_THAT(src, - IsDependency(_A("map<" - "std::vector>>"), - _A("property_t"))); - - REQUIRE_THAT(src, - IsDependency( - _A("map>>>"), - _A("property_t"))); - - REQUIRE_THAT(src, - IsDependency( - _A("map>>>"), - _A("key_t"))); - - REQUIRE_THAT(src, - IsDependency( - _A("map>"), - _A("thirdparty::ns1::color_t"))); - - REQUIRE_THAT(src, - IsBaseClass(_A("thirdparty::ns1::E"), - _A("map>"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsBaseClass(src, "thirdparty::ns1::E", + "map>")); + }); } \ No newline at end of file diff --git a/tests/t00039/test_case.h b/tests/t00039/test_case.h index 9e4c562b..36788d3f 100644 --- a/tests/t00039/test_case.h +++ b/tests/t00039/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00039/test_case.cc + * tests/t00039/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00039", "[test-case][class]") +TEST_CASE("t00039") { + using namespace clanguml::test; + auto [config, db] = load_config("t00039"); auto diagram = config.diagrams["t00039_class"]; @@ -28,96 +30,33 @@ TEST_CASE("t00039", "[test-case][class]") REQUIRE(model->name() == "t00039_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "AA")); + REQUIRE(IsClass(src, "AAA")); + REQUIRE(IsClass(src, "ns2::AAAA")); + REQUIRE(IsBaseClass(src, "A", "AA")); + REQUIRE(IsBaseClass(src, "AA", "AAA")); + REQUIRE(IsBaseClass(src, "AAA", "ns2::AAAA")); + REQUIRE(!IsClass(src, "detail::AA")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(!IsClass(src, "B")); + REQUIRE(!IsClass(src, "ns1::BB")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); - REQUIRE_THAT(src, IsClass(_A("ns2::AAAA"))); - REQUIRE_THAT(src, IsBaseClass(_A("A"), _A("AA"))); - REQUIRE_THAT(src, IsBaseClass(_A("AA"), _A("AAA"))); - REQUIRE_THAT(src, IsBaseClass(_A("AAA"), _A("ns2::AAAA"))); - REQUIRE_THAT(src, !IsClass(_A("detail::AA"))); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, "D")); + REQUIRE(IsClass(src, "E")); + REQUIRE(IsBaseClass(src, "C", "CD")); + REQUIRE(IsBaseClass(src, "D", "CD")); + REQUIRE(IsBaseClass(src, "D", "DE")); + REQUIRE(IsBaseClass(src, "E", "DE")); + REQUIRE(IsBaseClass(src, "C", "CDE")); + REQUIRE(IsBaseClass(src, "D", "CDE")); + REQUIRE(IsBaseClass(src, "E", "CDE")); - REQUIRE_THAT(src, !IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("ns1::BB"))); - - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("E"))); - REQUIRE_THAT(src, IsBaseClass(_A("C"), _A("CD"))); - REQUIRE_THAT(src, IsBaseClass(_A("D"), _A("CD"))); - REQUIRE_THAT(src, IsBaseClass(_A("D"), _A("DE"))); - REQUIRE_THAT(src, IsBaseClass(_A("E"), _A("DE"))); - REQUIRE_THAT(src, IsBaseClass(_A("C"), _A("CDE"))); - REQUIRE_THAT(src, IsBaseClass(_A("D"), _A("CDE"))); - REQUIRE_THAT(src, IsBaseClass(_A("E"), _A("CDE"))); - - REQUIRE_THAT(src, IsClassTemplate("ns3::F", "T")); - REQUIRE_THAT(src, IsClassTemplate("ns3::FF", "T,M")); - REQUIRE_THAT(src, IsClassTemplate("ns3::FE", "T,M")); - REQUIRE_THAT(src, IsClassTemplate("ns3::FFF", "T,M,N")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "AA")); - REQUIRE(IsClass(j, "AAA")); - REQUIRE(IsBaseClass(j, "C", "CD")); - REQUIRE(IsBaseClass(j, "D", "CD")); - REQUIRE(IsBaseClass(j, "E", "DE")); - REQUIRE(IsBaseClass(j, "D", "DE")); - REQUIRE(IsBaseClass(j, "C", "CDE")); - REQUIRE(IsBaseClass(j, "D", "CDE")); - REQUIRE(IsBaseClass(j, "E", "CDE")); - - REQUIRE(IsClassTemplate(j, "ns3::F")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); - REQUIRE_THAT(src, IsClass(_A("ns2::AAAA"))); - REQUIRE_THAT(src, IsBaseClass(_A("A"), _A("AA"))); - REQUIRE_THAT(src, IsBaseClass(_A("AA"), _A("AAA"))); - REQUIRE_THAT(src, IsBaseClass(_A("AAA"), _A("ns2::AAAA"))); - REQUIRE_THAT(src, !IsClass(_A("detail::AA"))); - - REQUIRE_THAT(src, !IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("ns1::BB"))); - - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("E"))); - REQUIRE_THAT(src, IsBaseClass(_A("C"), _A("CD"))); - REQUIRE_THAT(src, IsBaseClass(_A("D"), _A("CD"))); - REQUIRE_THAT(src, IsBaseClass(_A("D"), _A("DE"))); - REQUIRE_THAT(src, IsBaseClass(_A("E"), _A("DE"))); - REQUIRE_THAT(src, IsBaseClass(_A("C"), _A("CDE"))); - REQUIRE_THAT(src, IsBaseClass(_A("D"), _A("CDE"))); - REQUIRE_THAT(src, IsBaseClass(_A("E"), _A("CDE"))); - - REQUIRE_THAT(src, IsClass(_A("ns3::F"))); - REQUIRE_THAT(src, IsClass(_A("ns3::FF"))); - REQUIRE_THAT(src, IsClass(_A("ns3::FE"))); - REQUIRE_THAT(src, IsClass(_A("ns3::FFF"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsClassTemplate(src, "ns3::F")); + REQUIRE(IsClassTemplate(src, "ns3::FF")); + REQUIRE(IsClassTemplate(src, "ns3::FE")); + REQUIRE(IsClassTemplate(src, "ns3::FFF")); + }); } diff --git a/tests/t00040/test_case.h b/tests/t00040/test_case.h index ec8b0181..8b21ef25 100644 --- a/tests/t00040/test_case.h +++ b/tests/t00040/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00040/test_case.cc + * tests/t00040/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00040", "[test-case][class]") +TEST_CASE("t00040") { + using namespace clanguml::test; + auto [config, db] = load_config("t00040"); auto diagram = config.diagrams["t00040_class"]; @@ -28,51 +30,14 @@ TEST_CASE("t00040", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00040_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); - REQUIRE_THAT(src, IsBaseClass(_A("A"), _A("AA"))); - REQUIRE_THAT(src, IsBaseClass(_A("AA"), _A("AAA"))); - - REQUIRE_THAT(src, !IsClass(_A("B"))); - - REQUIRE_THAT(src, !IsDependency(_A("R"), _A("A"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "AA")); - REQUIRE(IsClass(j, "AAA")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); - REQUIRE_THAT(src, IsBaseClass(_A("A"), _A("AA"))); - REQUIRE_THAT(src, IsBaseClass(_A("AA"), _A("AAA"))); - - REQUIRE_THAT(src, !IsClass(_A("B"))); - - REQUIRE_THAT(src, !IsDependency(_A("R"), _A("A"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "AA")); + REQUIRE(IsClass(src, "AAA")); + REQUIRE(IsBaseClass(src, "A", "AA")); + REQUIRE(IsBaseClass(src, "AA", "AAA")); + REQUIRE(!IsClass(src, "B")); + REQUIRE(!IsDependency(src, "R", "A")); + }); } \ No newline at end of file diff --git a/tests/t00041/test_case.h b/tests/t00041/test_case.h index 28fc90e3..5b262bdd 100644 --- a/tests/t00041/test_case.h +++ b/tests/t00041/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00041/test_case.cc + * tests/t00041/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00041", "[test-case][class]") +TEST_CASE("t00041") { + using namespace clanguml::test; + auto [config, db] = load_config("t00041"); auto diagram = config.diagrams["t00041_class"]; @@ -29,95 +31,34 @@ TEST_CASE("t00041", "[test-case][class]") REQUIRE(model->name() == "t00041_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(!IsClass(src, "A")); + REQUIRE(!IsClass(src, "AA")); + REQUIRE(!IsClass(src, "AAA")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(!IsClass(src, "B")); - REQUIRE_THAT(src, !IsClass(_A("A"))); - REQUIRE_THAT(src, !IsClass(_A("AA"))); - REQUIRE_THAT(src, !IsClass(_A("AAA"))); + REQUIRE(IsClass(src, "D")); + REQUIRE(IsClass(src, "E")); + REQUIRE(IsClass(src, "F")); + REQUIRE(IsClass(src, "R")); + REQUIRE(IsClass(src, "RR")); + REQUIRE(IsClass(src, "RRR")); + REQUIRE(!IsClass(src, "detail::G")); + REQUIRE(!IsClass(src, "H")); - REQUIRE_THAT(src, !IsClass(_A("B"))); + REQUIRE(IsBaseClass(src, "R", "RR")); + REQUIRE(IsBaseClass(src, "RR", "RRR")); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("E"))); - REQUIRE_THAT(src, IsClass(_A("F"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - REQUIRE_THAT(src, IsClass(_A("RR"))); - REQUIRE_THAT(src, IsClass(_A("RRR"))); - REQUIRE_THAT(src, !IsClass(_A("detail::G"))); - REQUIRE_THAT(src, !IsClass(_A("H"))); + REQUIRE(IsAssociation(src, "D", "RR", "rr")); + REQUIRE(IsAssociation(src, "RR", "E", "e")); + REQUIRE(IsAssociation(src, "RR", "F", "f")); + REQUIRE(!IsDependency(src, "RR", "H")); - REQUIRE_THAT(src, IsBaseClass(_A("R"), _A("RR"))); - REQUIRE_THAT(src, IsBaseClass(_A("RR"), _A("RRR"))); - - REQUIRE_THAT(src, IsAssociation(_A("D"), _A("RR"), "+rr")); - REQUIRE_THAT(src, IsAssociation(_A("RR"), _A("E"), "+e")); - REQUIRE_THAT(src, IsAssociation(_A("RR"), _A("F"), "+f")); - REQUIRE_THAT(src, !IsDependency(_A("RR"), _A("H"))); - - REQUIRE_THAT(src, IsClass(_A("ns1::N"))); - REQUIRE_THAT(src, IsClass(_A("ns1::NN"))); - REQUIRE_THAT(src, IsClass(_A("ns1::NM"))); - REQUIRE_THAT(src, IsBaseClass(_A("ns1::N"), _A("ns1::NN"))); - REQUIRE_THAT(src, IsBaseClass(_A("ns1::N"), _A("ns1::NM"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(!IsClass(j, "A")); - REQUIRE(!IsClass(j, "AA")); - REQUIRE(!IsClass(j, "AAA")); - REQUIRE(IsClass(j, "D")); - REQUIRE(IsClass(j, "E")); - REQUIRE(IsClass(j, "F")); - REQUIRE(IsClass(j, "R")); - - REQUIRE(IsAssociation(j, "D", "RR", "rr")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, !IsClass(_A("A"))); - REQUIRE_THAT(src, !IsClass(_A("AA"))); - REQUIRE_THAT(src, !IsClass(_A("AAA"))); - - REQUIRE_THAT(src, !IsClass(_A("B"))); - - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("E"))); - REQUIRE_THAT(src, IsClass(_A("F"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - REQUIRE_THAT(src, IsClass(_A("RR"))); - REQUIRE_THAT(src, IsClass(_A("RRR"))); - REQUIRE_THAT(src, !IsClass(_A("detail::G"))); - REQUIRE_THAT(src, !IsClass(_A("H"))); - - REQUIRE_THAT(src, IsBaseClass(_A("R"), _A("RR"))); - REQUIRE_THAT(src, IsBaseClass(_A("RR"), _A("RRR"))); - - REQUIRE_THAT(src, IsAssociation(_A("D"), _A("RR"), "+rr")); - REQUIRE_THAT(src, IsAssociation(_A("RR"), _A("E"), "+e")); - REQUIRE_THAT(src, IsAssociation(_A("RR"), _A("F"), "+f")); - REQUIRE_THAT(src, !IsDependency(_A("RR"), _A("H"))); - - REQUIRE_THAT(src, IsClass(_A("ns1::N"))); - REQUIRE_THAT(src, IsClass(_A("ns1::NN"))); - REQUIRE_THAT(src, IsClass(_A("ns1::NM"))); - REQUIRE_THAT(src, IsBaseClass(_A("ns1::N"), _A("ns1::NN"))); - REQUIRE_THAT(src, IsBaseClass(_A("ns1::N"), _A("ns1::NM"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsClass(src, {"ns1", "N"})); + REQUIRE(IsClass(src, {"ns1", "NN"})); + REQUIRE(IsClass(src, {"ns1", "NM"})); + REQUIRE(IsBaseClass(src, "ns1::N", "ns1::NN")); + REQUIRE(IsBaseClass(src, "ns1::N", "ns1::NM")); + }); } \ No newline at end of file diff --git a/tests/t00042/test_case.h b/tests/t00042/test_case.h index 795220eb..b3e11df5 100644 --- a/tests/t00042/test_case.h +++ b/tests/t00042/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00042/test_case.cc + * tests/t00042/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00042", "[test-case][class]") +TEST_CASE("t00042") { + using namespace clanguml::test; + auto [config, db] = load_config("t00042"); auto diagram = config.diagrams["t00042_class"]; @@ -29,38 +31,9 @@ TEST_CASE("t00042", "[test-case][class]") REQUIRE(model->name() == "t00042_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, IsClassTemplate("A", "T")); - REQUIRE_THAT(src, IsClassTemplate("B", "T,K")); - REQUIRE_THAT(src, !IsClassTemplate("C", "T")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClassTemplate(j, "A")); - REQUIRE(IsClassTemplate(j, "B")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("C"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "B")); + REQUIRE(!IsClassTemplate(src, "C")); + }); } \ No newline at end of file diff --git a/tests/t00043/test_case.h b/tests/t00043/test_case.h index abc539de..ce65f719 100644 --- a/tests/t00043/test_case.h +++ b/tests/t00043/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00043/test_case.cc + * tests/t00043/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00043", "[test-case][class]") +TEST_CASE("t00043") { + using namespace clanguml::test; + auto [config, db] = load_config("t00043"); auto diagram = config.diagrams["t00043_class"]; @@ -29,104 +31,31 @@ TEST_CASE("t00043", "[test-case][class]") REQUIRE(model->name() == "t00043_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, {"dependants", "A"})); + REQUIRE(IsClass(src, {"dependants", "B"})); + REQUIRE(IsClass(src, {"dependants", "C"})); + REQUIRE(IsClass(src, {"dependants", "D"})); + REQUIRE(IsClass(src, {"dependants", "BB"})); + REQUIRE(IsClass(src, {"dependants", "E"})); + REQUIRE(IsDependency(src, {"dependants", "B"}, {"dependants", "A"})); + REQUIRE(IsDependency(src, {"dependants", "BB"}, {"dependants", "A"})); + REQUIRE(IsDependency(src, {"dependants", "C"}, {"dependants", "B"})); + REQUIRE(IsDependency(src, {"dependants", "D"}, {"dependants", "C"})); + REQUIRE(IsDependency(src, {"dependants", "E"}, {"dependants", "D"})); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClass(src, {"dependencies", "G"})); + REQUIRE(IsClass(src, {"dependencies", "GG"})); + REQUIRE(IsClass(src, {"dependencies", "H"})); + REQUIRE(!IsClass(src, {"dependencies", "HH"})); - // Check dependants filter - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("BB"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("E"))); - REQUIRE_THAT(src, !IsClass(_A("F"))); - - REQUIRE_THAT(src, IsDependency(_A("B"), _A("A"))); - REQUIRE_THAT(src, IsDependency(_A("BB"), _A("A"))); - REQUIRE_THAT(src, IsDependency(_A("C"), _A("B"))); - REQUIRE_THAT(src, IsDependency(_A("D"), _A("C"))); - REQUIRE_THAT(src, IsDependency(_A("E"), _A("D"))); - - // Check dependencies filter - REQUIRE_THAT(src, IsClass(_A("G"))); - REQUIRE_THAT(src, IsClass(_A("GG"))); - REQUIRE_THAT(src, IsClass(_A("H"))); - REQUIRE_THAT(src, !IsClass(_A("HH"))); - REQUIRE_THAT(src, IsClass(_A("I"))); - REQUIRE_THAT(src, IsClass(_A("J"))); - - REQUIRE_THAT(src, IsDependency(_A("H"), _A("G"))); - REQUIRE_THAT(src, IsDependency(_A("H"), _A("GG"))); - REQUIRE_THAT(src, IsDependency(_A("I"), _A("H"))); - REQUIRE_THAT(src, IsDependency(_A("J"), _A("I"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "dependants::A")); - REQUIRE(IsClass(j, "dependants::B")); - REQUIRE(IsClass(j, "dependants::C")); - REQUIRE(IsClass(j, "dependants::D")); - REQUIRE(IsClass(j, "dependants::BB")); - REQUIRE(IsClass(j, "dependants::E")); - REQUIRE(IsDependency(j, "dependants::B", "dependants::A")); - - REQUIRE(IsClass(j, "dependencies::G")); - REQUIRE(IsClass(j, "dependencies::GG")); - REQUIRE(IsClass(j, "dependencies::H")); - REQUIRE(IsDependency(j, "dependencies::J", "dependencies::I")); - REQUIRE(IsDependency(j, "dependencies::H", "dependencies::G")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - // Check dependants filter - REQUIRE_THAT(src, IsClass(_A("dependants::A"))); - REQUIRE_THAT(src, IsClass(_A("dependants::B"))); - REQUIRE_THAT(src, IsClass(_A("dependants::BB"))); - REQUIRE_THAT(src, IsClass(_A("dependants::D"))); - REQUIRE_THAT(src, IsClass(_A("dependants::E"))); - REQUIRE_THAT(src, !IsClass(_A("dependants::F"))); - - REQUIRE_THAT( - src, IsDependency(_A("dependants::B"), _A("dependants::A"))); - REQUIRE_THAT( - src, IsDependency(_A("dependants::BB"), _A("dependants::A"))); - REQUIRE_THAT( - src, IsDependency(_A("dependants::C"), _A("dependants::B"))); - REQUIRE_THAT( - src, IsDependency(_A("dependants::D"), _A("dependants::C"))); - REQUIRE_THAT( - src, IsDependency(_A("dependants::E"), _A("dependants::D"))); - - // Check dependencies filter - REQUIRE_THAT(src, IsClass(_A("dependencies::G"))); - REQUIRE_THAT(src, IsClass(_A("dependencies::GG"))); - REQUIRE_THAT(src, IsClass(_A("dependencies::H"))); - REQUIRE_THAT(src, !IsClass(_A("dependencies::HH"))); - REQUIRE_THAT(src, IsClass(_A("dependencies::I"))); - REQUIRE_THAT(src, IsClass(_A("dependencies::J"))); - - REQUIRE_THAT( - src, IsDependency(_A("dependencies::H"), _A("dependencies::G"))); - REQUIRE_THAT( - src, IsDependency(_A("dependencies::H"), _A("dependencies::GG"))); - REQUIRE_THAT( - src, IsDependency(_A("dependencies::I"), _A("dependencies::H"))); - REQUIRE_THAT( - src, IsDependency(_A("dependencies::J"), _A("dependencies::I"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE( + IsDependency(src, {"dependencies", "J"}, {"dependencies", "I"})); + REQUIRE( + IsDependency(src, {"dependencies", "H"}, {"dependencies", "G"})); + REQUIRE( + IsDependency(src, {"dependencies", "I"}, {"dependencies", "H"})); + REQUIRE( + IsDependency(src, {"dependencies", "H"}, {"dependencies", "GG"})); + }); } \ No newline at end of file diff --git a/tests/t00044/test_case.h b/tests/t00044/test_case.h index 3f04d11d..18955892 100644 --- a/tests/t00044/test_case.h +++ b/tests/t00044/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00044/test_case.cc + * tests/t00044/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00044", "[test-case][class]") +TEST_CASE("t00044") { + using namespace clanguml::test; + auto [config, db] = load_config("t00044"); auto diagram = config.diagrams["t00044_class"]; @@ -29,90 +31,28 @@ TEST_CASE("t00044", "[test-case][class]") REQUIRE(model->name() == "t00044_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(!src.contains("type-parameter-")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClassTemplate(src, "sink")); + REQUIRE(IsClassTemplate(src, "signal_handler")); - REQUIRE_THAT(src, !Contains("type-parameter-")); + REQUIRE(IsClassTemplate(src, "signal_handler")); + REQUIRE(IsClassTemplate(src, "signal_handler")); - REQUIRE_THAT(src, IsClassTemplate("sink", "T")); - REQUIRE_THAT(src, IsClassTemplate("signal_handler", "T,A")); + REQUIRE(IsClassTemplate(src, "sink>")); - REQUIRE_THAT(src, IsClassTemplate("signal_handler", "Ret(Args...),A")); - REQUIRE_THAT(src, IsClassTemplate("signal_handler", "void(int),bool")); + REQUIRE(IsInstantiation( + src, "sink", "sink>")); - REQUIRE_THAT( - src, IsClassTemplate("sink", "signal_handler")); + REQUIRE(IsInstantiation(src, "sink>", + "sink>")); - REQUIRE_THAT(src, - IsInstantiation( - _A("sink"), _A("sink>"))); + REQUIRE(IsClassTemplate(src, "signal_handler")); + REQUIRE(IsInstantiation( + src, "signal_handler", "signal_handler")); - REQUIRE_THAT(src, - IsInstantiation(_A("sink>"), - _A("sink>"))); - - REQUIRE_THAT(src, IsClassTemplate("signal_handler", "T,A")); - REQUIRE_THAT(src, - IsInstantiation(_A("signal_handler"), - _A("signal_handler"))); - - REQUIRE_THAT(src, - IsInstantiation(_A("signal_handler"), - _A("signal_handler"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClassTemplate(j, "sink")); - REQUIRE(IsClassTemplate(j, "signal_handler")); - REQUIRE(IsClassTemplate(j, "signal_handler")); - REQUIRE(IsStruct(j, "signal_handler")); - REQUIRE(IsClassTemplate(j, "signal_handler")); - REQUIRE(IsClassTemplate(j, "sink>")); - REQUIRE(IsStruct(j, "R")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - REQUIRE_THAT(src, !Contains("type-parameter-")); - - REQUIRE_THAT(src, IsClass(_A("sink"))); - REQUIRE_THAT(src, IsClass(_A("signal_handler"))); - - REQUIRE_THAT(src, IsClass(_A("signal_handler"))); - REQUIRE_THAT(src, IsClass(_A("signal_handler"))); - - REQUIRE_THAT(src, IsClass(_A("sink>"))); - - REQUIRE_THAT(src, - IsInstantiation( - _A("sink"), _A("sink>"))); - - REQUIRE_THAT(src, - IsInstantiation(_A("sink>"), - _A("sink>"))); - - REQUIRE_THAT(src, IsClass(_A("signal_handler"))); - REQUIRE_THAT(src, - IsInstantiation(_A("signal_handler"), - _A("signal_handler"))); - - REQUIRE_THAT(src, - IsInstantiation(_A("signal_handler"), - _A("signal_handler"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsInstantiation(src, "signal_handler", + "signal_handler")); + }); } \ No newline at end of file diff --git a/tests/t00045/test_case.h b/tests/t00045/test_case.h index 604308b4..a70c4da9 100644 --- a/tests/t00045/test_case.h +++ b/tests/t00045/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00045", "[test-case][class]") +TEST_CASE("t00045") { + using namespace clanguml::test; + auto [config, db] = load_config("t00045"); auto diagram = config.diagrams["t00045_class"]; @@ -28,97 +30,33 @@ TEST_CASE("t00045", "[test-case][class]") REQUIRE(model->name() == "t00045_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, {"ns1", "A"})); + REQUIRE(IsClass(src, {"ns1::ns2", "A"})); + REQUIRE(IsClass(src, {"ns1::ns2", "B"})); + REQUIRE(IsClass(src, {"ns1::ns2", "C"})); + REQUIRE(IsClass(src, {"ns1::ns2", "D"})); + REQUIRE(IsClass(src, {"ns1::ns2", "E"})); + REQUIRE(IsClass(src, {"ns1::ns2", "R"})); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::B"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::C"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::D"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::E"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::R"))); + REQUIRE(IsBaseClass(src, {"ns1::ns2", "A"}, {"ns1::ns2", "B"})); + REQUIRE(IsBaseClass(src, {"ns1", "A"}, {"ns1::ns2", "C"})); + REQUIRE(IsBaseClass(src, {"ns1::ns2", "A"}, {"ns1::ns2", "D"})); + REQUIRE(IsBaseClass(src, "A", {"ns1::ns2", "E"})); - REQUIRE_THAT(src, IsBaseClass(_A("ns1::ns2::A"), _A("ns1::ns2::B"))); - REQUIRE_THAT(src, IsBaseClass(_A("ns1::A"), _A("ns1::ns2::C"))); - REQUIRE_THAT(src, IsBaseClass(_A("ns1::ns2::A"), _A("ns1::ns2::D"))); - REQUIRE_THAT(src, IsBaseClass(_A("A"), _A("ns1::ns2::E"))); + REQUIRE(IsAssociation(src, "ns1::ns2::R", "ns1::ns2::A", "a")); + REQUIRE(IsAssociation(src, "ns1::ns2::R", "ns1::A", "ns1_a")); + REQUIRE(IsAssociation( + src, "ns1::ns2::R", "ns1::ns2::A", "ns1_ns2_a")); + REQUIRE(IsAssociation(src, "ns1::ns2::R", "A", "root_a")); - REQUIRE_THAT( - src, IsAssociation(_A("ns1::ns2::R"), _A("ns1::ns2::A"), "+a")); - REQUIRE_THAT( - src, IsAssociation(_A("ns1::ns2::R"), _A("ns1::A"), "+ns1_a")); - REQUIRE_THAT(src, - IsAssociation(_A("ns1::ns2::R"), _A("ns1::ns2::A"), "+ns1_ns2_a")); - REQUIRE_THAT(src, IsAssociation(_A("ns1::ns2::R"), _A("A"), "+root_a")); + REQUIRE(IsDependency(src, "ns1::ns2::R", "AA")); - REQUIRE_THAT(src, IsDependency(_A("ns1::ns2::R"), _A("AA"))); - - REQUIRE_THAT(src, IsFriend(_A("ns1::ns2::R"), _A("AAA"))); - REQUIRE_THAT( - src, !IsFriend(_A("ns1::ns2::R"), _A("ns1::ns2::AAA"))); + REQUIRE(IsFriend(src, "ns1::ns2::R", "AAA")); + REQUIRE(!IsFriend(src, "ns1::ns2::R", "ns1::ns2::AAA")); // TODO: - // REQUIRE_THAT(puml, IsFriend(_A("ns1::ns2::R"), + // REQUIRE(puml, IsFriend(src, "ns1::ns2::R"), // _A("AAAA"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "ns1::A")); - REQUIRE(IsClass(j, "ns1::ns2::A")); - REQUIRE(IsClass(j, "ns1::ns2::B")); - REQUIRE(IsClass(j, "ns1::ns2::C")); - REQUIRE(IsClass(j, "ns1::ns2::D")); - REQUIRE(IsClass(j, "ns1::ns2::E")); - REQUIRE(IsClass(j, "ns1::ns2::R")); - - REQUIRE(IsBaseClass(j, "ns1::ns2::A", "ns1::ns2::B")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsFriend; - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::B"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::C"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::D"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::E"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::R"))); - - REQUIRE_THAT(src, IsBaseClass(_A("ns1::ns2::A"), _A("ns1::ns2::B"))); - REQUIRE_THAT(src, IsBaseClass(_A("ns1::A"), _A("ns1::ns2::C"))); - REQUIRE_THAT(src, IsBaseClass(_A("ns1::ns2::A"), _A("ns1::ns2::D"))); - REQUIRE_THAT(src, IsBaseClass(_A("A"), _A("ns1::ns2::E"))); - - REQUIRE_THAT( - src, IsAssociation(_A("ns1::ns2::R"), _A("ns1::ns2::A"), "+a")); - REQUIRE_THAT( - src, IsAssociation(_A("ns1::ns2::R"), _A("ns1::A"), "+ns1_a")); - REQUIRE_THAT(src, - IsAssociation(_A("ns1::ns2::R"), _A("ns1::ns2::A"), "+ns1_ns2_a")); - REQUIRE_THAT(src, IsAssociation(_A("ns1::ns2::R"), _A("A"), "+root_a")); - - REQUIRE_THAT(src, IsDependency(_A("ns1::ns2::R"), _A("AA"))); - - REQUIRE_THAT(src, IsFriend(_A("ns1::ns2::R"), _A("AAA"))); - REQUIRE_THAT( - src, !IsFriend(_A("ns1::ns2::R"), _A("ns1::ns2::AAA"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }); } \ No newline at end of file diff --git a/tests/t00046/test_case.h b/tests/t00046/test_case.h index 1352f8b5..35285e25 100644 --- a/tests/t00046/test_case.h +++ b/tests/t00046/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00046/test_case.cc + * tests/t00046/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00046", "[test-case][class]") +TEST_CASE("t00046") { + using namespace clanguml::test; + auto [config, db] = load_config("t00046"); auto diagram = config.diagrams["t00046_class"]; @@ -28,51 +30,16 @@ TEST_CASE("t00046", "[test-case][class]") REQUIRE(model->name() == "t00046_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "AA")); + REQUIRE(IsClass(src, {"ns1::ns2", "B"})); + REQUIRE(IsClass(src, {"ns1::ns2", "C"})); + REQUIRE(IsClass(src, {"ns1::ns2", "D"})); + REQUIRE(IsClass(src, {"ns1::ns2", "E"})); + REQUIRE(IsClass(src, {"ns1::ns2", "R"})); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("E"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT(src, IsField("i", "std::vector")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(get_element(j, "A").value()["type"] == "class"); - REQUIRE(get_element(j, "AA").value()["type"] == "class"); - REQUIRE(get_element(j, "ns1::A").value()["type"] == "class"); - REQUIRE(get_element(j, "ns1::ns2::D").value()["type"] == "class"); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsField; - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::B"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::C"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::D"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::E"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2::R"))); - - REQUIRE_THAT(src, IsField("i", "std::vector")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsField( + src, "ns1::ns2::R", "i", "std::vector")); + }); } \ No newline at end of file diff --git a/tests/t00047/test_case.h b/tests/t00047/test_case.h index 19854832..07a3b334 100644 --- a/tests/t00047/test_case.h +++ b/tests/t00047/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00047", "[test-case][class]") +TEST_CASE("t00047") { + using namespace clanguml::test; + auto [config, db] = load_config("t00047"); auto diagram = config.diagrams["t00047_class"]; @@ -28,48 +30,10 @@ TEST_CASE("t00047", "[test-case][class]") REQUIRE(model->name() == "t00047_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - // Check if class templates exist - REQUIRE_THAT(src, IsClassTemplate("conditional_t", "Ts...")); - REQUIRE_THAT(src, IsClassTemplate("conditional_t", "Else")); - REQUIRE_THAT(src, - IsClassTemplate("conditional_t", "std::true_type,Result,Tail...")); - REQUIRE_THAT(src, - IsClassTemplate("conditional_t", "std::false_type,Result,Tail...")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClassTemplate(j, "conditional_t")); - REQUIRE(IsClass(j, "conditional_t")); - REQUIRE(IsClass(j, "conditional_t")); - REQUIRE(IsClass(j, "conditional_t")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - - // Check if class templates exist - REQUIRE_THAT(src, IsClass(_A("conditional_t"))); - REQUIRE_THAT(src, IsClass(_A("conditional_t"))); - REQUIRE_THAT( - src, IsClass(_A("conditional_t"))); - REQUIRE_THAT( - src, IsClass(_A("conditional_t"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClassTemplate(src, "conditional_t")); + REQUIRE(IsClass(src, "conditional_t")); + REQUIRE(IsClass(src, "conditional_t")); + REQUIRE(IsClass(src, "conditional_t")); + }); } \ No newline at end of file diff --git a/tests/t00048/test_case.h b/tests/t00048/test_case.h index 38ecc80b..69b726a3 100644 --- a/tests/t00048/test_case.h +++ b/tests/t00048/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00048", "[test-case][class]") +TEST_CASE("t00048") { + using namespace clanguml::test; + auto [config, db] = load_config("t00048"); auto diagram = config.diagrams["t00048_class"]; @@ -28,63 +30,19 @@ TEST_CASE("t00048", "[test-case][class]") REQUIRE(model->name() == "t00048_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { // Check if all classes exist - REQUIRE_THAT(src, IsAbstractClass(_A("Base"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE(IsAbstractClass(src, "Base")); + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); // Check if class templates exist - REQUIRE_THAT(src, IsAbstractClassTemplate("BaseTemplate", "T")); - REQUIRE_THAT(src, IsClassTemplate("ATemplate", "T")); - REQUIRE_THAT(src, IsClassTemplate("BTemplate", "T")); + REQUIRE(IsAbstractClassTemplate(src, "BaseTemplate")); + REQUIRE(IsClassTemplate(src, "ATemplate")); + REQUIRE(IsClassTemplate(src, "BTemplate")); // Check if all inheritance relationships exist - REQUIRE_THAT(src, IsBaseClass(_A("Base"), _A("A"))); - REQUIRE_THAT(src, IsBaseClass(_A("Base"), _A("B"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B")); - REQUIRE(IsClass(j, "ATemplate")); - REQUIRE(IsClass(j, "BTemplate")); - REQUIRE(IsBaseClass(j, "Base", "A")); - REQUIRE(IsBaseClass(j, "Base", "B")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsAbstractClass; - - // Check if all classes exist - REQUIRE_THAT(src, IsAbstractClass(_A("Base"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - - // Check if class templates exist - REQUIRE_THAT(src, IsAbstractClass(_A("BaseTemplate"))); - REQUIRE_THAT(src, IsClass(_A("ATemplate"))); - REQUIRE_THAT(src, IsClass(_A("BTemplate"))); - - // Check if all inheritance relationships exist - REQUIRE_THAT(src, IsBaseClass(_A("Base"), _A("A"))); - REQUIRE_THAT(src, IsBaseClass(_A("Base"), _A("B"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsBaseClass(src, "Base", "A")); + REQUIRE(IsBaseClass(src, "Base", "B")); + }); } \ No newline at end of file diff --git a/tests/t00049/test_case.h b/tests/t00049/test_case.h index 01494fc3..4272f408 100644 --- a/tests/t00049/test_case.h +++ b/tests/t00049/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00049", "[test-case][class]") +TEST_CASE("t00049") { + using namespace clanguml::test; + auto [config, db] = load_config("t00049"); auto diagram = config.diagrams["t00049_class"]; @@ -27,78 +29,22 @@ TEST_CASE("t00049", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00049_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "R")); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + REQUIRE(IsClassTemplate(src, "A")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsMethod(src, "R", "get_int_map", "A")); + REQUIRE(IsMethod( + src, "R", "set_int_map", "void", "A && int_map")); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("R"))); + REQUIRE(IsField(src, "R", "a_string", "A")); + REQUIRE( + IsField(src, "R", "a_vector_string", "A")); + REQUIRE(IsField(src, "R", "a_int_map", "A")); - // Check if class templates exist - REQUIRE_THAT(src, IsClassTemplate("A", "T")); - - // Check if all methods exist - REQUIRE_THAT(src, (IsMethod("get_int_map", "A"))); - REQUIRE_THAT(src, - (IsMethod("set_int_map", "void", "A && int_map"))); - - // Check if all fields exist - REQUIRE_THAT(src, (IsField("a_string", "A"))); - REQUIRE_THAT( - src, (IsField("a_vector_string", "A"))); - REQUIRE_THAT(src, (IsField("a_int_map", "A"))); - - // Check if all relationships exist - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "R")); - REQUIRE(IsClassTemplate(j, "A")); - REQUIRE(IsInstantiation(j, "A", "A")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsField; - using mermaid::IsMethod; - - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("R"))); - - // Check if class templates exist - REQUIRE_THAT(src, IsClass(_A("A"))); - - // Check if all methods exist - REQUIRE_THAT(src, (IsMethod("get_int_map", "A"))); - REQUIRE_THAT(src, - (IsMethod("set_int_map", "void", "A && int_map"))); - - // Check if all fields exist - REQUIRE_THAT(src, (IsField("a_string", "A"))); - REQUIRE_THAT( - src, (IsField("a_vector_string", "A"))); - REQUIRE_THAT(src, (IsField("a_int_map", "A"))); - - // Check if all relationships exist - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A")); + }); } \ No newline at end of file diff --git a/tests/t00050/test_case.h b/tests/t00050/test_case.h index 6a3c50dd..9363db62 100644 --- a/tests/t00050/test_case.h +++ b/tests/t00050/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00050", "[test-case][class]") +TEST_CASE("t00050") { + using namespace clanguml::test; + auto [config, db] = load_config("t00050"); auto diagram = config.diagrams["t00050_class"]; @@ -28,73 +30,31 @@ TEST_CASE("t00050", "[test-case][class]") REQUIRE(model->name() == "t00050_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM( + config, diagram, *model, + [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, {"utils", "D"})); + REQUIRE(IsEnum(src, "E")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("utils::D"))); - REQUIRE_THAT(src, IsEnum(_A("E"))); - - REQUIRE_THAT(src, HasNote(_A("A"), "left")); - REQUIRE_THAT(src, HasNote(_A("A"), "right")); - REQUIRE_THAT(src, HasNote(_A("B"), "top")); - REQUIRE_THAT(src, HasNote(_A("C"), "top")); - REQUIRE_THAT(src, HasNote(_A("utils::D"), "top")); - REQUIRE_THAT(src, !HasNote(_A("E"), "bottom")); - REQUIRE_THAT(src, !HasNote(_A("NoComment"), "top")); - REQUIRE_THAT(src, HasNote(_A("F"), "top")); - REQUIRE_THAT(src, HasNote(_A("G"), "top")); - REQUIRE_THAT(src, HasNote(_A("G"), "bottom")); - REQUIRE_THAT(src, HasNote(_A("G"), "right")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B")); - REQUIRE(IsClass(j, "C")); - REQUIRE(IsClass(j, "utils::D")); - REQUIRE(IsEnum(j, "E")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::HasNote; - using mermaid::IsEnum; - - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("utils::D"))); - REQUIRE_THAT(src, IsEnum(_A("E"))); - - REQUIRE_THAT(src, HasNote(_A("A"), "left")); - REQUIRE_THAT(src, HasNote(_A("A"), "right")); - REQUIRE_THAT(src, HasNote(_A("B"), "top")); - REQUIRE_THAT(src, HasNote(_A("C"), "top")); - REQUIRE_THAT(src, HasNote(_A("utils::D"), "top")); - REQUIRE_THAT(src, !HasNote(_A("E"), "bottom")); - REQUIRE_THAT(src, !HasNote(_A("NoComment"), "top")); - REQUIRE_THAT(src, HasNote(_A("F"), "top")); - REQUIRE_THAT(src, HasNote(_A("G"), "top")); - REQUIRE_THAT(src, HasNote(_A("G"), "bottom")); - REQUIRE_THAT(src, HasNote(_A("G"), "right")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(HasNote(src, "A", "left")); + REQUIRE(HasNote(src, "A", "right")); + REQUIRE(HasNote(src, "B", "top")); + REQUIRE(HasNote(src, "C", "top")); + REQUIRE(HasNote(src, "utils::D", "top")); + REQUIRE(HasNote(src, "F", "top")); + REQUIRE(HasNote(src, "G", "top")); + REQUIRE(HasNote(src, "G", "bottom")); + REQUIRE(HasNote(src, "G", "right")); + }, + [](const plantuml_t &src) { + REQUIRE(!HasNote(src, "E", "bottom")); + REQUIRE(!HasNote(src, "NoComment", "top")); + }, + [](const mermaid_t &src) { + REQUIRE(!HasNote(src, "E", "bottom")); + REQUIRE(!HasNote(src, "NoComment", "top")); + }); } \ No newline at end of file diff --git a/tests/t00051/test_case.h b/tests/t00051/test_case.h index c2302184..cfcebade 100644 --- a/tests/t00051/test_case.h +++ b/tests/t00051/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00051", "[test-case][class]") +TEST_CASE("t00051") { + using namespace clanguml::test; + auto [config, db] = load_config("t00051"); auto diagram = config.diagrams["t00051_class"]; @@ -28,6 +30,36 @@ TEST_CASE("t00051", "[test-case][class]") REQUIRE(model->name() == "t00051_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsInnerClass(src, "A", "A::custom_thread1")); + REQUIRE(IsInnerClass(src, "A", "A::custom_thread2")); + + REQUIRE(IsMethod(src, "A::custom_thread1", + "custom_thread1", "void", + "Function && f, Args &&... args")); + REQUIRE(IsMethod(src, "A::custom_thread2", "thread", "void", + "(lambda at t00051.cc:59:27) &&")); + REQUIRE(IsMethod(src, "A", "start_thread3", + "B<(lambda at t00051.cc:43:18),(lambda at " + "t00051.cc:43:27)>")); + REQUIRE(IsMethod( + src, "A", "get_function", "(lambda at t00051.cc:48:16)")); + + REQUIRE(IsClassTemplate(src, "B")); + REQUIRE(IsMethod(src, "B", "f", "void")); + REQUIRE(IsMethod(src, "B", "ff", "void")); + + REQUIRE(IsClassTemplate( + src, "B<(lambda at t00051.cc:43:18),(lambda at t00051.cc:43:27)>")); + + REQUIRE(IsInstantiation(src, "B", + "B<(lambda at t00051.cc:43:18),(lambda at t00051.cc:43:27)>")); + + REQUIRE(IsDependency(src, "A", + "B<(lambda at t00051.cc:43:18),(lambda at t00051.cc:43:27)>")); + }); + /* { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -128,4 +160,5 @@ TEST_CASE("t00051", "[test-case][class]") save_mermaid(config.output_directory(), diagram->name + ".mmd", src); } + */ } \ No newline at end of file diff --git a/tests/t00052/test_case.h b/tests/t00052/test_case.h index 32319443..ee2dce46 100644 --- a/tests/t00052/test_case.h +++ b/tests/t00052/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00052", "[test-case][class]") +TEST_CASE("t00052") { + using namespace clanguml::test; + auto [config, db] = load_config("t00052"); auto diagram = config.diagrams["t00052_class"]; @@ -28,6 +30,17 @@ TEST_CASE("t00052", "[test-case][class]") REQUIRE(model->name() == "t00052_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + + REQUIRE(IsClassTemplate(src, "B")); + + REQUIRE(IsMethod(src, "A", "a", "T", "T p")); + REQUIRE(IsMethod(src, "A", "aa", "void", "F && f, Q q")); + REQUIRE(IsMethod(src, "B", "b", "T", "T t")); + REQUIRE(IsMethod(src, "B", "bb", "T", "F && f, T t")); + }); + /* { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -79,4 +92,5 @@ TEST_CASE("t00052", "[test-case][class]") save_mermaid(config.output_directory(), diagram->name + ".mmd", src); } + */ } \ No newline at end of file diff --git a/tests/t00053/test_case.h b/tests/t00053/test_case.h index 5cd14eb6..badae765 100644 --- a/tests/t00053/test_case.h +++ b/tests/t00053/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00053", "[test-case][class]") +TEST_CASE("t00053") { + using namespace clanguml::test; + auto [config, db] = load_config("t00053"); auto diagram = config.diagrams["t00053_class"]; @@ -28,78 +30,98 @@ TEST_CASE("t00053", "[test-case][class]") REQUIRE(model->name() == "t00053_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "a")); + REQUIRE(IsClass(src, "b")); + REQUIRE(IsClass(src, "c")); + REQUIRE(IsClass(src, "d")); + REQUIRE(IsClass(src, "e")); + REQUIRE(IsClass(src, "f")); + REQUIRE(IsClass(src, "g")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, "D")); + REQUIRE(IsClass(src, "E")); + REQUIRE(IsClass(src, "F")); + REQUIRE(IsClass(src, "G")); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("a"))); - REQUIRE_THAT(src, IsClass(_A("b"))); - REQUIRE_THAT(src, IsClass(_A("c"))); - REQUIRE_THAT(src, IsClass(_A("d"))); - REQUIRE_THAT(src, IsClass(_A("e"))); - REQUIRE_THAT(src, IsClass(_A("f"))); - REQUIRE_THAT(src, IsClass(_A("g"))); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("E"))); - REQUIRE_THAT(src, IsClass(_A("F"))); - REQUIRE_THAT(src, IsClass(_A("G"))); + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("a"))); + REQUIRE_THAT(src, IsClass(_A("b"))); + REQUIRE_THAT(src, IsClass(_A("c"))); + REQUIRE_THAT(src, IsClass(_A("d"))); + REQUIRE_THAT(src, IsClass(_A("e"))); + REQUIRE_THAT(src, IsClass(_A("f"))); + REQUIRE_THAT(src, IsClass(_A("g"))); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClass(_A("C"))); + REQUIRE_THAT(src, IsClass(_A("D"))); + REQUIRE_THAT(src, IsClass(_A("E"))); + REQUIRE_THAT(src, IsClass(_A("F"))); + REQUIRE_THAT(src, IsClass(_A("G"))); - { - auto j = generate_class_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - using namespace json; + { + auto j = generate_class_json(diagram, *model); - REQUIRE(IsClass(j, "a")); - REQUIRE(IsClass(j, "b")); - REQUIRE(IsClass(j, "c")); - REQUIRE(IsClass(j, "d")); - REQUIRE(IsClass(j, "e")); - REQUIRE(IsClass(j, "f")); - REQUIRE(IsClass(j, "g")); + using namespace json; - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B")); - REQUIRE(IsClass(j, "C")); - REQUIRE(IsClass(j, "D")); - REQUIRE(IsClass(j, "E")); - REQUIRE(IsClass(j, "F")); - REQUIRE(IsClass(j, "G")); + REQUIRE(IsClass(j, "a")); + REQUIRE(IsClass(j, "b")); + REQUIRE(IsClass(j, "c")); + REQUIRE(IsClass(j, "d")); + REQUIRE(IsClass(j, "e")); + REQUIRE(IsClass(j, "f")); + REQUIRE(IsClass(j, "g")); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + REQUIRE(IsClass(j, "A")); + REQUIRE(IsClass(j, "B")); + REQUIRE(IsClass(j, "C")); + REQUIRE(IsClass(j, "D")); + REQUIRE(IsClass(j, "E")); + REQUIRE(IsClass(j, "F")); + REQUIRE(IsClass(j, "G")); - mermaid::AliasMatcher _A(src); + save_json(config.output_directory(), diagram->name + ".json", j); + } + { + auto src = generate_class_mermaid(diagram, *model); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("a"))); - REQUIRE_THAT(src, IsClass(_A("b"))); - REQUIRE_THAT(src, IsClass(_A("c"))); - REQUIRE_THAT(src, IsClass(_A("d"))); - REQUIRE_THAT(src, IsClass(_A("e"))); - REQUIRE_THAT(src, IsClass(_A("f"))); - REQUIRE_THAT(src, IsClass(_A("g"))); + mermaid::AliasMatcher _A(src); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("E"))); - REQUIRE_THAT(src, IsClass(_A("F"))); - REQUIRE_THAT(src, IsClass(_A("G"))); + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("a"))); + REQUIRE_THAT(src, IsClass(_A("b"))); + REQUIRE_THAT(src, IsClass(_A("c"))); + REQUIRE_THAT(src, IsClass(_A("d"))); + REQUIRE_THAT(src, IsClass(_A("e"))); + REQUIRE_THAT(src, IsClass(_A("f"))); + REQUIRE_THAT(src, IsClass(_A("g"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClass(_A("C"))); + REQUIRE_THAT(src, IsClass(_A("D"))); + REQUIRE_THAT(src, IsClass(_A("E"))); + REQUIRE_THAT(src, IsClass(_A("F"))); + REQUIRE_THAT(src, IsClass(_A("G"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + } + */ } \ No newline at end of file diff --git a/tests/t00054/test_case.h b/tests/t00054/test_case.h index 7fcf352a..2f53b3ec 100644 --- a/tests/t00054/test_case.h +++ b/tests/t00054/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00054", "[test-case][class]") +TEST_CASE("t00054") { + using namespace clanguml::test; + auto [config, db] = load_config("t00054"); auto diagram = config.diagrams["t00054_class"]; @@ -28,6 +30,28 @@ TEST_CASE("t00054", "[test-case][class]") REQUIRE(model->name() == "t00054_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "a")); + REQUIRE(IsClass(src, "b")); + REQUIRE(IsClass(src, {"detail", "c"})); + REQUIRE(IsClass(src, {"detail", "d"})); + REQUIRE(IsClass(src, {"detail", "e"})); + REQUIRE(IsClass(src, "f")); + REQUIRE(IsClass(src, "g")); + + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, {"detail2", "C"})); + REQUIRE(IsClass(src, {"detail2::detail3", "D"})); + REQUIRE(IsClass(src, {"detail2::detail3", "E"})); + REQUIRE(IsClass(src, {"detail2", "F"})); + REQUIRE(IsClass(src, "G")); + + REQUIRE(IsEnum(src, {"detail4", "i"})); + REQUIRE(IsEnum(src, {"detail4", "h"})); + REQUIRE(IsEnum(src, {"detail4", "j"})); + }); + /* { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -114,5 +138,5 @@ TEST_CASE("t00054", "[test-case][class]") REQUIRE_THAT(src, IsEnum(_A("detail4::j"))); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } \ No newline at end of file diff --git a/tests/t00055/test_case.h b/tests/t00055/test_case.h index f349d5bf..6dc4056c 100644 --- a/tests/t00055/test_case.h +++ b/tests/t00055/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00055", "[test-case][class]") +TEST_CASE("t00055") { + using namespace clanguml::test; + auto [config, db] = load_config("t00055"); auto diagram = config.diagrams["t00055_class"]; @@ -28,6 +30,29 @@ TEST_CASE("t00055", "[test-case][class]") REQUIRE(model->name() == "t00055_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, "D")); + REQUIRE(IsClass(src, "E")); + REQUIRE(IsClass(src, "F")); + REQUIRE(IsClass(src, "G")); + REQUIRE(IsClass(src, "H")); + REQUIRE(IsClass(src, "I")); + REQUIRE(IsClass(src, "J")); + + REQUIRE(IsLayoutHint(src, "A", "right", "C")); + REQUIRE(IsLayoutHint(src, "C", "right", "E")); + REQUIRE(IsLayoutHint(src, "E", "right", "G")); + REQUIRE(IsLayoutHint(src, "G", "right", "I")); + + REQUIRE(IsLayoutHint(src, "B", "down", "D")); + REQUIRE(IsLayoutHint(src, "D", "down", "F")); + REQUIRE(IsLayoutHint(src, "F", "down", "H")); + REQUIRE(IsLayoutHint(src, "H", "down", "J")); + }); + /* { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -96,5 +121,5 @@ TEST_CASE("t00055", "[test-case][class]") REQUIRE_THAT(src, IsClass(_A("J"))); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } \ No newline at end of file diff --git a/tests/t00056/test_case.h b/tests/t00056/test_case.h index 8d6efee1..238175b9 100644 --- a/tests/t00056/test_case.h +++ b/tests/t00056/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00056", "[test-case][class]") +TEST_CASE("t00056") { + using namespace clanguml::test; + auto [config, db] = load_config("t00056"); auto diagram = config.diagrams["t00056_class"]; @@ -28,200 +30,267 @@ TEST_CASE("t00056", "[test-case][class]") REQUIRE(model->name() == "t00056_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsConcept(src, "greater_than_simple")); + REQUIRE(IsConcept(src, "greater_than_with_requires")); + REQUIRE(IsConcept(src, "max_four_bytes")); + REQUIRE(IsConcept(src, "iterable")); + REQUIRE(IsConcept(src, "has_value_type")); + REQUIRE(IsConcept(src, "convertible_to_string")); + REQUIRE(IsConcept(src, "iterable_with_value_type")); + REQUIRE(IsConcept(src, "iterable_or_small_value_type")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsConceptRequirement( + src, "greater_than_with_requires", "sizeof (l) > sizeof (r)")); - // Check if all classes exist - REQUIRE_THAT(src, IsConcept(_A("greater_than_simple"))); - REQUIRE_THAT(src, IsConcept(_A("greater_than_with_requires"))); - REQUIRE_THAT(src, IsConcept(_A("max_four_bytes"))); - REQUIRE_THAT(src, IsConcept(_A("iterable"))); - REQUIRE_THAT(src, IsConcept(_A("has_value_type"))); - REQUIRE_THAT(src, IsConcept(_A("convertible_to_string"))); - REQUIRE_THAT(src, IsConcept(_A("iterable_with_value_type"))); - REQUIRE_THAT(src, IsConcept(_A("iterable_or_small_value_type"))); - - REQUIRE_THAT(src, - IsConceptRequirement(_A("greater_than_with_requires"), - "sizeof (l) > sizeof (r)")); - - REQUIRE_THAT( - src, IsConceptRequirement(_A("iterable"), "container.begin()")); - REQUIRE_THAT( - src, IsConceptRequirement(_A("iterable"), "container.end()")); + REQUIRE(IsConceptRequirement(src, "iterable", "container.begin()")); + REQUIRE(IsConceptRequirement(src, "iterable", "container.end()")); #if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14) - REQUIRE_THAT(src, - IsConceptRequirement( - _A("convertible_to_string"), "std::string({s})")); + REQUIRE(IsConceptRequirement( + src, "convertible_to_string", "std::string({s})")); #else - REQUIRE_THAT(src, + REQUIRE( IsConceptRequirement( - _A("convertible_to_string"), "std::string{s}")); + src,"convertible_to_string", "std::string{s}")); #endif - REQUIRE_THAT(src, - IsConceptRequirement(_A("convertible_to_string"), - "{std::to_string(s)} noexcept")); - REQUIRE_THAT(src, - IsConceptRequirement(_A("convertible_to_string"), - "{std::to_string(s)} -> std::same_as")); + REQUIRE(IsConceptRequirement( + src, "convertible_to_string", "{std::to_string(s)} noexcept")); + REQUIRE(IsConceptRequirement(src, "convertible_to_string", + "{std::to_string(s)} -> std::same_as")); - // Check if class templates exist - REQUIRE_THAT(src, IsClassTemplate("A", "max_four_bytes T")); - REQUIRE_THAT(src, IsClassTemplate("B", "T")); - REQUIRE_THAT(src, IsClassTemplate("C", "convertible_to_string T")); - REQUIRE_THAT( - src, IsClassTemplate("D", "iterable T1,T2,iterable T3,T4,T5")); - REQUIRE_THAT(src, IsClassTemplate("E", "T1,T2,T3")); - REQUIRE_THAT(src, IsClassTemplate("F", "T1,T2,T3")); + REQUIRE(IsClassTemplate(src, "A")); - // Check if all relationships exist - REQUIRE_THAT(src, - IsConstraint( - _A("A"), _A("max_four_bytes"), "T")); + REQUIRE(IsClassTemplate(src, "B")); + REQUIRE(IsClassTemplate(src, "C")); + REQUIRE(IsClassTemplate(src, "D")); + REQUIRE(IsClassTemplate(src, "E")); + REQUIRE(IsClassTemplate(src, "F")); - REQUIRE_THAT(src, - IsConstraint(_A("D"), - _A("max_four_bytes"), "T2")); - REQUIRE_THAT(src, - IsConstraint(_A("D"), - _A("max_four_bytes"), "T5")); - REQUIRE_THAT(src, - IsConstraint(_A("D"), - _A("iterable"), "T1")); - REQUIRE_THAT(src, - IsConstraint(_A("D"), - _A("iterable"), "T3")); + REQUIRE( + IsConstraint(src, "A", "max_four_bytes", "T")); - REQUIRE_THAT(src, - IsConstraint(_A("iterable_with_value_type"), - _A("has_value_type"), "T")); + REQUIRE(IsConstraint(src, "D", + "max_four_bytes", "T2")); + REQUIRE(IsConstraint(src, "D", + "max_four_bytes", "T5")); + REQUIRE(IsConstraint( + src, "D", "iterable", "T1")); + REQUIRE(IsConstraint( + src, "D", "iterable", "T3")); - REQUIRE_THAT(src, - IsConstraint(_A("iterable_or_small_value_type"), - _A("max_four_bytes"), "T")); - REQUIRE_THAT(src, - IsConstraint(_A("iterable_or_small_value_type"), - _A("iterable_with_value_type"), "T")); + REQUIRE(IsConstraint( + src, "iterable_with_value_type", "has_value_type", "T")); - REQUIRE_THAT(src, - IsConstraint(_A("E"), - _A("greater_than_with_requires"), "T1,T3")); + REQUIRE(IsConstraint( + src, "iterable_or_small_value_type", "max_four_bytes", "T")); + REQUIRE(IsConstraint(src, "iterable_or_small_value_type", + "iterable_with_value_type", "T")); - REQUIRE_THAT(src, - IsConstraint( - _A("F"), _A("greater_than_simple"), "T1,T3")); + REQUIRE(IsConstraint( + src, "E", "greater_than_with_requires", "T1,T3")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); + REQUIRE(IsConstraint( + src, "F", "greater_than_simple", "T1,T3")); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - using namespace json; + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE(IsConcept(j, "greater_than_simple")); - REQUIRE(IsConcept(j, "greater_than_with_requires")); - REQUIRE(IsConcept(j, "max_four_bytes")); - REQUIRE(IsConcept(j, "iterable")); - REQUIRE(IsConcept(j, "has_value_type")); - REQUIRE(IsConcept(j, "convertible_to_string")); - REQUIRE(IsConcept(j, "iterable_with_value_type")); - REQUIRE(IsConcept(j, "iterable_or_small_value_type")); + // Check if all classes exist + REQUIRE_THAT(src, IsConcept(_A("greater_than_simple"))); + REQUIRE_THAT(src, IsConcept(_A("greater_than_with_requires"))); + REQUIRE_THAT(src, IsConcept(_A("max_four_bytes"))); + REQUIRE_THAT(src, IsConcept(_A("iterable"))); + REQUIRE_THAT(src, IsConcept(_A("has_value_type"))); + REQUIRE_THAT(src, IsConcept(_A("convertible_to_string"))); + REQUIRE_THAT(src, IsConcept(_A("iterable_with_value_type"))); + REQUIRE_THAT(src, IsConcept(_A("iterable_or_small_value_type"))); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + REQUIRE_THAT(src, + IsConceptRequirement(_A("greater_than_with_requires"), + "sizeof (l) > sizeof (r)")); - mermaid::AliasMatcher _A(src); - using mermaid::IsConcept; - using mermaid::IsConceptRequirement; - using mermaid::IsConstraint; + REQUIRE_THAT( + src, IsConceptRequirement(_A("iterable"), + "container.begin()")); REQUIRE_THAT( src, + IsConceptRequirement(_A("iterable"), "container.end()")); - // Check if all classes exist - REQUIRE_THAT(src, IsConcept(_A("greater_than_simple"))); - REQUIRE_THAT(src, IsConcept(_A("greater_than_with_requires"))); - REQUIRE_THAT(src, IsConcept(_A("max_four_bytes"))); - REQUIRE_THAT(src, IsConcept(_A("iterable"))); - REQUIRE_THAT(src, IsConcept(_A("has_value_type"))); - REQUIRE_THAT(src, IsConcept(_A("convertible_to_string"))); - REQUIRE_THAT(src, IsConcept(_A("iterable_with_value_type"))); - REQUIRE_THAT(src, IsConcept(_A("iterable_or_small_value_type"))); + #if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14) + REQUIRE_THAT(src, + IsConceptRequirement( + _A("convertible_to_string"), "std::string({s})")); + #else + REQUIRE_THAT(src, + IsConceptRequirement( + _A("convertible_to_string"), "std::string{s}")); + #endif + REQUIRE_THAT(src, + IsConceptRequirement(_A("convertible_to_string"), + "{std::to_string(s)} noexcept")); + REQUIRE_THAT(src, + IsConceptRequirement(_A("convertible_to_string"), + "{std::to_string(s)} -> std::same_as")); - REQUIRE_THAT(src, - IsConceptRequirement(_A("greater_than_with_requires"), - "sizeof (l) > sizeof (r)")); + // Check if class templates exist + REQUIRE_THAT(src, IsClassTemplate("A", "max_four_bytes T")); + REQUIRE_THAT(src, IsClassTemplate("B", "T")); + REQUIRE_THAT(src, IsClassTemplate("C", "convertible_to_string T")); + REQUIRE_THAT( + src, IsClassTemplate("D", "iterable T1,T2,iterable T3,T4,T5")); + REQUIRE_THAT(src, IsClassTemplate("E", "T1,T2,T3")); + REQUIRE_THAT(src, IsClassTemplate("F", "T1,T2,T3")); - REQUIRE_THAT( - src, IsConceptRequirement(_A("iterable"), "container.begin()")); - REQUIRE_THAT( - src, IsConceptRequirement(_A("iterable"), "container.end()")); + // Check if all relationships exist + REQUIRE_THAT(src, + IsConstraint( + _A("A"), _A("max_four_bytes"), "T")); -#if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14) - REQUIRE_THAT(src, - IsConceptRequirement( - _A("convertible_to_string"), "std::string({s})")); -#else - REQUIRE_THAT(src, - IsConceptRequirement( - _A("convertible_to_string"), "std::string{s}")); -#endif - REQUIRE_THAT(src, - IsConceptRequirement(_A("convertible_to_string"), - "{std::to_string(s)} noexcept")); - REQUIRE_THAT(src, - IsConceptRequirement(_A("convertible_to_string"), - "{std::to_string(s)} -> std::same_as")); + REQUIRE_THAT(src, + IsConstraint(_A("D"), + _A("max_four_bytes"), "T2")); + REQUIRE_THAT(src, + IsConstraint(_A("D"), + _A("max_four_bytes"), "T5")); + REQUIRE_THAT(src, + IsConstraint(_A("D"), + _A("iterable"), "T1")); + REQUIRE_THAT(src, + IsConstraint(_A("D"), + _A("iterable"), "T3")); - // Check if class templates exist - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClass(_A("E"))); - REQUIRE_THAT(src, IsClass(_A("F"))); + REQUIRE_THAT(src, + IsConstraint(_A("iterable_with_value_type"), + _A("has_value_type"), "T")); - // Check if all relationships exist - REQUIRE_THAT(src, - IsConstraint( - _A("A"), _A("max_four_bytes"), "T")); + REQUIRE_THAT(src, + IsConstraint(_A("iterable_or_small_value_type"), + _A("max_four_bytes"), "T")); + REQUIRE_THAT(src, + IsConstraint(_A("iterable_or_small_value_type"), + _A("iterable_with_value_type"), "T")); - REQUIRE_THAT(src, - IsConstraint(_A("D"), - _A("max_four_bytes"), "T2")); - REQUIRE_THAT(src, - IsConstraint(_A("D"), - _A("max_four_bytes"), "T5")); - REQUIRE_THAT(src, - IsConstraint(_A("D"), - _A("iterable"), "T1")); - REQUIRE_THAT(src, - IsConstraint(_A("D"), - _A("iterable"), "T3")); + REQUIRE_THAT(src, + IsConstraint(_A("E"), + _A("greater_than_with_requires"), "T1,T3")); - REQUIRE_THAT(src, - IsConstraint(_A("iterable_with_value_type"), - _A("has_value_type"), "T")); + REQUIRE_THAT(src, + IsConstraint( + _A("F"), _A("greater_than_simple"), + "T1,T3")); - REQUIRE_THAT(src, - IsConstraint(_A("iterable_or_small_value_type"), - _A("max_four_bytes"), "T")); - REQUIRE_THAT(src, - IsConstraint(_A("iterable_or_small_value_type"), - _A("iterable_with_value_type"), "T")); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } + { + auto j = generate_class_json(diagram, *model); - REQUIRE_THAT(src, - IsConstraint(_A("E"), - _A("greater_than_with_requires"), "T1,T3")); + using namespace json; - REQUIRE_THAT(src, - IsConstraint( - _A("F"), _A("greater_than_simple"), "T1,T3")); + REQUIRE(IsConcept(j, "greater_than_simple")); + REQUIRE(IsConcept(j, "greater_than_with_requires")); + REQUIRE(IsConcept(j, "max_four_bytes")); + REQUIRE(IsConcept(j, "iterable")); + REQUIRE(IsConcept(j, "has_value_type")); + REQUIRE(IsConcept(j, "convertible_to_string")); + REQUIRE(IsConcept(j, "iterable_with_value_type")); + REQUIRE(IsConcept(j, "iterable_or_small_value_type")); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + save_json(config.output_directory(), diagram->name + ".json", j); + } + { + auto src = generate_class_mermaid(diagram, *model); + + mermaid::AliasMatcher _A(src); + using mermaid::IsConcept; + using mermaid::IsConceptRequirement; + using mermaid::IsConstraint; + + // Check if all classes exist + REQUIRE_THAT(src, IsConcept(_A("greater_than_simple"))); + REQUIRE_THAT(src, IsConcept(_A("greater_than_with_requires"))); + REQUIRE_THAT(src, IsConcept(_A("max_four_bytes"))); + REQUIRE_THAT(src, IsConcept(_A("iterable"))); + REQUIRE_THAT(src, IsConcept(_A("has_value_type"))); + REQUIRE_THAT(src, IsConcept(_A("convertible_to_string"))); + REQUIRE_THAT(src, IsConcept(_A("iterable_with_value_type"))); + REQUIRE_THAT(src, IsConcept(_A("iterable_or_small_value_type"))); + + REQUIRE_THAT(src, + IsConceptRequirement(_A("greater_than_with_requires"), + "sizeof (l) > sizeof (r)")); + + REQUIRE_THAT( + src, IsConceptRequirement(_A("iterable"), + "container.begin()")); REQUIRE_THAT( src, + IsConceptRequirement(_A("iterable"), "container.end()")); + + #if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14) + REQUIRE_THAT(src, + IsConceptRequirement( + _A("convertible_to_string"), "std::string({s})")); + #else + REQUIRE_THAT(src, + IsConceptRequirement( + _A("convertible_to_string"), "std::string{s}")); + #endif + REQUIRE_THAT(src, + IsConceptRequirement(_A("convertible_to_string"), + "{std::to_string(s)} noexcept")); + REQUIRE_THAT(src, + IsConceptRequirement(_A("convertible_to_string"), + "{std::to_string(s)} -> std::same_as")); + + // Check if class templates exist + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClass(_A("C"))); + REQUIRE_THAT(src, IsClass(_A("D"))); REQUIRE_THAT(src, IsClass(_A("E"))); + REQUIRE_THAT(src, IsClass(_A("F"))); + + // Check if all relationships exist + REQUIRE_THAT(src, + IsConstraint( + _A("A"), _A("max_four_bytes"), "T")); + + REQUIRE_THAT(src, + IsConstraint(_A("D"), + _A("max_four_bytes"), "T2")); + REQUIRE_THAT(src, + IsConstraint(_A("D"), + _A("max_four_bytes"), "T5")); + REQUIRE_THAT(src, + IsConstraint(_A("D"), + _A("iterable"), "T1")); + REQUIRE_THAT(src, + IsConstraint(_A("D"), + _A("iterable"), "T3")); + + REQUIRE_THAT(src, + IsConstraint(_A("iterable_with_value_type"), + _A("has_value_type"), "T")); + + REQUIRE_THAT(src, + IsConstraint(_A("iterable_or_small_value_type"), + _A("max_four_bytes"), "T")); + REQUIRE_THAT(src, + IsConstraint(_A("iterable_or_small_value_type"), + _A("iterable_with_value_type"), "T")); + + REQUIRE_THAT(src, + IsConstraint(_A("E"), + _A("greater_than_with_requires"), "T1,T3")); + + REQUIRE_THAT(src, + IsConstraint( + _A("F"), _A("greater_than_simple"), + "T1,T3")); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t00057/test_case.h b/tests/t00057/test_case.h index 1a7331ea..fcbdfdcf 100644 --- a/tests/t00057/test_case.h +++ b/tests/t00057/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00057", "[test-case][class]") +TEST_CASE("t00057") { + using namespace clanguml::test; + auto [config, db] = load_config("t00057"); auto diagram = config.diagrams["t00057_class"]; @@ -28,86 +30,110 @@ TEST_CASE("t00057", "[test-case][class]") REQUIRE(model->name() == "t00057_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "t00057_A")); + REQUIRE(IsClass(src, "t00057_B")); + REQUIRE(IsClass(src, "t00057_C")); + REQUIRE(IsUnion(src, "t00057_D")); + REQUIRE(IsClass(src, "t00057_E")); + REQUIRE(IsClass(src, "t00057_F")); + REQUIRE(IsClass(src, "t00057_G")); + REQUIRE(!IsClass(src, "(anonymous)")); + REQUIRE(IsClass(src, "t00057_R")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsAggregation(src, "t00057_R", "t00057_A", "a")); + REQUIRE(IsAggregation(src, "t00057_R", "t00057_B", "b")); + REQUIRE(IsAssociation(src, "t00057_R", "t00057_C", "c")); + REQUIRE(IsAggregation(src, "t00057_R", "t00057_D", "d")); + REQUIRE(IsAssociation(src, "t00057_R", "t00057_E", "e")); + REQUIRE(IsAssociation(src, "t00057_R", "t00057_F", "f")); + REQUIRE(IsAggregation( + src, "t00057_E", "t00057_E::(coordinates)", "coordinates")); + REQUIRE(IsAggregation( + src, "t00057_E", "t00057_E::(height)", "height")); + }); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("t00057_A"))); - REQUIRE_THAT(src, IsClass(_A("t00057_B"))); - REQUIRE_THAT(src, IsClass(_A("t00057_C"))); - REQUIRE_THAT(src, IsUnion(_A("t00057_D"))); - REQUIRE_THAT(src, IsClass(_A("t00057_E"))); - REQUIRE_THAT(src, IsClass(_A("t00057_F"))); - REQUIRE_THAT(src, IsClass(_A("t00057_G"))); - REQUIRE_THAT(src, !IsClass(_A("(anonymous)"))); - REQUIRE_THAT(src, IsClass(_A("t00057_R"))); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - // Check if all relationships exist - REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_A"), "+a")); - REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_B"), "+b")); - REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_C"), "+c")); - REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_D"), "+d")); - REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_E"), "+e")); - REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_F"), "+f")); - REQUIRE_THAT(src, - IsAggregation( - _A("t00057_E"), _A("t00057_E::(coordinates)"), "+coordinates")); - REQUIRE_THAT(src, - IsAggregation(_A("t00057_E"), _A("t00057_E::(height)"), "+height")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("t00057_A"))); + REQUIRE_THAT(src, IsClass(_A("t00057_B"))); + REQUIRE_THAT(src, IsClass(_A("t00057_C"))); + REQUIRE_THAT(src, IsUnion(_A("t00057_D"))); + REQUIRE_THAT(src, IsClass(_A("t00057_E"))); + REQUIRE_THAT(src, IsClass(_A("t00057_F"))); + REQUIRE_THAT(src, IsClass(_A("t00057_G"))); + REQUIRE_THAT(src, !IsClass(_A("(anonymous)"))); + REQUIRE_THAT(src, IsClass(_A("t00057_R"))); - { - auto j = generate_class_json(diagram, *model); + // Check if all relationships exist + REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_A"), + "+a")); REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_B"), + "+b")); REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_C"), + "+c")); REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_D"), + "+d")); REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_E"), + "+e")); REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_F"), + "+f")); REQUIRE_THAT(src, IsAggregation( _A("t00057_E"), + _A("t00057_E::(coordinates)"), "+coordinates")); REQUIRE_THAT(src, + IsAggregation(_A("t00057_E"), _A("t00057_E::(height)"), + "+height")); - using namespace json; + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - REQUIRE(get_element(j, "t00057_A").value()["type"] == "class"); - REQUIRE(get_element(j, "t00057_B").value()["type"] == "class"); - REQUIRE(get_element(j, "t00057_C").value()["type"] == "class"); - REQUIRE(get_element(j, "t00057_D").value()["type"] == "class"); - REQUIRE(get_element(j, "t00057_E").value()["type"] == "class"); - REQUIRE(get_element(j, "t00057_F").value()["type"] == "class"); - REQUIRE(get_element(j, "t00057_G").value()["type"] == "class"); - REQUIRE(get_element(j, "t00057_R").value()["type"] == "class"); + { + auto j = generate_class_json(diagram, *model); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + using namespace json; - mermaid::AliasMatcher _A(src); - using mermaid::IsUnion; + REQUIRE(get_element(j, "t00057_A").value()["type"] == "class"); + REQUIRE(get_element(j, "t00057_B").value()["type"] == "class"); + REQUIRE(get_element(j, "t00057_C").value()["type"] == "class"); + REQUIRE(get_element(j, "t00057_D").value()["type"] == "class"); + REQUIRE(get_element(j, "t00057_E").value()["type"] == "class"); + REQUIRE(get_element(j, "t00057_F").value()["type"] == "class"); + REQUIRE(get_element(j, "t00057_G").value()["type"] == "class"); + REQUIRE(get_element(j, "t00057_R").value()["type"] == "class"); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("t00057_A"))); - REQUIRE_THAT(src, IsClass(_A("t00057_B"))); - REQUIRE_THAT(src, IsClass(_A("t00057_C"))); - REQUIRE_THAT(src, IsUnion(_A("t00057_D"))); - REQUIRE_THAT(src, IsClass(_A("t00057_E"))); - REQUIRE_THAT(src, IsClass(_A("t00057_F"))); - REQUIRE_THAT(src, IsClass(_A("t00057_G"))); - REQUIRE_THAT(src, !IsClass(_A("(anonymous)"))); - REQUIRE_THAT(src, IsClass(_A("t00057_R"))); + save_json(config.output_directory(), diagram->name + ".json", j); + } + { + auto src = generate_class_mermaid(diagram, *model); - // Check if all relationships exist - REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_A"), "+a")); - REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_B"), "+b")); - REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_C"), "+c")); - REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_D"), "+d")); - REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_E"), "+e")); - REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_F"), "+f")); - REQUIRE_THAT(src, - IsAggregation( - _A("t00057_E"), _A("t00057_E::(coordinates)"), "+coordinates")); - REQUIRE_THAT(src, - IsAggregation(_A("t00057_E"), _A("t00057_E::(height)"), "+height")); + mermaid::AliasMatcher _A(src); + using mermaid::IsUnion; - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("t00057_A"))); + REQUIRE_THAT(src, IsClass(_A("t00057_B"))); + REQUIRE_THAT(src, IsClass(_A("t00057_C"))); + REQUIRE_THAT(src, IsUnion(_A("t00057_D"))); + REQUIRE_THAT(src, IsClass(_A("t00057_E"))); + REQUIRE_THAT(src, IsClass(_A("t00057_F"))); + REQUIRE_THAT(src, IsClass(_A("t00057_G"))); + REQUIRE_THAT(src, !IsClass(_A("(anonymous)"))); + REQUIRE_THAT(src, IsClass(_A("t00057_R"))); + + // Check if all relationships exist + REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_A"), + "+a")); REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_B"), + "+b")); REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_C"), + "+c")); REQUIRE_THAT(src, IsAggregation(_A("t00057_R"), _A("t00057_D"), + "+d")); REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_E"), + "+e")); REQUIRE_THAT(src, IsAssociation(_A("t00057_R"), _A("t00057_F"), + "+f")); REQUIRE_THAT(src, IsAggregation( _A("t00057_E"), + _A("t00057_E::(coordinates)"), "+coordinates")); REQUIRE_THAT(src, + IsAggregation(_A("t00057_E"), _A("t00057_E::(height)"), + "+height")); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + } + */ } \ No newline at end of file diff --git a/tests/t00058/.clang-uml b/tests/t00058/.clang-uml index a49be4ca..b238602e 100644 --- a/tests/t00058/.clang-uml +++ b/tests/t00058/.clang-uml @@ -8,5 +8,8 @@ diagrams: - clanguml::t00058 using_namespace: clanguml::t00058 plantuml: + after: + - '{{ alias("same_as_first_type") }} ..> {{ alias("first_type") }}' + mermaid: after: - '{{ alias("same_as_first_type") }} ..> {{ alias("first_type") }}' \ No newline at end of file diff --git a/tests/t00058/test_case.h b/tests/t00058/test_case.h index 1a31bb60..9a0581ae 100644 --- a/tests/t00058/test_case.h +++ b/tests/t00058/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00058", "[test-case][class]") +TEST_CASE("t00058") { + using namespace clanguml::test; + auto [config, db] = load_config("t00058"); auto diagram = config.diagrams["t00058_class"]; @@ -28,96 +30,134 @@ TEST_CASE("t00058", "[test-case][class]") REQUIRE(model->name() == "t00058_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM( + config, diagram, *model, + [](const auto &src) { + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate( + src, "B>")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsConcept(src, "same_as_first_type")); - REQUIRE_THAT(src, IsClassTemplate("A", "int,int,double,std::string")); - REQUIRE_THAT( - src, IsClassTemplate("B", "int,std::string,int,double,A")); + REQUIRE(IsConstraint(src, "A", + "same_as_first_type", "T,Args...")); - REQUIRE_THAT(src, IsConcept(_A("same_as_first_type"))); + REQUIRE(IsConstraint(src, "B", + "same_as_first_type", "T,Args...")); - REQUIRE_THAT(src, - IsConstraint(_A("A"), - _A("same_as_first_type"), "T,Args...")); + REQUIRE(IsAggregation( + src, "R", "A", "aa")); + REQUIRE(IsAggregation( + src, "R", "B>", "bb")); - REQUIRE_THAT(src, - IsConstraint(_A("B"), - _A("same_as_first_type"), "T,Args...")); + REQUIRE(IsInstantiation( + src, "A", "A")); + REQUIRE(IsInstantiation(src, "B", + "B>")); + }, + [](const plantuml_t &src) { + // TODO: This dependency has to be added manually in config file + // so it doesn't work in JSON + REQUIRE(IsDependency( + src, "same_as_first_type", "first_type")); + }, + [](const mermaid_t &src) { + // TODO: This dependency has to be added manually in config file + // so it doesn't work in JSON + REQUIRE(IsDependency( + src, "same_as_first_type", "first_type")); + }); - REQUIRE_THAT(src, - IsAggregation(_A("R"), _A("A"), "+aa")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), - _A("B>"), "+bb")); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, - IsInstantiation( - _A("A"), _A("A"))); - REQUIRE_THAT(src, - IsInstantiation(_A("B"), - _A("B>"))); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, - IsDependency(_A("same_as_first_type"), - _A("first_type"))); + REQUIRE_THAT(src, IsClassTemplate("A", + "int,int,double,std::string")); REQUIRE_THAT( src, IsClassTemplate("B", + "int,std::string,int,double,A")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsConcept(_A("same_as_first_type"))); - { - auto j = generate_class_json(diagram, *model); + REQUIRE_THAT(src, + IsConstraint(_A("A"), + _A("same_as_first_type"), "T,Args...")); - using namespace json; + REQUIRE_THAT(src, + IsConstraint(_A("B"), + _A("same_as_first_type"), "T,Args...")); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B>")); + REQUIRE_THAT(src, + IsAggregation(_A("R"), _A("A"), + "+aa")); REQUIRE_THAT(src, IsAggregation(_A("R"), + _A("B>"), "+bb")); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + REQUIRE_THAT(src, + IsInstantiation( + _A("A"), _A("A"))); + REQUIRE_THAT(src, + IsInstantiation(_A("B"), + _A("B>"))); - mermaid::AliasMatcher _A(src); - using mermaid::IsConcept; - using mermaid::IsConstraint; + REQUIRE_THAT(src, + IsDependency(_A("same_as_first_type"), + _A("first_type"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT( - src, IsClass(_A("B>"))); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - REQUIRE_THAT(src, IsConcept(_A("same_as_first_type"))); + { + auto j = generate_class_json(diagram, *model); - REQUIRE_THAT(src, - IsConstraint(_A("A"), - _A("same_as_first_type"), "T,Args...")); + using namespace json; - REQUIRE_THAT(src, - IsConstraint(_A("B"), - _A("same_as_first_type"), "T,Args...")); + REQUIRE(IsClass(j, "A")); + REQUIRE(IsClass(j, "B>")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), _A("A"), "+aa")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), - _A("B>"), "+bb")); + save_json(config.output_directory(), diagram->name + ".json", j); + } + { + auto src = generate_class_mermaid(diagram, *model); - REQUIRE_THAT(src, - IsInstantiation( - _A("A"), _A("A"))); - REQUIRE_THAT(src, - IsInstantiation(_A("B"), - _A("B>"))); + mermaid::AliasMatcher _A(src); + using mermaid::IsConcept; + using mermaid::IsConstraint; - // TODO - // REQUIRE_THAT(src, - // IsDependency(_A("same_as_first_type"), - // _A("first_type"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT( + src, IsClass(_A("B>"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsConcept(_A("same_as_first_type"))); + + REQUIRE_THAT(src, + IsConstraint(_A("A"), + _A("same_as_first_type"), "T,Args...")); + + REQUIRE_THAT(src, + IsConstraint(_A("B"), + _A("same_as_first_type"), "T,Args...")); + + REQUIRE_THAT(src, + IsAggregation(_A("R"), _A("A"), + "+aa")); REQUIRE_THAT(src, IsAggregation(_A("R"), + _A("B>"), "+bb")); + + REQUIRE_THAT(src, + IsInstantiation( + _A("A"), _A("A"))); + REQUIRE_THAT(src, + IsInstantiation(_A("B"), + _A("B>"))); + + // TODO + // REQUIRE_THAT(src, + // IsDependency(_A("same_as_first_type"), + // _A("first_type"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t00059/test_case.h b/tests/t00059/test_case.h index 851b1e87..435818db 100644 --- a/tests/t00059/test_case.h +++ b/tests/t00059/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00059", "[test-case][class]") +TEST_CASE("t00059") { + using namespace clanguml::test; + auto [config, db] = load_config("t00059"); auto diagram = config.diagrams["t00059_class"]; @@ -28,138 +30,186 @@ TEST_CASE("t00059", "[test-case][class]") REQUIRE(model->name() == "t00059_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsConcept(src, "fruit_c")); + REQUIRE(IsConcept(src, "apple_c")); + REQUIRE(IsConcept(src, "orange_c")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsConstraint(src, "apple_c", "fruit_c", "T", "up")); + REQUIRE(IsConstraint(src, "orange_c", "fruit_c", "T", "up")); - REQUIRE_THAT(src, IsConcept(_A("fruit_c"))); - REQUIRE_THAT(src, IsConcept(_A("apple_c"))); - REQUIRE_THAT(src, IsConcept(_A("orange_c"))); + REQUIRE(IsConceptRequirement(src, "apple_c", "t.get_sweetness()")); + REQUIRE(IsConceptRequirement(src, "apple_c", "t.get_bitterness()")); - REQUIRE_THAT( - src, IsConstraint(_A("apple_c"), _A("fruit_c"), "T", "up")); - REQUIRE_THAT( - src, IsConstraint(_A("orange_c"), _A("fruit_c"), "T", "up")); + REQUIRE(IsClass(src, "gala_apple")); + REQUIRE(IsClass(src, "empire_apple")); + REQUIRE(IsClass(src, "valencia_orange")); + REQUIRE(IsClass(src, "lima_orange")); + REQUIRE(IsClass(src, "R")); - REQUIRE_THAT( - src, IsConceptRequirement(_A("apple_c"), "t.get_sweetness()")); - REQUIRE_THAT( - src, IsConceptRequirement(_A("apple_c"), "t.get_bitterness()")); + REQUIRE(IsClassTemplate(src, "fruit_factory")); - REQUIRE_THAT(src, IsClass(_A("gala_apple"))); - REQUIRE_THAT(src, IsClass(_A("empire_apple"))); - REQUIRE_THAT(src, IsClass(_A("valencia_orange"))); - REQUIRE_THAT(src, IsClass(_A("lima_orange"))); - REQUIRE_THAT(src, IsClass(_A("R"))); + REQUIRE(IsDependency(src, "fruit_factory", + "gala_apple", "up")); + REQUIRE(IsDependency(src, "fruit_factory", + "valencia_orange", "up")); - REQUIRE_THAT( - src, IsClassTemplate("fruit_factory", "apple_c TA,orange_c TO")); + REQUIRE(IsDependency(src, "fruit_factory", + "empire_apple", "up")); + REQUIRE(IsDependency(src, "fruit_factory", + "lima_orange", "up")); - REQUIRE_THAT(src, - IsDependency(_A("fruit_factory"), - _A("gala_apple"), "up")); - REQUIRE_THAT(src, - IsDependency(_A("fruit_factory"), - _A("valencia_orange"), "up")); + REQUIRE(IsAggregation(src, "R", + "fruit_factory", "factory_1", "", "", + "up")); + REQUIRE(IsAggregation(src, "R", + "fruit_factory", "factory_2", "", "", + "up")); - REQUIRE_THAT(src, - IsDependency(_A("fruit_factory"), - _A("empire_apple"), "up")); - REQUIRE_THAT(src, - IsDependency(_A("fruit_factory"), - _A("lima_orange"), "up")); + REQUIRE(IsInstantiation(src, "fruit_factory", + "fruit_factory", "up")); + REQUIRE(IsInstantiation(src, "fruit_factory", + "fruit_factory", "up")); + }); + /* - REQUIRE_THAT(src, - IsAggregation(_A("R"), - _A("fruit_factory"), "+factory_1", - "", "", "up")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), - _A("fruit_factory"), "+factory_2", "", - "", "up")); + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, - IsInstantiation(_A("fruit_factory"), - _A("fruit_factory"), "up")); - REQUIRE_THAT(src, - IsInstantiation(_A("fruit_factory"), - _A("fruit_factory"), "up")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsConcept(_A("fruit_c"))); + REQUIRE_THAT(src, IsConcept(_A("apple_c"))); + REQUIRE_THAT(src, IsConcept(_A("orange_c"))); - { - auto j = generate_class_json(diagram, *model); + REQUIRE_THAT( + src, IsConstraint(_A("apple_c"), _A("fruit_c"), "T", + "up")); REQUIRE_THAT( src, IsConstraint(_A("orange_c"), + _A("fruit_c"), "T", "up")); - using namespace json; + REQUIRE_THAT( + src, IsConceptRequirement(_A("apple_c"), + "t.get_sweetness()")); REQUIRE_THAT( src, + IsConceptRequirement(_A("apple_c"), "t.get_bitterness()")); - REQUIRE(IsConcept(j, "fruit_c")); - REQUIRE(IsConcept(j, "apple_c")); - REQUIRE(IsConcept(j, "orange_c")); + REQUIRE_THAT(src, IsClass(_A("gala_apple"))); + REQUIRE_THAT(src, IsClass(_A("empire_apple"))); + REQUIRE_THAT(src, IsClass(_A("valencia_orange"))); + REQUIRE_THAT(src, IsClass(_A("lima_orange"))); + REQUIRE_THAT(src, IsClass(_A("R"))); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + REQUIRE_THAT( + src, IsClassTemplate("fruit_factory", "apple_c TA,orange_c + TO")); - mermaid::AliasMatcher _A(src); - using mermaid::IsConcept; - using mermaid::IsConceptRequirement; - using mermaid::IsConstraint; + REQUIRE_THAT(src, + IsDependency(_A("fruit_factory"), + _A("gala_apple"), "up")); + REQUIRE_THAT(src, + IsDependency(_A("fruit_factory"), + _A("valencia_orange"), "up")); - REQUIRE_THAT(src, IsConcept(_A("fruit_c"))); - REQUIRE_THAT(src, IsConcept(_A("apple_c"))); - REQUIRE_THAT(src, IsConcept(_A("orange_c"))); + REQUIRE_THAT(src, + IsDependency(_A("fruit_factory"), + _A("empire_apple"), "up")); + REQUIRE_THAT(src, + IsDependency(_A("fruit_factory"), + _A("lima_orange"), "up")); - REQUIRE_THAT( - src, IsConstraint(_A("apple_c"), _A("fruit_c"), "T")); - REQUIRE_THAT( - src, IsConstraint(_A("orange_c"), _A("fruit_c"), "T")); + REQUIRE_THAT(src, + IsAggregation(_A("R"), + _A("fruit_factory"), + "+factory_1", + "", "", "up")); + REQUIRE_THAT(src, + IsAggregation(_A("R"), + _A("fruit_factory"), "+factory_2", + "", + "", "up")); - REQUIRE_THAT( - src, IsConceptRequirement(_A("apple_c"), "t.get_sweetness()")); - REQUIRE_THAT( - src, IsConceptRequirement(_A("apple_c"), "t.get_bitterness()")); + REQUIRE_THAT(src, + IsInstantiation(_A("fruit_factory"), + _A("fruit_factory"), "up")); + REQUIRE_THAT(src, + IsInstantiation(_A("fruit_factory"), + _A("fruit_factory"), "up")); - REQUIRE_THAT(src, IsClass(_A("gala_apple"))); - REQUIRE_THAT(src, IsClass(_A("empire_apple"))); - REQUIRE_THAT(src, IsClass(_A("valencia_orange"))); - REQUIRE_THAT(src, IsClass(_A("lima_orange"))); - REQUIRE_THAT(src, IsClass(_A("R"))); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - REQUIRE_THAT(src, IsClass(_A("fruit_factory"))); + { + auto j = generate_class_json(diagram, *model); - REQUIRE_THAT(src, - IsDependency(_A("fruit_factory"), - _A("gala_apple"))); - REQUIRE_THAT(src, - IsDependency(_A("fruit_factory"), - _A("valencia_orange"))); + using namespace json; - REQUIRE_THAT(src, - IsDependency(_A("fruit_factory"), - _A("empire_apple"))); - REQUIRE_THAT(src, - IsDependency(_A("fruit_factory"), - _A("lima_orange"))); + REQUIRE(IsConcept(j, "fruit_c")); + REQUIRE(IsConcept(j, "apple_c")); + REQUIRE(IsConcept(j, "orange_c")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), - _A("fruit_factory"), "+factory_1")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), - _A("fruit_factory"), "+factory_2")); + save_json(config.output_directory(), diagram->name + ".json", j); + } + { + auto src = generate_class_mermaid(diagram, *model); - REQUIRE_THAT(src, - IsInstantiation(_A("fruit_factory"), - _A("fruit_factory"))); - REQUIRE_THAT(src, - IsInstantiation(_A("fruit_factory"), - _A("fruit_factory"))); + mermaid::AliasMatcher _A(src); + using mermaid::IsConcept; + using mermaid::IsConceptRequirement; + using mermaid::IsConstraint; - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsConcept(_A("fruit_c"))); + REQUIRE_THAT(src, IsConcept(_A("apple_c"))); + REQUIRE_THAT(src, IsConcept(_A("orange_c"))); + + REQUIRE_THAT( + src, IsConstraint(_A("apple_c"), _A("fruit_c"), "T")); + REQUIRE_THAT( + src, IsConstraint(_A("orange_c"), _A("fruit_c"), "T")); + + REQUIRE_THAT( + src, IsConceptRequirement(_A("apple_c"), + "t.get_sweetness()")); REQUIRE_THAT( src, + IsConceptRequirement(_A("apple_c"), "t.get_bitterness()")); + + REQUIRE_THAT(src, IsClass(_A("gala_apple"))); + REQUIRE_THAT(src, IsClass(_A("empire_apple"))); + REQUIRE_THAT(src, IsClass(_A("valencia_orange"))); + REQUIRE_THAT(src, IsClass(_A("lima_orange"))); + REQUIRE_THAT(src, IsClass(_A("R"))); + + REQUIRE_THAT(src, IsClass(_A("fruit_factory"))); + + REQUIRE_THAT(src, + IsDependency(_A("fruit_factory"), + _A("gala_apple"))); + REQUIRE_THAT(src, + IsDependency(_A("fruit_factory"), + _A("valencia_orange"))); + + REQUIRE_THAT(src, + IsDependency(_A("fruit_factory"), + _A("empire_apple"))); + REQUIRE_THAT(src, + IsDependency(_A("fruit_factory"), + _A("lima_orange"))); + + REQUIRE_THAT(src, + IsAggregation(_A("R"), + _A("fruit_factory"), + "+factory_1")); REQUIRE_THAT(src, IsAggregation(_A("R"), + _A("fruit_factory"), + "+factory_2")); + + REQUIRE_THAT(src, + IsInstantiation(_A("fruit_factory"), + _A("fruit_factory"))); + REQUIRE_THAT(src, + IsInstantiation(_A("fruit_factory"), + _A("fruit_factory"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t00060/test_case.h b/tests/t00060/test_case.h index 528bfcd4..87251cea 100644 --- a/tests/t00060/test_case.h +++ b/tests/t00060/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00060", "[test-case][class]") +TEST_CASE("t00060") { + using namespace clanguml::test; + auto [config, db] = load_config("t00060"); auto diagram = config.diagrams["t00060_class"]; @@ -28,59 +30,72 @@ TEST_CASE("t00060", "[test-case][class]") REQUIRE(model->name() == "t00060_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, "D")); + REQUIRE(!IsClass(src, "E")); + REQUIRE(!IsClass(src, "F")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClassTemplate(src, "G")); + REQUIRE(IsClassTemplate(src, "H")); + }); + /* +{ + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, !IsClass(_A("E"))); - REQUIRE_THAT(src, !IsClass(_A("F"))); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - // Check if class templates exist - REQUIRE_THAT(src, IsClassTemplate("G", "T")); - REQUIRE_THAT(src, IsClassTemplate("H", "T,P")); + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClass(_A("C"))); + REQUIRE_THAT(src, IsClass(_A("D"))); + REQUIRE_THAT(src, !IsClass(_A("E"))); + REQUIRE_THAT(src, !IsClass(_A("F"))); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + // Check if class templates exist + REQUIRE_THAT(src, IsClassTemplate("G", "T")); + REQUIRE_THAT(src, IsClassTemplate("H", "T,P")); - { - auto j = generate_class_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); +} - using namespace json; +{ + auto j = generate_class_json(diagram, *model); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B")); - REQUIRE(IsClass(j, "C")); - REQUIRE(IsClass(j, "D")); - REQUIRE(!IsClass(j, "E")); - REQUIRE(!IsClass(j, "F")); + using namespace json; - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + REQUIRE(IsClass(j, "A")); + REQUIRE(IsClass(j, "B")); + REQUIRE(IsClass(j, "C")); + REQUIRE(IsClass(j, "D")); + REQUIRE(!IsClass(j, "E")); + REQUIRE(!IsClass(j, "F")); - mermaid::AliasMatcher _A(src); + save_json(config.output_directory(), diagram->name + ".json", j); +} +{ + auto src = generate_class_mermaid(diagram, *model); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, !IsClass(_A("E"))); - REQUIRE_THAT(src, !IsClass(_A("F"))); + mermaid::AliasMatcher _A(src); - // Check if class templates exist - REQUIRE_THAT(src, IsClass(_A("G"))); - REQUIRE_THAT(src, IsClass(_A("H"))); + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClass(_A("C"))); + REQUIRE_THAT(src, IsClass(_A("D"))); + REQUIRE_THAT(src, !IsClass(_A("E"))); + REQUIRE_THAT(src, !IsClass(_A("F"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + // Check if class templates exist + REQUIRE_THAT(src, IsClass(_A("G"))); + REQUIRE_THAT(src, IsClass(_A("H"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", src); +} + */ } \ No newline at end of file diff --git a/tests/t00061/test_case.h b/tests/t00061/test_case.h index 64b5fdb1..a2086cf8 100644 --- a/tests/t00061/test_case.h +++ b/tests/t00061/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00061", "[test-case][class]") +TEST_CASE("t00061") { + using namespace clanguml::test; + auto [config, db] = load_config("t00061"); auto diagram = config.diagrams["t00061_class"]; @@ -28,42 +30,49 @@ TEST_CASE("t00061", "[test-case][class]") REQUIRE(model->name() == "t00061_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(!IsClass(src, "B")); + REQUIRE(!IsClass(src, "C")); + }); + /* +{ + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, !IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("C"))); + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, !IsClass(_A("B"))); + REQUIRE_THAT(src, !IsClass(_A("C"))); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + save_puml(config.output_directory(), diagram->name + ".puml", src); +} - { - auto j = generate_class_json(diagram, *model); +{ + auto j = generate_class_json(diagram, *model); - using namespace json; + using namespace json; - REQUIRE(IsClass(j, "A")); - REQUIRE(!IsClass(j, "B")); - REQUIRE(!IsClass(j, "C")); + REQUIRE(IsClass(j, "A")); + REQUIRE(!IsClass(j, "B")); + REQUIRE(!IsClass(j, "C")); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + save_json(config.output_directory(), diagram->name + ".json", j); +} +{ + auto src = generate_class_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); + mermaid::AliasMatcher _A(src); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, !IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("C"))); + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, !IsClass(_A("B"))); + REQUIRE_THAT(src, !IsClass(_A("C"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + save_mermaid(config.output_directory(), diagram->name + ".mmd", src); +} + */ } \ No newline at end of file diff --git a/tests/t00062/test_case.h b/tests/t00062/test_case.h index afa222c1..b266a93f 100644 --- a/tests/t00062/test_case.h +++ b/tests/t00062/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00062", "[test-case][class]") +TEST_CASE("t00062") { + using namespace clanguml::test; + auto [config, db] = load_config("t00062"); auto diagram = config.diagrams["t00062_class"]; @@ -28,6 +30,55 @@ TEST_CASE("t00062", "[test-case][class]") REQUIRE(model->name() == "t00062_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(!src.contains("type-parameter-")); + + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A>")); + REQUIRE(IsClassTemplate(src, "A>")); + + REQUIRE(IsField(src, "A", "u", "U &")); + REQUIRE(IsField(src, "A", "u", "U **")); + REQUIRE(IsField(src, "A", "u", "U ***")); + REQUIRE(IsField(src, "A", "u", "U &&")); + REQUIRE(IsField(src, "A", "u", "const U &")); + REQUIRE(IsField(src, "A", "c", "C &")); + REQUIRE(IsField(src, "A", "m", "M C::*")); + + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A")); + + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE( + IsInstantiation(src, "A", "A")); + + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A")); + + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A>")); + REQUIRE(IsInstantiation(src, "A", "A>")); + }); + + /* { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -148,5 +199,5 @@ TEST_CASE("t00062", "[test-case][class]") REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A>"))); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } \ No newline at end of file diff --git a/tests/t00063/test_case.h b/tests/t00063/test_case.h index 8eac17bc..8c87872f 100644 --- a/tests/t00063/test_case.h +++ b/tests/t00063/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00063", "[test-case][class]") +TEST_CASE("t00063") { + using namespace clanguml::test; + auto [config, db] = load_config("t00063"); auto diagram = config.diagrams["t00063_class"]; @@ -28,41 +30,49 @@ TEST_CASE("t00063", "[test-case][class]") REQUIRE(model->name() == "t00063_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(!IsEnum(src, "B")); + REQUIRE(!IsEnum(src, "C")); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, !IsEnum(_A("B"))); - REQUIRE_THAT(src, !IsEnum(_A("C"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, !IsEnum(_A("B"))); + REQUIRE_THAT(src, !IsEnum(_A("C"))); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - { - auto j = generate_class_json(diagram, *model); + { + auto j = generate_class_json(diagram, *model); - using namespace json; + using namespace json; - REQUIRE(IsClass(j, "A")); - REQUIRE(!IsEnum(j, "B")); - REQUIRE(!IsEnum(j, "C")); + REQUIRE(IsClass(j, "A")); + REQUIRE(!IsEnum(j, "B")); + REQUIRE(!IsEnum(j, "C")); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + save_json(config.output_directory(), diagram->name + ".json", j); + } + { + auto src = generate_class_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsEnum; + mermaid::AliasMatcher _A(src); + using mermaid::IsEnum; - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, !IsEnum(_A("B"))); - REQUIRE_THAT(src, !IsEnum(_A("C"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, !IsEnum(_A("B"))); + REQUIRE_THAT(src, !IsEnum(_A("C"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + } + */ } \ No newline at end of file diff --git a/tests/t00064/test_case.h b/tests/t00064/test_case.h index c813798a..6089a397 100644 --- a/tests/t00064/test_case.h +++ b/tests/t00064/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00064", "[test-case][class]") +TEST_CASE("t00064") { + using namespace clanguml::test; + auto [config, db] = load_config("t00064"); auto diagram = config.diagrams["t00064_class"]; @@ -28,6 +30,45 @@ TEST_CASE("t00064", "[test-case][class]") REQUIRE(model->name() == "t00064_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(!src.contains("type-parameter-")); + + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, "R")); + + REQUIRE(IsClassTemplate(src, "type_list")); + REQUIRE(IsClassTemplate(src, "type_list")); + REQUIRE(IsClassTemplate(src, "type_list")); + + REQUIRE(IsClassTemplate(src, "head")); + REQUIRE(IsClassTemplate(src, "head>")); + REQUIRE(IsClassTemplate(src, "type_group_pair")); + REQUIRE(IsClassTemplate( + src, "type_group_pair,type_list>")); + REQUIRE(IsClassTemplate( + src, "type_group_pair,type_list>")); + + REQUIRE(IsClassTemplate(src, "optional_ref")); + + REQUIRE(IsClassTemplate(src, + "type_group_pair_it,type_list>")); + REQUIRE(IsMethod(src, "get", "ref_t", "unsigned int i")); +#if LLVM_VERSION_MAJOR < 16 + REQUIRE(IsMethod( + src, "getp", "value_type const*", "unsigned int i")); + REQUIRE(IsMethod( + src, "find", "unsigned int", "value_type const& v")); +#else + REQUIRE( + IsMethod(src, "getp", "const value_type *", "unsigned int i")); + REQUIRE( + IsMethod(src, + "find", "unsigned int", "const value_type & v")); +#endif + }); + /* { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -137,4 +178,5 @@ TEST_CASE("t00064", "[test-case][class]") save_mermaid(config.output_directory(), diagram->name + ".mmd", src); } + */ } \ No newline at end of file diff --git a/tests/t00065/test_case.h b/tests/t00065/test_case.h index 51ccc4c5..7c127154 100644 --- a/tests/t00065/test_case.h +++ b/tests/t00065/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00065", "[test-case][class]") +TEST_CASE("t00065") { + using namespace clanguml::test; + auto [config, db] = load_config("t00065"); auto diagram = config.diagrams["t00065_class"]; @@ -28,48 +30,62 @@ TEST_CASE("t00065", "[test-case][class]") REQUIRE(model->name() == "t00065_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "R")); + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, {"detail", "AImpl"})); + REQUIRE(IsEnum(src, "XYZ")); + REQUIRE(IsEnum(src, "ABC")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsPackage("module1")); + REQUIRE(IsPackage("module2")); + REQUIRE(IsPackage("submodule1a")); + REQUIRE(IsPackage("concepts")); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("R"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("detail::AImpl"))); - REQUIRE_THAT(src, IsEnum(_A("XYZ"))); - REQUIRE_THAT(src, IsEnum(_A("ABC"))); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsPackage("module1")); - REQUIRE_THAT(src, IsPackage("module2")); - REQUIRE_THAT(src, IsPackage("submodule1a")); - REQUIRE_THAT(src, IsPackage("concepts")); + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("R"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("detail::AImpl"))); + REQUIRE_THAT(src, IsEnum(_A("XYZ"))); + REQUIRE_THAT(src, IsEnum(_A("ABC"))); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsPackage("module1")); + REQUIRE_THAT(src, IsPackage("module2")); + REQUIRE_THAT(src, IsPackage("submodule1a")); + REQUIRE_THAT(src, IsPackage("concepts")); - { - auto j = generate_class_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - using namespace json; + { + auto j = generate_class_json(diagram, *model); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + using namespace json; - mermaid::AliasMatcher _A(src); - using mermaid::IsEnum; + save_json(config.output_directory(), diagram->name + ".json", j); + } + { + auto src = generate_class_mermaid(diagram, *model); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("R"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("detail::AImpl"))); - REQUIRE_THAT(src, IsEnum(_A("XYZ"))); - REQUIRE_THAT(src, IsEnum(_A("ABC"))); + mermaid::AliasMatcher _A(src); + using mermaid::IsEnum; - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("R"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("detail::AImpl"))); + REQUIRE_THAT(src, IsEnum(_A("XYZ"))); + REQUIRE_THAT(src, IsEnum(_A("ABC"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t00066/test_case.h b/tests/t00066/test_case.h index 37765b71..89959407 100644 --- a/tests/t00066/test_case.h +++ b/tests/t00066/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00066", "[test-case][class]") +TEST_CASE("t00066") { + using namespace clanguml::test; + auto [config, db] = load_config("t00066"); auto diagram = config.diagrams["t00066_class"]; @@ -28,98 +30,132 @@ TEST_CASE("t00066", "[test-case][class]") REQUIRE(model->name() == "t00066_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(!IsDependency(src, "A", "A")); - REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE(IsMethod(src,"A"))); + REQUIRE(IsMethod(src, "A", "void", "A &&")); + REQUIRE(IsMethod(src, "A", "void", "const A &")); - REQUIRE_THAT(src, !IsDependency(_A("A"), _A("A"))); + REQUIRE(IsMethod(src, "~A")); - REQUIRE_THAT(src, (IsMethod("A"))); - REQUIRE_THAT(src, (IsMethod("A", "void", "A &&"))); - REQUIRE_THAT( - src, (IsMethod("A", "void", "const A &"))); + REQUIRE(IsMethod(src,"basic_method"))); + REQUIRE(IsMethod(src,"static_method", "int"))); + REQUIRE(IsMethod(src,"const_method"))); + REQUIRE(IsMethod(src,"default_int", "int", "int i = 12"))); + REQUIRE(IsMethod(src, "default_string", "std::string", + "int i, std::string s = \"abc\"")); - REQUIRE_THAT(src, (IsMethod("~A"))); + REQUIRE(IsMethod(src, "size", "std::size_t")); - REQUIRE_THAT(src, (IsMethod("basic_method"))); - REQUIRE_THAT(src, (IsMethod("static_method", "int"))); - REQUIRE_THAT(src, (IsMethod("const_method"))); - REQUIRE_THAT( - src, (IsMethod("default_int", "int", "int i = 12"))); - REQUIRE_THAT(src, - (IsMethod("default_string", "std::string", - "int i, std::string s = \"abc\""))); + REQUIRE(IsMethod(src, "protected_method")); + REQUIRE(IsMethod(src, "private_method")); + REQUIRE(IsField(src, "public_member", "int")); + REQUIRE(IsField(src, "protected_member", "int")); + REQUIRE(IsField(src, "private_member", "int")); + REQUIRE( + (IsField(src,"auto_member", "const unsigned long")); - REQUIRE_THAT(src, (IsMethod("size", "std::size_t"))); + REQUIRE(IsField(src,"a_", "int")); + REQUIRE(IsField(src,"b_", "int")); + REQUIRE(IsField(src,"c_", "int")); + }); - REQUIRE_THAT(src, (IsMethod("protected_method"))); - REQUIRE_THAT(src, (IsMethod("private_method"))); - REQUIRE_THAT(src, (IsField("public_member", "int"))); - REQUIRE_THAT(src, (IsField("protected_member", "int"))); - REQUIRE_THAT(src, (IsField("private_member", "int"))); - REQUIRE_THAT(src, - (IsField("auto_member", "const unsigned long"))); + /* +{ + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, (IsField("a_", "int"))); - REQUIRE_THAT(src, (IsField("b_", "int"))); - REQUIRE_THAT(src, (IsField("c_", "int"))); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsClass(_A("A"))); - { - auto j = generate_class_json(diagram, *model); + REQUIRE_THAT(src, !IsDependency(_A("A"), _A("A"))); - using namespace json; + REQUIRE_THAT(src, (IsMethod("A"))); + REQUIRE_THAT(src, (IsMethod("A", "void", "A &&"))); + REQUIRE_THAT( + src, (IsMethod("A", "void", "const A &"))); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + REQUIRE_THAT(src, (IsMethod("~A"))); - mermaid::AliasMatcher _A(src); - using mermaid::IsField; - using mermaid::IsMethod; + REQUIRE_THAT(src, (IsMethod("basic_method"))); + REQUIRE_THAT(src, (IsMethod("static_method", "int"))); + REQUIRE_THAT(src, (IsMethod("const_method"))); + REQUIRE_THAT( + src, (IsMethod("default_int", "int", "int i = 12"))); + REQUIRE_THAT(src, + (IsMethod("default_string", "std::string", + "int i, std::string s = \"abc\""))); - REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, (IsMethod("size", "std::size_t"))); - REQUIRE_THAT(src, !IsDependency(_A("A"), _A("A"))); + REQUIRE_THAT(src, (IsMethod("protected_method"))); + REQUIRE_THAT(src, (IsMethod("private_method"))); + REQUIRE_THAT(src, (IsField("public_member", "int"))); + REQUIRE_THAT(src, (IsField("protected_member", "int"))); + REQUIRE_THAT(src, (IsField("private_member", "int"))); + REQUIRE_THAT(src, + (IsField("auto_member", "const unsigned long"))); - REQUIRE_THAT(src, (IsMethod("A"))); - REQUIRE_THAT(src, (IsMethod("A", "void", "A &&"))); - REQUIRE_THAT( - src, (IsMethod("A", "void", "const A &"))); + REQUIRE_THAT(src, (IsField("a_", "int"))); + REQUIRE_THAT(src, (IsField("b_", "int"))); + REQUIRE_THAT(src, (IsField("c_", "int"))); - REQUIRE_THAT(src, (IsMethod("~A"))); + save_puml(config.output_directory(), diagram->name + ".puml", src); +} - REQUIRE_THAT(src, (IsMethod("basic_method"))); - REQUIRE_THAT(src, (IsMethod("static_method", "int"))); - REQUIRE_THAT(src, (IsMethod("const_method"))); - REQUIRE_THAT( - src, (IsMethod("default_int", "int", "int i = 12"))); - REQUIRE_THAT(src, - (IsMethod("default_string", "std::string", - "int i, std::string s = \"abc\""))); +{ + auto j = generate_class_json(diagram, *model); - REQUIRE_THAT(src, (IsMethod("size", "std::size_t"))); + using namespace json; - REQUIRE_THAT(src, (IsMethod("protected_method"))); - REQUIRE_THAT(src, (IsMethod("private_method"))); - REQUIRE_THAT(src, (IsField("public_member", "int"))); - REQUIRE_THAT(src, (IsField("protected_member", "int"))); - REQUIRE_THAT(src, (IsField("private_member", "int"))); - REQUIRE_THAT(src, - (IsField("auto_member", "const unsigned long"))); + save_json(config.output_directory(), diagram->name + ".json", j); +} +{ + auto src = generate_class_mermaid(diagram, *model); - REQUIRE_THAT(src, (IsField("a_", "int"))); - REQUIRE_THAT(src, (IsField("b_", "int"))); - REQUIRE_THAT(src, (IsField("c_", "int"))); + mermaid::AliasMatcher _A(src); + using mermaid::IsField; + using mermaid::IsMethod; - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsClass(_A("A"))); + + REQUIRE_THAT(src, !IsDependency(_A("A"), _A("A"))); + + REQUIRE_THAT(src, (IsMethod("A"))); + REQUIRE_THAT(src, (IsMethod("A", "void", "A &&"))); + REQUIRE_THAT( + src, (IsMethod("A", "void", "const A &"))); + + REQUIRE_THAT(src, (IsMethod("~A"))); + + REQUIRE_THAT(src, (IsMethod("basic_method"))); + REQUIRE_THAT(src, (IsMethod("static_method", "int"))); + REQUIRE_THAT(src, (IsMethod("const_method"))); + REQUIRE_THAT( + src, (IsMethod("default_int", "int", "int i = 12"))); + REQUIRE_THAT(src, + (IsMethod("default_string", "std::string", + "int i, std::string s = \"abc\""))); + + REQUIRE_THAT(src, (IsMethod("size", "std::size_t"))); + + REQUIRE_THAT(src, (IsMethod("protected_method"))); + REQUIRE_THAT(src, (IsMethod("private_method"))); + REQUIRE_THAT(src, (IsField("public_member", "int"))); + REQUIRE_THAT(src, (IsField("protected_member", "int"))); + REQUIRE_THAT(src, (IsField("private_member", "int"))); + REQUIRE_THAT(src, + (IsField("auto_member", "const unsigned long"))); + + REQUIRE_THAT(src, (IsField("a_", "int"))); + REQUIRE_THAT(src, (IsField("b_", "int"))); + REQUIRE_THAT(src, (IsField("c_", "int"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", src); +}*/ } \ No newline at end of file diff --git a/tests/t00067/test_case.h b/tests/t00067/test_case.h index b1142a5b..62e8775b 100644 --- a/tests/t00067/test_case.h +++ b/tests/t00067/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00067", "[test-case][class]") +TEST_CASE("t00067") { + using namespace clanguml::test; + auto [config, db] = load_config("t00067"); auto diagram = config.diagrams["t00067_class"]; @@ -28,6 +30,16 @@ TEST_CASE("t00067", "[test-case][class]") REQUIRE(model->name() == "t00067_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(!(IsMethod(src, "A"))); + REQUIRE(!(IsMethod(src, "A", "void", "A &&"))); + REQUIRE(!(IsMethod(src, "A", "void", "const A &"))); + + REQUIRE(!(IsMethod(src, "~A"))); + + REQUIRE(!(IsMethod(src, "~A"))); + }); + /* { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -71,5 +83,5 @@ TEST_CASE("t00067", "[test-case][class]") REQUIRE_THAT(src, !(IsMethod("~A"))); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } \ No newline at end of file diff --git a/tests/t00068/test_case.h b/tests/t00068/test_case.h index 19836b1b..57b96ffb 100644 --- a/tests/t00068/test_case.h +++ b/tests/t00068/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00068_r0", "[test-case][class][t00068]") +TEST_CASE("t00068_r0") { + using namespace clanguml::test; + auto [config, db] = load_config("t00068"); auto diagram = config.diagrams["t00068_r0_class"]; @@ -26,61 +28,25 @@ TEST_CASE("t00068_r0", "[test-case][class][t00068]") REQUIRE(model->name() == "t00068_r0_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(!IsClass(src, "A")); + REQUIRE(!IsClass(src, "AA")); + REQUIRE(IsClass(src, "AAA")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(!IsClass(src, "B")); + REQUIRE(!IsClass(src, "BB")); - REQUIRE_THAT(src, !IsClass(_A("A"))); - REQUIRE_THAT(src, !IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); + REQUIRE(!IsClass(src, "R")); + REQUIRE(!IsClass(src, "RR")); - REQUIRE_THAT(src, !IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("BB"))); - - REQUIRE_THAT(src, !IsClass(_A("R"))); - REQUIRE_THAT(src, !IsClass(_A("RR"))); - - REQUIRE_THAT(src, !IsEnum(_A("AKind"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsClass; - using mermaid::IsEnum; - - REQUIRE_THAT(src, !IsClass(_A("A"))); - REQUIRE_THAT(src, !IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); - - REQUIRE_THAT(src, !IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("BB"))); - - REQUIRE_THAT(src, !IsClass(_A("R"))); - REQUIRE_THAT(src, !IsClass(_A("RR"))); - - REQUIRE_THAT(src, !IsEnum(_A("AKind"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(!IsEnum(src, "AKind")); + }); } -TEST_CASE("t00068_r1", "[test-case][class][t00068]") +TEST_CASE("t00068_r1") { + using namespace clanguml::test; + auto [config, db] = load_config("t00068"); auto diagram = config.diagrams["t00068_r1_class"]; @@ -88,53 +54,25 @@ TEST_CASE("t00068_r1", "[test-case][class][t00068]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00068_r1_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(!IsClass(src, "A")); + REQUIRE(IsClass(src, "AA")); + REQUIRE(IsClass(src, "AAA")); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + REQUIRE(!IsClass(src, "B")); + REQUIRE(IsClass(src, "BB")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClass(src, "R")); + REQUIRE(!IsClass(src, "RR")); - REQUIRE_THAT(src, !IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); - - REQUIRE_THAT(src, !IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("BB"))); - - REQUIRE_THAT(src, IsClass(_A("R"))); - REQUIRE_THAT(src, !IsClass(_A("RR"))); - - REQUIRE_THAT(src, IsEnum(_A("AKind"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsClass; - - REQUIRE_THAT(src, !IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsEnum(src, "AKind")); + }); } -TEST_CASE("t00068_r2", "[test-case][class][t00068]") +TEST_CASE("t00068_r2") { + using namespace clanguml::test; + auto [config, db] = load_config("t00068"); auto diagram = config.diagrams["t00068_r2_class"]; @@ -143,53 +81,17 @@ TEST_CASE("t00068_r2", "[test-case][class][t00068]") REQUIRE(model->name() == "t00068_r2_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "AA")); + REQUIRE(IsClass(src, "AAA")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "BB")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); + REQUIRE(IsClass(src, "R")); + REQUIRE(IsClass(src, "RR")); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("BB"))); - - REQUIRE_THAT(src, IsClass(_A("R"))); - REQUIRE_THAT(src, IsClass(_A("RR"))); - - REQUIRE_THAT(src, IsEnum(_A("AKind"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsClass; - using mermaid::IsEnum; - - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("AA"))); - REQUIRE_THAT(src, IsClass(_A("AAA"))); - - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("BB"))); - - REQUIRE_THAT(src, IsClass(_A("R"))); - REQUIRE_THAT(src, IsClass(_A("RR"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsEnum(src, "AKind")); + }); } \ No newline at end of file diff --git a/tests/t00069/test_case.h b/tests/t00069/test_case.h index 069803e2..b72232e3 100644 --- a/tests/t00069/test_case.h +++ b/tests/t00069/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00069", "[test-case][class]") +TEST_CASE("t00069") { + using namespace clanguml::test; + auto [config, db] = load_config("t00069"); auto diagram = config.diagrams["t00069_class"]; @@ -28,60 +30,82 @@ TEST_CASE("t00069", "[test-case][class]") REQUIRE(model->name() == "t00069_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClassTemplate(src, "generator", "T")); - // Check if all classes exist - REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE( + IsInnerClass(src,("generator", "generator::promise_type")); - // Check if class templates exist - REQUIRE_THAT(src, IsClassTemplate("generator", "T")); + REQUIRE( + IsMethod(src,"iota", "generator")); + REQUIRE( + IsMethod(src,"seed", "generator")); - // Check if all inner classes exist - REQUIRE_THAT(src, - IsInnerClass(_A("generator"), _A("generator::promise_type"))); - - // Check if all methods exist - REQUIRE_THAT(src, - (IsMethod("iota", "generator"))); - REQUIRE_THAT(src, - (IsMethod("seed", "generator"))); - - // Check if all relationships exist - REQUIRE_THAT( - src, IsDependency(_A("A"), _A("generator"))); - REQUIRE_THAT(src, + REQUIRE( + IsDependency(src,"A", "generator")); + REQUIRE( IsInstantiation( - _A("generator"), _A("generator"))); + src,"generator", "generator")); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - { - auto j = generate_class_json(diagram, *model); + // Check if all classes exist + REQUIRE_THAT(src, IsClass(_A("A"))); - using namespace json; + // Check if class templates exist + REQUIRE_THAT(src, IsClassTemplate("generator", "T")); - save_json(config.output_directory(), diagram->name + ".json", j); - } + // Check if all inner classes exist + REQUIRE_THAT(src, + IsInnerClass(_A("generator"), + _A("generator::promise_type"))); - { - auto src = generate_class_mermaid(diagram, *model); + // Check if all methods exist + REQUIRE_THAT(src, + (IsMethod("iota", "generator"))); REQUIRE_THAT(src, (IsMethod("seed", + "generator"))); - mermaid::AliasMatcher _A(src); - using mermaid::IsClass; - using mermaid::IsMethod; + // Check if all relationships exist + REQUIRE_THAT( + src, IsDependency(_A("A"), _A("generator"))); + REQUIRE_THAT(src, + IsInstantiation( + _A("generator"), _A("generator"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, - (IsMethod("iota", "generator"))); - REQUIRE_THAT(src, - (IsMethod("seed", "generator"))); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + { + auto j = generate_class_json(diagram, *model); + + using namespace json; + + save_json(config.output_directory(), diagram->name + ".json", j); + } + + { + auto src = generate_class_mermaid(diagram, *model); + + mermaid::AliasMatcher _A(src); + using mermaid::IsClass; + using mermaid::IsMethod; + + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, + (IsMethod("iota", "generator"))); REQUIRE_THAT(src, (IsMethod("seed", + "generator"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t00070/test_case.h b/tests/t00070/test_case.h index 59227728..84d6644e 100644 --- a/tests/t00070/test_case.h +++ b/tests/t00070/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00070", "[test-case][class]") +TEST_CASE("t00070") { + using namespace clanguml::test; + auto [config, db] = load_config("t00070"); auto diagram = config.diagrams["t00070_class"]; @@ -28,62 +30,67 @@ TEST_CASE("t00070", "[test-case][class]") REQUIRE(model->name() == "t00070_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(!IsClass(src, "C")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClassTemplate(src, "BB")); + REQUIRE(!IsClassTemplate(src, "CC")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("C"))); + REQUIRE(IsEnum(src, "BBB")); + REQUIRE(!IsClass(src, "BBBB")); + REQUIRE(!IsEnum(src, "CCC")); + }); - REQUIRE_THAT(src, IsClassTemplate("BB", "T")); - REQUIRE_THAT(src, !IsClassTemplate("CC", "T")); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, IsEnum(_A("BBB"))); - REQUIRE_THAT(src, !IsClass(_A("BBBB"))); - REQUIRE_THAT(src, !IsEnum(_A("CCC"))); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - using namespace json; + { + auto j = generate_class_json(diagram, *model); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B")); - REQUIRE(!IsClass(j, "C")); + using namespace json; - REQUIRE(InPublicModule(j, "A", "t00070")); - REQUIRE(InPublicModule(j, "B", "t00070.lib1")); + REQUIRE(IsClass(j, "A")); + REQUIRE(IsClass(j, "B")); + REQUIRE(!IsClass(j, "C")); - REQUIRE(!IsClass(j, "BBBB")); + REQUIRE(InPublicModule(j, "A", "t00070")); + REQUIRE(InPublicModule(j, "B", "t00070.lib1")); - save_json(config.output_directory(), diagram->name + ".json", j); - } + REQUIRE(!IsClass(j, "BBBB")); - { - auto src = generate_class_mermaid(diagram, *model); + save_json(config.output_directory(), diagram->name + ".json", j); + } - mermaid::AliasMatcher _A(src); - using mermaid::IsClass; - using mermaid::IsEnum; + { + auto src = generate_class_mermaid(diagram, *model); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("C"))); + mermaid::AliasMatcher _A(src); + using mermaid::IsClass; + using mermaid::IsEnum; - REQUIRE_THAT(src, IsClass(_A("BB"))); - REQUIRE_THAT(src, !IsClass(_A("CC"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, !IsClass(_A("C"))); - REQUIRE_THAT(src, IsEnum(_A("BBB"))); - REQUIRE_THAT(src, !IsClass(_A("BBBB"))); - REQUIRE_THAT(src, !IsEnum(_A("CCC"))); + REQUIRE_THAT(src, IsClass(_A("BB"))); + REQUIRE_THAT(src, !IsClass(_A("CC"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsEnum(_A("BBB"))); + REQUIRE_THAT(src, !IsClass(_A("BBBB"))); + REQUIRE_THAT(src, !IsEnum(_A("CCC"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t00071/test_case.h b/tests/t00071/test_case.h index 21821d2d..485dd416 100644 --- a/tests/t00071/test_case.h +++ b/tests/t00071/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00071", "[test-case][class]") +TEST_CASE("t00071") { + using namespace clanguml::test; + auto [config, db] = load_config("t00071"); auto diagram = config.diagrams["t00071_class"]; @@ -28,49 +30,63 @@ TEST_CASE("t00071", "[test-case][class]") REQUIRE(model->name() == "t00071_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "R")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsEnum(src, {"detail", "BBB"})); + REQUIRE(IsEnum(src, {"detail", "CCC"})); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("R"))); + REQUIRE(IsModulePackage(src, "app"s)); + REQUIRE(IsModulePackage(src, "app"s, "lib1"s)); + REQUIRE(IsModulePackage(src, "app"s, "lib1"s, "mod1"s)); + REQUIRE(IsModulePackage(src, "app"s, "lib1"s, "mod2"s)); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, IsEnum(_A("detail::BBB"))); - REQUIRE_THAT(src, IsEnum(_A("detail::CCC"))); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("R"))); - { - auto j = generate_class_json(diagram, *model); + REQUIRE_THAT(src, IsEnum(_A("detail::BBB"))); + REQUIRE_THAT(src, IsEnum(_A("detail::CCC"))); - using namespace json; - using namespace std::string_literals; + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - REQUIRE(IsModulePackage(j, "app"s)); - REQUIRE(IsModulePackage(j, "app"s, "lib1"s)); - REQUIRE(IsModulePackage(j, "app"s, "lib1"s, "mod1"s)); - REQUIRE(IsModulePackage(j, "app"s, "lib1"s, "mod2"s)); + { + auto j = generate_class_json(diagram, *model); - save_json(config.output_directory(), diagram->name + ".json", j); - } + using namespace json; + using namespace std::string_literals; - { - auto src = generate_class_mermaid(diagram, *model); + REQUIRE(IsModulePackage(j, "app"s)); + REQUIRE(IsModulePackage(j, "app"s, "lib1"s)); + REQUIRE(IsModulePackage(j, "app"s, "lib1"s, "mod1"s)); + REQUIRE(IsModulePackage(j, "app"s, "lib1"s, "mod2"s)); - mermaid::AliasMatcher _A(src); - using mermaid::IsClass; - using mermaid::IsEnum; + save_json(config.output_directory(), diagram->name + ".json", j); + } - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("R"))); + { + auto src = generate_class_mermaid(diagram, *model); - REQUIRE_THAT(src, IsEnum(_A("detail::BBB"))); - REQUIRE_THAT(src, IsEnum(_A("detail::CCC"))); + mermaid::AliasMatcher _A(src); + using mermaid::IsClass; + using mermaid::IsEnum; - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("R"))); + + REQUIRE_THAT(src, IsEnum(_A("detail::BBB"))); + REQUIRE_THAT(src, IsEnum(_A("detail::CCC"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t00072/test_case.h b/tests/t00072/test_case.h index 10252aed..d383d907 100644 --- a/tests/t00072/test_case.h +++ b/tests/t00072/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00072", "[test-case][class]") +TEST_CASE("t00072") { + using namespace clanguml::test; + auto [config, db] = load_config("t00072"); auto diagram = config.diagrams["t00072_class"]; @@ -28,6 +30,27 @@ TEST_CASE("t00072", "[test-case][class]") REQUIRE(model->name() == "t00072_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsPackage(src, "app")); + REQUIRE(IsPackage(src, ":lib1")); + REQUIRE(IsPackage(src, ":lib2")); + REQUIRE(IsPackage(src, "mod1")); + REQUIRE(IsPackage(src, "mod2")); + + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClassTemplate(src, "CC")); + REQUIRE(IsEnum(src, {"detail", "CCC"})); + + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClassTemplate(src, "BB")); + REQUIRE(IsEnum(src, {"detail", "BBB"})); + + REQUIRE(IsClass(src, "D")); + REQUIRE(IsClass(src, "E")); + }); + /* + { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -100,4 +123,5 @@ TEST_CASE("t00072", "[test-case][class]") save_mermaid(config.output_directory(), diagram->name + ".mmd", src); } + */ } \ No newline at end of file diff --git a/tests/t00073/test_case.h b/tests/t00073/test_case.h index 68af72fd..3168358f 100644 --- a/tests/t00073/test_case.h +++ b/tests/t00073/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00073", "[test-case][class]") +TEST_CASE("t00073") { + using namespace clanguml::test; + auto [config, db] = load_config("t00073"); auto diagram = config.diagrams["t00073_class"]; @@ -28,69 +30,84 @@ TEST_CASE("t00073", "[test-case][class]") REQUIRE(model->name() == "t00073_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "AHandler")); + REQUIRE(IsClass(src, "BHandler")); + REQUIRE(IsClassTemplate(src, "Overload")); + REQUIRE(IsClassTemplate(src, "Overload")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsDependency(src, "AHandler", "A")); + REQUIRE(IsDependency(src, "BHandler", "B")); + REQUIRE(IsInstantiation( + src, "Overload", "Overload")); + REQUIRE(IsAggregation( + src, "R", "Overload", "dispatch")); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("AHandler"))); - REQUIRE_THAT(src, IsClass(_A("BHandler"))); - REQUIRE_THAT(src, IsClassTemplate("Overload", "Bases...")); - REQUIRE_THAT(src, IsClassTemplate("Overload", "AHandler,BHandler")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsDependency(_A("AHandler"), _A("A"))); - REQUIRE_THAT(src, IsDependency(_A("BHandler"), _A("B"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("Overload"), _A("Overload"))); - REQUIRE_THAT(src, - IsAggregation( - _A("R"), _A("Overload"), "+dispatch")); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClass(_A("AHandler"))); + REQUIRE_THAT(src, IsClass(_A("BHandler"))); + REQUIRE_THAT(src, IsClassTemplate("Overload", "Bases...")); + REQUIRE_THAT(src, IsClassTemplate("Overload", "AHandler,BHandler")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsDependency(_A("AHandler"), _A("A"))); + REQUIRE_THAT(src, IsDependency(_A("BHandler"), _A("B"))); + REQUIRE_THAT(src, + IsInstantiation( + _A("Overload"), + _A("Overload"))); REQUIRE_THAT(src, IsAggregation( + _A("R"), _A("Overload"), "+dispatch")); - { - auto j = generate_class_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - using namespace json; + { + auto j = generate_class_json(diagram, *model); - REQUIRE(IsClassTemplate(j, "Overload")); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B")); - REQUIRE(IsClass(j, "AHandler")); - REQUIRE(IsClass(j, "BHandler")); - REQUIRE(IsClass(j, "Overload")); + using namespace json; - save_json(config.output_directory(), diagram->name + ".json", j); - } + REQUIRE(IsClassTemplate(j, "Overload")); + REQUIRE(IsClass(j, "A")); + REQUIRE(IsClass(j, "B")); + REQUIRE(IsClass(j, "AHandler")); + REQUIRE(IsClass(j, "BHandler")); + REQUIRE(IsClass(j, "Overload")); - { - auto src = generate_class_mermaid(diagram, *model); + save_json(config.output_directory(), diagram->name + ".json", j); + } - mermaid::AliasMatcher _A(src); - using mermaid::IsClass; + { + auto src = generate_class_mermaid(diagram, *model); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("AHandler"))); - REQUIRE_THAT(src, IsClass(_A("BHandler"))); - REQUIRE_THAT(src, IsClass(_A("Overload"))); - REQUIRE_THAT(src, IsClass(_A("Overload"))); + mermaid::AliasMatcher _A(src); + using mermaid::IsClass; - REQUIRE_THAT(src, IsDependency(_A("AHandler"), _A("A"))); - REQUIRE_THAT(src, IsDependency(_A("BHandler"), _A("B"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("Overload"), _A("Overload"))); - REQUIRE_THAT(src, - IsAggregation( - _A("R"), _A("Overload"), "+dispatch")); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClass(_A("AHandler"))); + REQUIRE_THAT(src, IsClass(_A("BHandler"))); + REQUIRE_THAT(src, IsClass(_A("Overload"))); + REQUIRE_THAT(src, IsClass(_A("Overload"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsDependency(_A("AHandler"), _A("A"))); + REQUIRE_THAT(src, IsDependency(_A("BHandler"), _A("B"))); + REQUIRE_THAT(src, + IsInstantiation( + _A("Overload"), + _A("Overload"))); REQUIRE_THAT(src, IsAggregation( + _A("R"), _A("Overload"), "+dispatch")); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t00074/test_case.h b/tests/t00074/test_case.h index 3409091c..94d4b6c1 100644 --- a/tests/t00074/test_case.h +++ b/tests/t00074/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00074", "[test-case][class]") +TEST_CASE("t00074") { + using namespace clanguml::test; + auto [config, db] = load_config("t00074"); auto diagram = config.diagrams["t00074_class"]; @@ -28,6 +30,19 @@ TEST_CASE("t00074", "[test-case][class]") REQUIRE(model->name() == "t00074_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsConcept(src, "fruit_c")); + REQUIRE(IsConcept(src, "apple_c")); + REQUIRE(IsConcept(src, "orange_c")); + + REQUIRE(IsConstraint(src, "apple_c", "fruit_c", "T")); + REQUIRE(IsConstraint(src, "orange_c", "fruit_c", "T")); + + REQUIRE(!IsConceptRequirement(src, "apple_c", "t.get_sweetness()")); + REQUIRE( + !IsConceptRequirement(src, "orange_c", "t.get_bitterness()")); + }); +/* { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -87,5 +102,5 @@ TEST_CASE("t00074", "[test-case][class]") src, !IsConceptRequirement(_A("apple_c"), "t.get_bitterness()")); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } \ No newline at end of file diff --git a/tests/t00075/test_case.h b/tests/t00075/test_case.h index e1f4ac19..7170d6dc 100644 --- a/tests/t00075/test_case.h +++ b/tests/t00075/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00075", "[test-case][class]") +TEST_CASE("t00075") { + using namespace clanguml::test; + auto [config, db] = load_config("t00075"); auto diagram = config.diagrams["t00075_class"]; @@ -28,6 +30,25 @@ TEST_CASE("t00075", "[test-case][class]") REQUIRE(model->name() == "t00075_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClassTemplate(src, "ABE")); + REQUIRE(IsClass(src, "R")); + + REQUIRE(IsEnum(src, "E")); + + REQUIRE(IsConcept(src, "C")); + + REQUIRE(IsConceptRequirement(src, "C", "T{}")); + REQUIRE(IsConceptRequirement(src, "C", "t.e()")); + REQUIRE(IsConceptRequirement(src, "C", "(T t)")); + REQUIRE(!IsConceptRequirement(src, "C", "(T ns1::ns2::t)")); + + REQUIRE(IsConstraint(src, "ABE", "C", "T", + "up[#green,dashed,thickness=2]")); + }); + { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); diff --git a/tests/t30011/test_case.h b/tests/t30011/test_case.h index 949ab8b0..098ab003 100644 --- a/tests/t30011/test_case.h +++ b/tests/t30011/test_case.h @@ -38,10 +38,10 @@ TEST_CASE("t30011") REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib3"s)); REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib4"s)); - REQUIRE(IsDependency(src, "app"s, "lib1"s)); - REQUIRE(IsDependency(src, "app"s, "lib2"s)); - REQUIRE(IsDependency(src, "app"s, "lib3"s)); - REQUIRE(IsDependency(src, "app"s, "lib4"s)); + REQUIRE(IsDependency(src, "app", "lib1")); + REQUIRE(IsDependency(src, "app", "lib2")); + REQUIRE(IsDependency(src, "app", "lib3")); + REQUIRE(IsDependency(src, "app", "lib4")); }); /* { diff --git a/tests/test_cases.cc b/tests/test_cases.cc index f4637578..6ebd360c 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -387,7 +387,7 @@ void try_run_test_case(const diagram_source_storage &diagrams, TC &&tc) std::cout << "-----------------------------------------------------" "--------------------------\n"; std::cout << "Test case failed for diagram type " - << T::diagram_type_name << ": " << "\n"; + << T::diagram_type_name << ": " << "\n\n"; std::cout << diagrams.get().to_string() << "\n"; throw e; @@ -1044,9 +1044,6 @@ template <> bool IsClass(json_t d, std::string name) #include "t00028/test_case.h" #include "t00029/test_case.h" #include "t00030/test_case.h" - -/* - #include "t00031/test_case.h" #include "t00032/test_case.h" #include "t00033/test_case.h" @@ -1085,6 +1082,10 @@ template <> bool IsClass(json_t d, std::string name) #include "t00062/test_case.h" #include "t00063/test_case.h" #include "t00064/test_case.h" +/* + + + #if defined(ENABLE_CXX_STD_20_TEST_CASES) #include "t00065/test_case.h" #endif @@ -1215,43 +1216,24 @@ int main(int argc, char *argv[]) { doctest::Context context; - // defaults - // context.addFilter("test-case-exclude", - // "*math*"); // exclude test cases with "math" in their name - context.setOption( - "abort-after", 5); // stop test execution after 5 failed assertions - context.setOption("order-by", "name"); // sort the test cases by their name - context.applyCommandLine(argc, argv); - // overrides - context.setOption( - "no-breaks", false); // don't break in the debugger when assertions fail - clanguml::cli::cli_handler clih; std::vector argvv = { "clang-uml", "--config", "./test_config_data/simple.yml"}; - // if (debug_log) - // argvv.push_back("-vvv"); - // else - argvv.push_back("-q"); + argvv.push_back("-vvv"); clih.handle_options(argvv.size(), argvv.data()); - int res = context.run(); // run + int res = context.run(); - if (context.shouldExit()) // important - query flags (and --exit) rely on - // the user doing this - return res; // propagate the result of the tests + if (context.shouldExit()) + return res; - int client_stuff_return_code = 0; - // your program - if the testing framework is integrated in your production - // code + return res; - return res + client_stuff_return_code; // the result from doctest is - // propagated here as well /* Catch::Session session; using namespace Catch::clara; diff --git a/tests/test_cases.h b/tests/test_cases.h index 0e84baa1..d6d8a1cd 100644 --- a/tests/test_cases.h +++ b/tests/test_cases.h @@ -124,6 +124,11 @@ template struct diagram_source_t { return "__INVALID_ALIAS__"; } + virtual std::string get_alias(std::string ns, std::string name) const + { + return get_alias(fmt::format("{}::{}", ns, name)); + } + bool search(const std::string &pattern) const; std::string to_string() const; @@ -364,6 +369,43 @@ template <> std::string diagram_source_t::to_string() const return src.dump(2); } +struct QualifiedName { + QualifiedName(const char *n) + : name{n} + { + } + + QualifiedName(std::string_view n) + : name{n} + { + } + + QualifiedName(std::string_view ns_, std::string_view n) + : ns{ns_} + , name{n} + { + } + + QualifiedName(const char *ns_, const char *n) + : ns{ns_} + , name{n} + { + } + + operator std::string() const { return str(); } + + std::string str() const + { + if (ns) + return fmt::format("{}::{}", ns.value(), name); + + return name; + } + + std::optional ns; + std::string name; +}; + /// /// The following functions declarations define various checks on generated /// diagrams. @@ -386,23 +428,31 @@ bool HasTitle(const DiagramType &d, std::string const &str); // Check if generated diagram contains a specified enum template -bool IsEnum(const DiagramType &d, std::string name); +bool IsEnum(const DiagramType &d, QualifiedName name); + +// Check if generated diagram contains a specified union +template +bool IsUnion(const DiagramType &d, QualifiedName name); // Check if generated diagram contains a specified class template -bool IsClass(const DiagramType &d, std::string name); +bool IsClass(const DiagramType &d, QualifiedName name); // Check if generated diagram contains a specified class template template -bool IsClassTemplate(const DiagramType &d, std::string name); +bool IsClassTemplate(const DiagramType &d, QualifiedName name); + +template +bool IsAbstractClassTemplate(const DiagramType &d, QualifiedName name); // Check if generated diagram contains a specified abstract class template -bool IsAbstractClass(const DiagramType &d, std::string name); +bool IsAbstractClass(const DiagramType &d, QualifiedName name); // Check if generated diagram contains a specified class template -bool IsBaseClass(const DiagramType &d, std::string base, std::string subclass); +bool IsBaseClass( + const DiagramType &d, QualifiedName base, QualifiedName subclass); template bool IsInnerClass( @@ -440,8 +490,8 @@ bool IsInstantiation(const DiagramType &d, std::string const &from, std::string const &to, std::string style = ""); template -bool IsDependency(const DiagramType &d, std::string const &from, - std::string const &to, std::string style = ""); +bool IsDependency(const DiagramType &d, QualifiedName from, QualifiedName to, + std::string style = ""); template bool IsFriend( @@ -459,6 +509,9 @@ template bool IsConstraint(const DiagramType &d, std::string const &from, std::string const &to, std::string label = {}, std::string style = ""); +template +bool IsConcept(const DiagramType &d, std::string const &cpt); + template bool IsConceptRequirement( const DiagramType &d, std::string const &cpt, std::string requirement); @@ -543,28 +596,40 @@ template <> bool HasTitle(const plantuml_t &d, std::string const &str) return d.contains("title " + str); } -template <> bool IsEnum(const plantuml_t &d, std::string name) +template <> bool IsEnum(const plantuml_t &d, QualifiedName enm) { - return d.contains(fmt::format("enum {}", d.get_alias(name))); + return d.contains(fmt::format("enum {}", d.get_alias(enm.name))); } -template <> bool IsClass(const plantuml_t &d, std::string name) +template <> bool IsUnion(const plantuml_t &d, QualifiedName cls) { - return d.contains(fmt::format("class {}", d.get_alias(name))); + return d.contains(fmt::format("class {} <>", d.get_alias(cls))); } -template <> bool IsClassTemplate(const plantuml_t &d, std::string name) +template <> bool IsClass(const plantuml_t &d, QualifiedName cls) { - return d.contains(fmt::format("class \"{}\"", name)); + return d.contains(fmt::format("class {}", d.get_alias(cls.name))) || + d.contains(fmt::format("class {}", d.get_alias(cls.str()))); } -template <> bool IsAbstractClass(const plantuml_t &d, std::string name) +template <> bool IsClassTemplate(const plantuml_t &d, QualifiedName cls) { - return d.contains(fmt::format("abstract {}", d.get_alias(name))); + return d.contains(fmt::format("class \"{}\"", cls.name)); +} + +template <> bool IsAbstractClassTemplate(const plantuml_t &d, QualifiedName cls) +{ + return d.contains(fmt::format("abstract \"{}\"", cls.name)); +} + +template <> bool IsAbstractClass(const plantuml_t &d, QualifiedName cls) +{ + return d.contains(fmt::format("abstract {}", d.get_alias(cls.name))); } template <> -bool IsBaseClass(const plantuml_t &d, std::string base, std::string subclass) +bool IsBaseClass( + const plantuml_t &d, QualifiedName base, QualifiedName subclass) { return d.contains( fmt::format("{} <|-- {}", d.get_alias(base), d.get_alias(subclass))); @@ -750,11 +815,13 @@ bool IsInstantiation(const plantuml_t &d, std::string const &from, } template <> -bool IsDependency(const plantuml_t &d, std::string const &from, - std::string const &to, std::string style) +bool IsDependency(const plantuml_t &d, QualifiedName from, QualifiedName to, + std::string style) { - return d.contains( - fmt::format("{} .{}.> {}", d.get_alias(from), style, d.get_alias(to))); + return d.contains(fmt::format( + "{} .{}.> {}", d.get_alias(from), style, d.get_alias(to))) || + d.contains(fmt::format("{} .{}.> {}", d.get_alias(from.name), style, + d.get_alias(to.name))); } template @@ -802,6 +869,11 @@ bool IsConstraint(const plantuml_t &d, std::string const &from, "{} .{}.> {} : {}", d.get_alias(from), style, d.get_alias(to), label)); } +template <> bool IsConcept(const plantuml_t &d, std::string const &cpt) +{ + return d.contains("class " + d.get_alias(cpt) + " <>"); +} + template <> bool IsConceptRequirement( const plantuml_t &d, std::string const &cpt, std::string requirement) @@ -945,30 +1017,43 @@ template <> bool HasTitle(const mermaid_t &d, std::string const &str) return d.contains("title: " + str); } -template <> bool IsEnum(const mermaid_t &d, std::string name) +template <> bool IsEnum(const mermaid_t &d, QualifiedName enm) { - return d.search(std::string("class ") + d.get_alias(name) + + return d.search(std::string("class ") + d.get_alias(enm) + " \\{\\n\\s+<>"); } -template <> bool IsClass(const mermaid_t &d, std::string name) +template <> bool IsUnion(const mermaid_t &d, QualifiedName cls) { - return d.contains(fmt::format("class {}[\"{}\"]", d.get_alias(name), name)); + return d.search( + std::string("class ") + d.get_alias(cls) + " \\{\\n\\s+<>"); } -template <> bool IsClassTemplate(const mermaid_t &d, std::string name) +template <> bool IsClass(const mermaid_t &d, QualifiedName cls) { - return d.contains(fmt::format("class {}", d.get_alias(name))); + return d.contains(fmt::format("class {}", d.get_alias(cls))); } -template <> bool IsAbstractClass(const mermaid_t &d, std::string name) +template <> bool IsClassTemplate(const mermaid_t &d, QualifiedName cls) +{ + return d.contains(fmt::format("class {}", d.get_alias(cls))); +} + +template <> bool IsAbstractClassTemplate(const mermaid_t &d, QualifiedName cls) +{ + // return d.contains(fmt::format("class {}", d.get_alias(cls))); + return d.search( + std::string("class ") + d.get_alias(cls) + " \\{\\n\\s+<>"); +} + +template <> bool IsAbstractClass(const mermaid_t &d, QualifiedName name) { return d.search( std::string("class ") + d.get_alias(name) + " \\{\\n\\s+<>"); } template <> -bool IsBaseClass(const mermaid_t &d, std::string base, std::string subclass) +bool IsBaseClass(const mermaid_t &d, QualifiedName base, QualifiedName subclass) { return d.contains( fmt::format("{} <|-- {}", d.get_alias(base), d.get_alias(subclass))); @@ -1119,7 +1204,7 @@ bool IsComposition(const mermaid_t &d, std::string const &from, if (!multiplicity_source.empty()) format_string += " \"" + multiplicity_source + "\""; - format_string += fmt::format(" *-{}-", style); + format_string += fmt::format(" *--", style); if (!multiplicity_dest.empty()) format_string += " \"" + multiplicity_dest + "\""; @@ -1168,8 +1253,8 @@ bool IsInstantiation(const mermaid_t &d, std::string const &from, } template <> -bool IsDependency(const mermaid_t &d, std::string const &from, - std::string const &to, std::string style) +bool IsDependency( + const mermaid_t &d, QualifiedName from, QualifiedName to, std::string style) { if (d.diagram_type == common::model::diagram_t::kClass) { return d.contains( @@ -1259,6 +1344,12 @@ bool IsConstraint(const mermaid_t &d, std::string const &from, return d.contains(fmt::format("{} ..> {} : {}", from_id, to_id, label)); } +template <> bool IsConcept(const mermaid_t &d, std::string const &cpt) +{ + return d.search( + std::string("class ") + d.get_alias(cpt) + " \\{\\n\\s+<>"); +} + template <> bool IsConceptRequirement( const mermaid_t &d, std::string const &cpt, std::string requirement) @@ -1354,8 +1445,13 @@ template <> bool IsSystemHeader(const mermaid_t &d, std::string const &path) template bool IsNamespacePackage(const mermaid_t &d, Args... args) { + if (d.diagram_type == class_diagram::model::diagram_t::kClass) { + std::vector toks{{args...}}; + return d.contains(fmt::format("[\"{}", fmt::join(toks, "::"))); + } + const auto &name = get_last(args...); - return d.contains("subgraph " + d.get_alias(name)); + return d.contains(fmt::format("subgraph {}", d.get_alias(name))); } template @@ -1394,32 +1490,44 @@ template <> bool HasTitle(const json_t &d, std::string const &str) return d.src.contains("title") && d.src["title"] == str; } -template <> bool IsAbstractClass(const json_t &d, std::string name) +template <> bool IsAbstractClass(const json_t &d, QualifiedName cls) { - auto e = get_element(d.src, expand_name(d.src, name)); + auto e = get_element(d.src, expand_name(d.src, cls)); return e && e->at("type") == "class" && e->at("is_abstract"); } -template <> bool IsEnum(const json_t &d, std::string name) +template <> bool IsEnum(const json_t &d, QualifiedName enm) { - auto e = get_element(d.src, expand_name(d.src, name)); + auto e = get_element(d.src, expand_name(d.src, enm)); return e && e->at("type") == "enum"; } -template <> bool IsClass(const json_t &d, std::string name) +template <> bool IsUnion(const json_t &d, QualifiedName enm) { - auto e = get_element(d.src, expand_name(d.src, name)); + auto e = get_element(d.src, expand_name(d.src, enm)); + return e && e->at("type") == "class" && e->at("is_union"); +} + +template <> bool IsClass(const json_t &d, QualifiedName cls) +{ + auto e = get_element(d.src, expand_name(d.src, cls)); return e && e->at("type") == "class" && !e->at("is_abstract"); } -template <> bool IsClassTemplate(const json_t &d, std::string name) +template <> bool IsClassTemplate(const json_t &d, QualifiedName cls) { - auto e = get_element(d.src, expand_name(d.src, name)); + auto e = get_element(d.src, expand_name(d.src, cls)); return e && e->at("type") == "class"; } +template <> bool IsAbstractClassTemplate(const json_t &d, QualifiedName cls) +{ + auto e = get_element(d.src, expand_name(d.src, cls)); + return e && e->at("type") == "class" && e->at("is_abstract"); +} + template <> -bool IsBaseClass(const json_t &d, std::string base, std::string subclass) +bool IsBaseClass(const json_t &d, QualifiedName base, QualifiedName subclass) { const auto &j = d.src; auto base_el = get_element(j, expand_name(j, base)); @@ -1459,8 +1567,8 @@ bool IsMethod(const json_t &d, const std::string &cls, std::string const &name, const nlohmann::json &methods = (*sc)["methods"]; - return std::find_if(methods.begin(), methods.end(), [&](const auto &it) { - return it["name"] == name; + return std::find_if(methods.begin(), methods.end(), [name](const auto &it) { + return it["display_name"] == name; }) != methods.end(); } @@ -1522,7 +1630,7 @@ bool IsComposition(const json_t &d, std::string const &from, const auto &j = d.src; auto rel = get_relationship( - j, expand_name(j, to), expand_name(j, from), "composition", label); + j, expand_name(j, from), expand_name(j, to), "composition", label); if (rel == j["relationships"].end()) return false; @@ -1591,8 +1699,8 @@ bool IsInstantiation(const json_t &d, std::string const &from, } template <> -bool IsDependency(const json_t &d, std::string const &from, - std::string const &to, std::string style) +bool IsDependency( + const json_t &d, QualifiedName from, QualifiedName to, std::string style) { const auto &j = d.src; @@ -1655,18 +1763,48 @@ bool IsIncludeDependency( return true; } +template <> bool IsConcept(const json_t &d, std::string const &cpt) +{ + const auto &j = d.src; + + auto e = get_element(j, expand_name(j, cpt)); + return e && e->at("type") == "concept"; +} + template <> bool IsConstraint(const json_t &d, std::string const &from, std::string const &to, std::string label, std::string style) { - return false; + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, from), expand_name(j, to), "constraint", label); + + if (rel == j["relationships"].end()) + return false; + + if ((*rel)["label"] != label) + return false; + + return true; } template <> bool IsConceptRequirement( const json_t &d, std::string const &cpt, std::string requirement) { - return false; + const auto &j = d.src; + + auto e = get_element(j, expand_name(j, cpt)); + + if (!e) + return false; + + const nlohmann::json &statements = (*e)["statements"]; + + return std::find_if(statements.begin(), statements.end(), + [requirement](const auto &it) { return it == requirement; }) != + statements.end(); } template <>