From 235533d9fa3bbf0654af415506587863620072e1 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 12 May 2024 00:45:45 +0200 Subject: [PATCH] WIP --- tests/CMakeLists.txt | 2 +- tests/t00002/test_case.h | 204 +--- tests/t00003/test_case.h | 138 +-- tests/t00004/test_case.h | 117 +- tests/t00005/test_case.h | 142 +-- tests/t00006/test_case.h | 165 +-- tests/t00007/test_case.h | 62 +- tests/t00008/test_case.h | 102 +- tests/t00009/test_case.h | 94 +- tests/t00010/test_case.h | 73 +- tests/t00011/test_case.h | 57 +- tests/t00012/test_case.h | 69 +- tests/t00013/test_case.h | 120 +- tests/t00014/test_case.h | 528 ++++---- tests/t00015/test_case.h | 53 +- tests/t00016/test_case.h | 85 +- tests/t00017/test_case.h | 148 +-- tests/t00018/test_case.h | 54 +- tests/t00019/test_case.h | 116 +- tests/t00020/test_case.h | 101 +- tests/t00021/test_case.h | 57 +- tests/t00022/test_case.h | 45 +- tests/t00023/test_case.h | 46 +- tests/t00024/test_case.h | 61 +- tests/t00025/test_case.h | 86 +- tests/t00026/test_case.h | 59 +- tests/t00027/test_case.h | 29 +- tests/t00028/test_case.h | 161 ++- tests/t00029/test_case.h | 81 +- tests/t00030/test_case.h | 67 +- tests/t30001/test_case.h | 127 +- tests/t30002/test_case.h | 308 +++-- tests/t30003/test_case.h | 69 +- tests/t30004/test_case.h | 19 +- tests/t30005/test_case.h | 24 +- tests/t30006/test_case.h | 17 +- tests/t30007/test_case.h | 93 +- tests/t30008/test_case.h | 136 ++- tests/t30009/test_case.h | 103 +- tests/t30010/test_case.h | 109 +- tests/t30011/test_case.h | 118 +- tests/t30012/test_case.h | 15 +- tests/t30013/test_case.h | 276 +++-- tests/t30014/test_case.h | 15 +- tests/t30015/test_case.h | 283 +++-- tests/t40001/test_case.h | 102 +- tests/t40002/test_case.h | 180 +-- tests/t40003/test_case.h | 88 +- tests/test_cases.cc | 735 ++++++++++- tests/test_cases.h | 1819 +++++++++++++++++++++++++++- tests/test_thread_pool_executor.cc | 6 +- tests/test_util.cc | 33 +- 52 files changed, 4641 insertions(+), 3156 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3ce15f5f..dec53b5c 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 + target_sources(${TEST_NAME} PUBLIC ${TEST_NAME}.cc test_cases_checks.h ${TEST_CASE_SOURCES} catch.h) else() target_sources(${TEST_NAME} PUBLIC ${TEST_NAME}.cc catch.h) diff --git a/tests/t00002/test_case.h b/tests/t00002/test_case.h index 9235c7af..463c0675 100644 --- a/tests/t00002/test_case.h +++ b/tests/t00002/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00002/test_case.cc + * tests/t00002/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,11 +16,10 @@ * limitations under the License. */ -#include "../test_cases.h" - TEST_CASE("t00002") { using namespace clanguml::test; + using namespace std::string_literals; auto [config, db] = load_config("t00002"); @@ -40,158 +39,69 @@ TEST_CASE("t00002") REQUIRE(!model->should_include({"std"}, "vector")); CHECK_CLASS_DIAGRAM( - diagram, *model, + config, diagram, *model, // Common test case for all diagram types [](const auto &src) { + REQUIRE(HasTitle(src, "Basic class diagram example")); + REQUIRE(!IsClass(src, "NOSUCHCLASS")); - REQUIRE(IsClass(src, "A")); + REQUIRE(IsAbstractClass(src, "A")); + REQUIRE(IsClass(src, "B")); + REQUIRE(IsClass(src, "C")); + REQUIRE(IsClass(src, "D")); + REQUIRE(IsBaseClass(src, "A", "B")); + REQUIRE(IsBaseClass(src, "A", "C")); + REQUIRE(IsBaseClass(src, "B", "D")); + REQUIRE(IsBaseClass(src, "C", "D")); + + REQUIRE(IsMethod(src, "A", "foo_a")); + REQUIRE(IsMethod(src, "C", "foo_c")); + + REQUIRE(IsAssociation(src, "D", "A", "as")); + + REQUIRE(HasNote(src, "A", "left", "This is class A")); + REQUIRE(HasNote(src, "B", "top", "This is class B")); + + REQUIRE(HasLink(src, "A", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t00002/t00002.cc#L7", + clanguml::util::get_git_commit()), + "This is class A")); + + REQUIRE(HasLink(src, "B", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t00002/t00002.cc#L16", + clanguml::util::get_git_commit()), + "This is class B")); + + REQUIRE(HasMemberLink(src, "+foo_a() : void", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t00002/t00002.cc#L18", + clanguml::util::get_git_commit()), + "foo_a")); + + REQUIRE(HasMemberLink(src, "-as : std::vector", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t00002/t00002.cc#L83", + clanguml::util::get_git_commit()), + "as")); + }, + // Specific test case only for PlantUML diagram + [](const plantuml_t &src) { + REQUIRE(StartsWith(src, "@startuml"s)); + REQUIRE(EndsWith(src, "@enduml\n"s)); }, // Specific test case only for JSON diagram [](const json_t &src) { const auto &A = get_element(src, "A"); - CHECK(A.has_value()); + REQUIRE(A.has_value()); - CHECK(A.value()["type"] == "class"); - CHECK(A.value()["name"] == "A"); - CHECK(A.value()["display_name"] == "A"); - CHECK(A.value()["namespace"] == "clanguml::t00002"); - CHECK(A.value()["source_location"]["file"] == "t00002.cc"); - CHECK(A.value()["source_location"]["line"] == 7); + REQUIRE(A.value()["type"] == "class"); + REQUIRE(A.value()["name"] == "A"); + REQUIRE(A.value()["display_name"] == "A"); + REQUIRE(A.value()["namespace"] == "clanguml::t00002"); + REQUIRE(A.value()["source_location"]["file"] == "t00002.cc"); + REQUIRE(A.value()["source_location"]["line"] == 7); }); - - // auto src = render_class_diagram(diagram, *model); - - /* - - - { - auto puml = generate_class_puml(diagram, *model); - AliasMatcher _A(puml); - - REQUIRE_THAT(puml, StartsWith("@startuml")); - REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, HasTitle("Basic class diagram example")); - REQUIRE_THAT(puml, IsAbstractClass(_A("A"))); - REQUIRE_THAT(puml, IsClass(_A("B"))); - REQUIRE_THAT(puml, IsClass(_A("C"))); - REQUIRE_THAT(puml, IsClass(_A("D"))); - REQUIRE_THAT(puml, IsBaseClass(_A("A"), _A("B"))); - REQUIRE_THAT(puml, IsBaseClass(_A("A"), _A("C"))); - REQUIRE_THAT(puml, IsBaseClass(_A("B"), _A("D"))); - REQUIRE_THAT(puml, IsBaseClass(_A("C"), _A("D"))); - REQUIRE_THAT(puml, (IsMethod("foo_a"))); - REQUIRE_THAT(puml, (IsMethod("foo_c"))); - - REQUIRE_THAT(puml, IsAssociation(_A("D"), _A("A"), "-as")); - - REQUIRE_THAT(puml, HasNote(_A("A"), "left", "This is class A")); - REQUIRE_THAT(puml, HasNote(_A("B"), "top", "This is class B")); - - REQUIRE_THAT(puml, - HasLink(_A("A"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t00002/t00002.cc#L7", - clanguml::util::get_git_commit()), - "This is class A")); - - REQUIRE_THAT(puml, - HasLink(_A("B"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t00002/t00002.cc#L16", - clanguml::util::get_git_commit()), - "This is class B")); - - REQUIRE_THAT(puml, - HasMemberLink("+foo_a() : void", - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t00002/t00002.cc#L18", - clanguml::util::get_git_commit()), - "foo_a")); - - REQUIRE_THAT(puml, - HasMemberLink("-as : std::vector", - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t00002/t00002.cc#L83", - clanguml::util::get_git_commit()), - "as")); - - save_puml(config.output_directory(), diagram->name + ".puml", puml); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - const auto &A = get_element(j, "A"); - - CHECK(A.has_value()); - - CHECK(A.value()["type"] == "class"); - CHECK(A.value()["name"] == "A"); - CHECK(A.value()["display_name"] == "A"); - CHECK(A.value()["namespace"] == "clanguml::t00002"); - CHECK(A.value()["source_location"]["file"] == "t00002.cc"); - CHECK(A.value()["source_location"]["line"] == 7); - - REQUIRE(HasTitle(j, "Basic class diagram example")); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B")); - REQUIRE(IsClass(j, "C")); - REQUIRE(IsBaseClass(j, "A", "B")); - REQUIRE(IsBaseClass(j, "A", "C")); - REQUIRE(IsBaseClass(j, "B", "D")); - REQUIRE(IsBaseClass(j, "C", "D")); - REQUIRE(IsMethod(j, "A", "foo_a")); - REQUIRE(IsMethod(j, "C", "foo_c")); - REQUIRE(IsField(j, "E", "as", "std::vector")); - REQUIRE(IsAssociation(j, "D", "A", "as")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto mmd = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(mmd); - using mermaid::HasNote; - using mermaid::HasTitle; - using mermaid::IsAbstractClass; - - REQUIRE_THAT(mmd, HasTitle("Basic class diagram example")); - REQUIRE_THAT(mmd, Contains("classDiagram")); - REQUIRE_THAT(mmd, IsAbstractClass(_A("A"))); - REQUIRE_THAT(mmd, IsClass(_A("B"))); - REQUIRE_THAT(mmd, IsClass(_A("C"))); - REQUIRE_THAT(mmd, IsClass(_A("D"))); - REQUIRE_THAT(mmd, IsBaseClass(_A("A"), _A("B"))); - REQUIRE_THAT(mmd, IsBaseClass(_A("A"), _A("C"))); - REQUIRE_THAT(mmd, IsBaseClass(_A("B"), _A("D"))); - REQUIRE_THAT(mmd, IsBaseClass(_A("C"), _A("D"))); - - REQUIRE_THAT(mmd, IsAssociation(_A("D"), _A("A"), "-as")); - - REQUIRE_THAT(mmd, (mermaid::IsMethod("foo_a"))); - REQUIRE_THAT(mmd, (mermaid::IsMethod("foo_c"))); - - REQUIRE_THAT(mmd, HasNote(_A("A"), "left", "This is class A")); - REQUIRE_THAT(mmd, HasNote(_A("B"), "top", "This is class B")); - - REQUIRE_THAT(mmd, - mermaid::HasLink(_A("A"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t00002/t00002.cc#L7", - clanguml::util::get_git_commit()), - "This is class A")); - - REQUIRE_THAT(mmd, - mermaid::HasLink(_A("B"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t00002/t00002.cc#L16", - clanguml::util::get_git_commit()), - "This is class B")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", - mmd); - } - */ } \ No newline at end of file diff --git a/tests/t00003/test_case.h b/tests/t00003/test_case.h index 9fc98f5a..64f4eae0 100644 --- a/tests/t00003/test_case.h +++ b/tests/t00003/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00003/test_case.cc + * tests/t00003/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,13 @@ * limitations under the License. */ -TEST_CASE("t00003", "[test-case][class]") +// #include "../test_cases.h" + +TEST_CASE("t00003") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t00003"); auto diagram = config.diagrams["t00003_class"]; @@ -32,111 +37,40 @@ TEST_CASE("t00003", "[test-case][class]") REQUIRE(model->name() == "t00003_class"); - { - auto puml = generate_class_puml(diagram, *model); - AliasMatcher _A(puml); + CHECK_CLASS_DIAGRAM(config, diagram, *model, + [](const auto &src) { + REQUIRE(IsClass(src, "A")); - REQUIRE_THAT(puml, StartsWith("@startuml")); - REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, IsClass(_A("A"))); + REQUIRE(!IsDependency(src, "A", "A")); - REQUIRE_THAT(puml, !IsDependency(_A("A"), _A("A"))); + REQUIRE(IsMethod(src, "A", "A")); + REQUIRE(IsMethod(src, "A", "A", "void", "A &&")); + REQUIRE( + IsMethod(src, "A", "A", "void", "const A &")); - REQUIRE_THAT(puml, (IsMethod("A"))); - REQUIRE_THAT(puml, (IsMethod("A", "void", "A &&"))); - REQUIRE_THAT( - puml, (IsMethod("A", "void", "const A &"))); + REQUIRE(IsMethod(src, "A", "~A")); - REQUIRE_THAT(puml, (IsMethod("~A"))); + REQUIRE(IsMethod(src, "A", "basic_method")); + REQUIRE(IsMethod(src, "A", "static_method", "int")); + REQUIRE(IsMethod(src, "A", "const_method")); + REQUIRE( + IsMethod(src, "A", "default_int", "int", "int i = 12")); + REQUIRE(IsMethod(src, "A", "default_string", "std::string", + "int i, std::string s = \"abc\"")); - REQUIRE_THAT(puml, (IsMethod("basic_method"))); - REQUIRE_THAT(puml, (IsMethod("static_method", "int"))); - REQUIRE_THAT(puml, (IsMethod("const_method"))); - REQUIRE_THAT( - puml, (IsMethod("default_int", "int", "int i = 12"))); - REQUIRE_THAT(puml, - (IsMethod("default_string", "std::string", - "int i, std::string s = \"abc\""))); + REQUIRE(IsMethod( + src, "A", "size", "std::size_t")); - REQUIRE_THAT( - puml, (IsMethod("size", "std::size_t"))); + REQUIRE(IsMethod(src, "A", "protected_method")); + REQUIRE(IsMethod(src, "A", "private_method")); + REQUIRE(IsField(src, "A", "public_member", "int")); + REQUIRE(IsField(src, "A", "protected_member", "int")); + REQUIRE(IsField(src, "A", "private_member", "int")); + REQUIRE(IsField( + src, "A", "auto_member", "const unsigned long")); - REQUIRE_THAT(puml, (IsMethod("protected_method"))); - REQUIRE_THAT(puml, (IsMethod("private_method"))); - REQUIRE_THAT(puml, (IsField("public_member", "int"))); - REQUIRE_THAT(puml, (IsField("protected_member", "int"))); - REQUIRE_THAT(puml, (IsField("private_member", "int"))); - REQUIRE_THAT(puml, - (IsField("auto_member", "const unsigned long"))); - - REQUIRE_THAT(puml, (IsField("a_", "int"))); - REQUIRE_THAT(puml, (IsField("b_", "int"))); - REQUIRE_THAT(puml, (IsField("c_", "int"))); - - save_puml(config.output_directory(), diagram->name + ".puml", puml); - } - - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsMethod(j, "A", "A")); - REQUIRE(IsMethod(j, "A", "~A")); - REQUIRE(IsMethod(j, "A", "basic_method")); - REQUIRE(IsMethod(j, "A", "static_method")); - REQUIRE(IsMethod(j, "A", "const_method")); - REQUIRE(IsMethod(j, "A", "default_int")); - REQUIRE(IsMethod(j, "A", "default_string")); - - REQUIRE(!IsDependency(j, "A", "A")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto mmd = generate_class_mermaid(diagram, *model); - mermaid::AliasMatcher _A(mmd); - - REQUIRE_THAT(mmd, IsClass(_A("A"))); - - REQUIRE_THAT(mmd, !IsDependency(_A("A"), _A("A"))); - - REQUIRE_THAT(mmd, (mermaid::IsMethod("A"))); - REQUIRE_THAT( - mmd, (mermaid::IsMethod("A", "void", "A &&"))); - REQUIRE_THAT(mmd, - (mermaid::IsMethod("A", "void", "const A &"))); - - REQUIRE_THAT(mmd, (mermaid::IsMethod("~A"))); - - REQUIRE_THAT(mmd, (mermaid::IsMethod("basic_method"))); - REQUIRE_THAT( - mmd, (mermaid::IsMethod("static_method", "int"))); - REQUIRE_THAT(mmd, (mermaid::IsMethod("const_method"))); - REQUIRE_THAT(mmd, - (mermaid::IsMethod("default_int", "int", "int i = 12"))); - REQUIRE_THAT(mmd, - (mermaid::IsMethod("default_string", "std::string", - "int i, std::string s = \"abc\""))); - - REQUIRE_THAT(mmd, - (mermaid::IsMethod( - "size", "std::size_t"))); - - REQUIRE_THAT(mmd, (mermaid::IsMethod("protected_method"))); - REQUIRE_THAT(mmd, (mermaid::IsMethod("private_method"))); - - REQUIRE_THAT(mmd, (IsField("public_member", "int"))); - REQUIRE_THAT(mmd, (IsField("protected_member", "int"))); - REQUIRE_THAT(mmd, (IsField("private_member", "int"))); - REQUIRE_THAT(mmd, - (IsField("auto_member", "const unsigned long"))); - - REQUIRE_THAT(mmd, (IsField("a_", "int"))); - REQUIRE_THAT(mmd, (IsField("b_", "int"))); - REQUIRE_THAT(mmd, (IsField("c_", "int"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", mmd); - } + REQUIRE(IsField(src, "A", "a_", "int")); + REQUIRE(IsField(src, "A", "b_", "int")); + REQUIRE(IsField(src, "A", "c_", "int")); + }); } \ No newline at end of file diff --git a/tests/t00004/test_case.h b/tests/t00004/test_case.h index 1cf42b89..71a24a4a 100644 --- a/tests/t00004/test_case.h +++ b/tests/t00004/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00004/test_case.cc + * tests/t00004/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00004", "[test-case][class]") +TEST_CASE("t00004") { + using namespace clanguml::test; + auto [config, db] = load_config("t00004"); auto diagram = config.diagrams["t00004_class"]; @@ -31,94 +33,33 @@ TEST_CASE("t00004", "[test-case][class]") REQUIRE(model->name() == "t00004_class"); - { - auto puml = generate_class_puml(diagram, *model); - AliasMatcher _A(puml); + CHECK_CLASS_DIAGRAM(config, diagram, *model, + [](const auto &src) { + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "A::AA")); + REQUIRE(IsClass(src, "A::AA::AAA")); + REQUIRE(IsEnum(src, "B::AA")); + REQUIRE(IsEnum(src, "A::AA::Lights")); + REQUIRE(IsInnerClass(src, "A", "A::AA")); + REQUIRE(IsInnerClass(src, "A::AA", "A::AA::AAA")); + REQUIRE(IsInnerClass(src, "A::AA", "A::AA::Lights")); - REQUIRE_THAT(puml, StartsWith("@startuml")); - REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, IsClass(_A("A"))); - REQUIRE_THAT(puml, IsClass(_A("A::AA"))); - REQUIRE_THAT(puml, IsClass(_A("A::AA::AAA"))); - REQUIRE_THAT(puml, IsEnum(_A("B::AA"))); - REQUIRE_THAT(puml, IsEnum(_A("A::AA::Lights"))); - REQUIRE_THAT(puml, IsInnerClass(_A("A"), _A("A::AA"))); - REQUIRE_THAT(puml, IsInnerClass(_A("A::AA"), _A("A::AA::AAA"))); - REQUIRE_THAT(puml, IsInnerClass(_A("A::AA"), _A("A::AA::Lights"))); + REQUIRE(IsMethod(src, "A", "foo")); + REQUIRE(IsMethod(src, "A", "foo2")); - REQUIRE_THAT(puml, (IsMethod("foo"))); - REQUIRE_THAT(puml, (IsMethod("foo2"))); + REQUIRE(IsClassTemplate(src, "C")); + REQUIRE(IsInnerClass(src, "C", "C::AA")); + REQUIRE(IsInnerClass(src, "C::AA", "C::AA::AAA")); + REQUIRE(IsInnerClass(src, "C", "C::CC")); + REQUIRE(IsInnerClass(src, "C::AA", "C::AA::CCC")); - REQUIRE_THAT(puml, IsClassTemplate("C", "T")); - REQUIRE_THAT(puml, IsInnerClass(_A("C"), _A("C::AA"))); - REQUIRE_THAT(puml, IsInnerClass(_A("C::AA"), _A("C::AA::AAA"))); - REQUIRE_THAT(puml, IsInnerClass(_A("C"), _A("C::CC"))); - REQUIRE_THAT(puml, IsInnerClass(_A("C::AA"), _A("C::AA::CCC"))); + REQUIRE(IsInnerClass(src, "C", "C::B")); + REQUIRE(IsAggregation(src, "C", "C::B", "b_int")); + REQUIRE(!IsInnerClass(src, "C", "C::B")); + REQUIRE(IsInstantiation(src, "C::B", "C::B")); - REQUIRE_THAT(puml, IsInnerClass(_A("C"), _A("C::B"))); - REQUIRE_THAT( - puml, IsAggregation(_A("C"), _A("C::B"), "+b_int")); - REQUIRE_THAT(puml, !IsInnerClass(_A("C"), _A("C::B"))); - REQUIRE_THAT(puml, IsInstantiation(_A("C::B"), _A("C::B"))); - - REQUIRE_THAT(puml, IsClass(_A("detail::D"))); - REQUIRE_THAT(puml, IsClass(_A("detail::D::DD"))); - REQUIRE_THAT(puml, IsEnum(_A("detail::D::AA"))); - - save_puml(config.output_directory(), diagram->name + ".puml", puml); - } - - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "A::AA")); - REQUIRE(IsClass(j, "A::AA::AAA")); - REQUIRE(IsEnum(j, "B::AA")); - REQUIRE(IsEnum(j, "A::AA::Lights")); - REQUIRE(IsInnerClass(j, "A", "A::AA")); - REQUIRE(IsInnerClass(j, "A::AA", "A::AA::AAA")); - REQUIRE(IsInnerClass(j, "A::AA", "A::AA::Lights")); - - REQUIRE(IsClassTemplate(j, "C")); - - REQUIRE(IsClass(j, "detail::D")); - REQUIRE(IsClass(j, "detail::D::DD")); - REQUIRE(IsEnum(j, "detail::D::AA")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto mmd = generate_class_mermaid(diagram, *model); - mermaid::AliasMatcher _A(mmd); - - REQUIRE_THAT(mmd, IsClass(_A("A"))); - REQUIRE_THAT(mmd, IsClass(_A("A::AA"))); - REQUIRE_THAT(mmd, IsClass(_A("A::AA::AAA"))); - REQUIRE_THAT(mmd, mermaid::IsEnum(_A("B::AA"))); - REQUIRE_THAT(mmd, mermaid::IsEnum(_A("A::AA::Lights"))); - REQUIRE_THAT(mmd, mermaid::IsInnerClass(_A("A"), _A("A::AA"))); - REQUIRE_THAT(mmd, mermaid::IsInnerClass(_A("A::AA"), _A("A::AA::AAA"))); - REQUIRE_THAT( - mmd, mermaid::IsInnerClass(_A("A::AA"), _A("A::AA::Lights"))); - - REQUIRE_THAT(mmd, IsClass(_A("C"))); - REQUIRE_THAT(mmd, mermaid::IsInnerClass(_A("C"), _A("C::AA"))); - REQUIRE_THAT(mmd, mermaid::IsInnerClass(_A("C::AA"), _A("C::AA::AAA"))); - REQUIRE_THAT(mmd, mermaid::IsInnerClass(_A("C"), _A("C::CC"))); - REQUIRE_THAT(mmd, mermaid::IsInnerClass(_A("C::AA"), _A("C::AA::CCC"))); - - REQUIRE_THAT(mmd, mermaid::IsInnerClass(_A("C"), _A("C::B"))); - REQUIRE_THAT(mmd, IsAggregation(_A("C"), _A("C::B"), "+b_int")); - REQUIRE_THAT(mmd, !mermaid::IsInnerClass(_A("C"), _A("C::B"))); - REQUIRE_THAT(mmd, IsInstantiation(_A("C::B"), _A("C::B"))); - - REQUIRE_THAT(mmd, IsClass(_A("detail::D"))); - REQUIRE_THAT(mmd, IsClass(_A("detail::D::DD"))); - REQUIRE_THAT(mmd, mermaid::IsEnum(_A("detail::D::AA"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", mmd); - } + REQUIRE(IsClass(src, "detail::D")); + REQUIRE(IsClass(src, "detail::D::DD")); + REQUIRE(IsEnum(src, "detail::D::AA")); + }); } \ No newline at end of file diff --git a/tests/t00005/test_case.h b/tests/t00005/test_case.h index b759a51f..1a6a5aff 100644 --- a/tests/t00005/test_case.h +++ b/tests/t00005/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00005/test_case.cc + * tests/t00005/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00005", "[test-case][class]") +TEST_CASE("t00005") { + using namespace clanguml::test; + auto [config, db] = load_config("t00005"); auto diagram = config.diagrams["t00005_class"]; @@ -28,112 +30,36 @@ TEST_CASE("t00005", "[test-case][class]") REQUIRE(model->name() == "t00005_class"); - { - auto puml = generate_class_puml(diagram, *model); - AliasMatcher _A(puml); + 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(IsClass(src, "K")); + REQUIRE(IsClass(src, "R")); - REQUIRE_THAT(puml, StartsWith("@startuml")); - REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, IsClass(_A("A"))); - REQUIRE_THAT(puml, IsClass(_A("B"))); - REQUIRE_THAT(puml, IsClass(_A("C"))); - REQUIRE_THAT(puml, IsClass(_A("D"))); - REQUIRE_THAT(puml, IsClass(_A("E"))); - REQUIRE_THAT(puml, IsClass(_A("F"))); - REQUIRE_THAT(puml, IsClass(_A("G"))); - REQUIRE_THAT(puml, IsClass(_A("H"))); - REQUIRE_THAT(puml, IsClass(_A("I"))); - REQUIRE_THAT(puml, IsClass(_A("J"))); - REQUIRE_THAT(puml, IsClass(_A("K"))); - REQUIRE_THAT(puml, IsClass(_A("R"))); + REQUIRE((IsField(src, "R", "some_int", "int"))); + REQUIRE((IsField(src, "R", "some_int_pointer", "int *"))); + REQUIRE((IsField( + src, "R", "some_int_pointer_pointer", "int **"))); - REQUIRE_THAT(puml, (IsField("some_int", "int"))); - REQUIRE_THAT(puml, (IsField("some_int_pointer", "int *"))); - REQUIRE_THAT( - puml, (IsField("some_int_pointer_pointer", "int **"))); - - REQUIRE_THAT(puml, IsAggregation(_A("R"), _A("A"), "+a")); - REQUIRE_THAT(puml, IsAssociation(_A("R"), _A("B"), "+b")); - REQUIRE_THAT(puml, IsAssociation(_A("R"), _A("C"), "+c")); - REQUIRE_THAT(puml, IsAssociation(_A("R"), _A("D"), "+d")); - REQUIRE_THAT(puml, IsAssociation(_A("R"), _A("E"), "+e")); - REQUIRE_THAT(puml, IsAggregation(_A("R"), _A("F"), "+f")); - REQUIRE_THAT(puml, IsAssociation(_A("R"), _A("G"), "+g")); - REQUIRE_THAT(puml, IsAssociation(_A("R"), _A("H"), "+h")); - REQUIRE_THAT(puml, IsAssociation(_A("R"), _A("I"), "+i")); - REQUIRE_THAT(puml, IsAssociation(_A("R"), _A("J"), "+j")); - REQUIRE_THAT(puml, IsAssociation(_A("R"), _A("K"), "+k")); - - save_puml(config.output_directory(), diagram->name + ".puml", puml); - } - - { - 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, "D")); - REQUIRE(IsClass(j, "E")); - REQUIRE(IsClass(j, "F")); - REQUIRE(IsClass(j, "G")); - REQUIRE(IsClass(j, "H")); - REQUIRE(IsClass(j, "I")); - REQUIRE(IsClass(j, "J")); - REQUIRE(IsClass(j, "K")); - REQUIRE(IsClass(j, "R")); - - REQUIRE(IsAggregation(j, "R", "A", "a")); - REQUIRE(IsAssociation(j, "R", "B", "b")); - REQUIRE(IsAssociation(j, "R", "C", "c")); - REQUIRE(IsAssociation(j, "R", "D", "d")); - REQUIRE(IsAssociation(j, "R", "E", "e")); - REQUIRE(IsAggregation(j, "R", "F", "f")); - REQUIRE(IsAssociation(j, "R", "G", "g")); - REQUIRE(IsAssociation(j, "R", "H", "h")); - REQUIRE(IsAssociation(j, "R", "I", "i")); - REQUIRE(IsAssociation(j, "R", "J", "j")); - REQUIRE(IsAssociation(j, "R", "K", "k")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto mmd = generate_class_mermaid(diagram, *model); - mermaid::AliasMatcher _A(mmd); - - REQUIRE_THAT(mmd, StartsWith("classDiagram")); - REQUIRE_THAT(mmd, IsClass(_A("A"))); - REQUIRE_THAT(mmd, IsClass(_A("B"))); - REQUIRE_THAT(mmd, IsClass(_A("C"))); - REQUIRE_THAT(mmd, IsClass(_A("D"))); - REQUIRE_THAT(mmd, IsClass(_A("E"))); - REQUIRE_THAT(mmd, IsClass(_A("F"))); - REQUIRE_THAT(mmd, IsClass(_A("G"))); - REQUIRE_THAT(mmd, IsClass(_A("H"))); - REQUIRE_THAT(mmd, IsClass(_A("I"))); - REQUIRE_THAT(mmd, IsClass(_A("J"))); - REQUIRE_THAT(mmd, IsClass(_A("K"))); - REQUIRE_THAT(mmd, IsClass(_A("R"))); - - REQUIRE_THAT(mmd, (IsField("some_int", "int"))); - REQUIRE_THAT(mmd, (IsField("some_int_pointer", "int *"))); - REQUIRE_THAT( - mmd, (IsField("some_int_pointer_pointer", "int **"))); - - REQUIRE_THAT(mmd, IsAggregation(_A("R"), _A("A"), "+a")); - REQUIRE_THAT(mmd, IsAssociation(_A("R"), _A("B"), "+b")); - REQUIRE_THAT(mmd, IsAssociation(_A("R"), _A("C"), "+c")); - REQUIRE_THAT(mmd, IsAssociation(_A("R"), _A("D"), "+d")); - REQUIRE_THAT(mmd, IsAssociation(_A("R"), _A("E"), "+e")); - REQUIRE_THAT(mmd, IsAggregation(_A("R"), _A("F"), "+f")); - REQUIRE_THAT(mmd, IsAssociation(_A("R"), _A("G"), "+g")); - REQUIRE_THAT(mmd, IsAssociation(_A("R"), _A("H"), "+h")); - REQUIRE_THAT(mmd, IsAssociation(_A("R"), _A("I"), "+i")); - REQUIRE_THAT(mmd, IsAssociation(_A("R"), _A("J"), "+j")); - REQUIRE_THAT(mmd, IsAssociation(_A("R"), _A("K"), "+k")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", mmd); - } + REQUIRE(IsAggregation(src, "R", "A", "a")); + REQUIRE(IsAssociation(src, "R", "B", "b")); + REQUIRE(IsAssociation(src, "R", "C", "c")); + REQUIRE(IsAssociation(src, "R", "D", "d")); + REQUIRE(IsAssociation(src, "R", "E", "e")); + REQUIRE(IsAggregation(src, "R", "F", "f")); + REQUIRE(IsAssociation(src, "R", "G", "g")); + REQUIRE(IsAssociation(src, "R", "H", "h")); + REQUIRE(IsAssociation(src, "R", "I", "i")); + REQUIRE(IsAssociation(src, "R", "J", "j")); + REQUIRE(IsAssociation(src, "R", "K", "k")); + }); } \ No newline at end of file diff --git a/tests/t00006/test_case.h b/tests/t00006/test_case.h index 7757aa7f..15372092 100644 --- a/tests/t00006/test_case.h +++ b/tests/t00006/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00006/test_case.cc + * tests/t00006/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00006", "[test-case][class]") +TEST_CASE("t00006") { + using namespace clanguml::test; + auto [config, db] = load_config("t00006"); auto diagram = config.diagrams["t00006_class"]; @@ -28,127 +30,44 @@ TEST_CASE("t00006", "[test-case][class]") REQUIRE(model->name() == "t00006_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(IsClass(src, "H")); + REQUIRE(IsClass(src, "I")); + REQUIRE(IsClass(src, "J")); + REQUIRE(IsClass(src, "K")); + REQUIRE(IsClass(src, "L")); + REQUIRE(IsClass(src, "M")); + REQUIRE(IsClass(src, "N")); + REQUIRE(IsClass(src, "NN")); + REQUIRE(IsClass(src, "NNN")); - 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"))); - REQUIRE_THAT(src, IsClass(_A("H"))); - REQUIRE_THAT(src, IsClass(_A("I"))); - REQUIRE_THAT(src, IsClass(_A("J"))); - REQUIRE_THAT(src, IsClass(_A("K"))); - REQUIRE_THAT(src, IsClass(_A("L"))); - REQUIRE_THAT(src, IsClass(_A("M"))); - REQUIRE_THAT(src, IsClass(_A("N"))); - REQUIRE_THAT(src, IsClass(_A("NN"))); - REQUIRE_THAT(src, IsClass(_A("NNN"))); + REQUIRE(IsInstantiation( + src, "custom_container", "custom_container")); - REQUIRE_THAT(src, - IsInstantiation( - _A("custom_container"), _A("custom_container"))); - - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("A"), "+a")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("B"), "+b")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("C"), "+c")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("D"), "+d")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("custom_container"), "+e")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("F"), "+f")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("G"), "+g")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("H"), "+h")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("I"), "+i")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("J"), "+j")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("K"), "+k")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("L"), "+lm")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("M"), "+lm")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("N"), "+ns")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("NN"), "+ns")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("NNN"), "+ns")); - - 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, "D")); - REQUIRE(IsClass(j, "E")); - REQUIRE(IsClass(j, "F")); - REQUIRE(IsClass(j, "G")); - REQUIRE(IsClass(j, "H")); - REQUIRE(IsClass(j, "I")); - REQUIRE(IsClass(j, "J")); - REQUIRE(IsClass(j, "K")); - REQUIRE(IsClass(j, "L")); - REQUIRE(IsClass(j, "M")); - REQUIRE(IsClass(j, "N")); - REQUIRE(IsClass(j, "NN")); - REQUIRE(IsClass(j, "NNN")); - - REQUIRE(IsAggregation(j, "R", "custom_container", "e")); - REQUIRE( - IsInstantiation(j, "custom_container", "custom_container")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - using mermaid::AliasMatcher; - - 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"))); - REQUIRE_THAT(src, IsClass(_A("H"))); - REQUIRE_THAT(src, IsClass(_A("I"))); - REQUIRE_THAT(src, IsClass(_A("J"))); - REQUIRE_THAT(src, IsClass(_A("K"))); - REQUIRE_THAT(src, IsClass(_A("L"))); - REQUIRE_THAT(src, IsClass(_A("M"))); - REQUIRE_THAT(src, IsClass(_A("N"))); - REQUIRE_THAT(src, IsClass(_A("NN"))); - REQUIRE_THAT(src, IsClass(_A("NNN"))); - - REQUIRE_THAT(src, - IsInstantiation( - _A("custom_container"), _A("custom_container"))); - - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("A"), "+a")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("B"), "+b")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("C"), "+c")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("D"), "+d")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("custom_container"), "+e")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("F"), "+f")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("G"), "+g")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("H"), "+h")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("I"), "+i")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("J"), "+j")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("K"), "+k")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("L"), "+lm")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("M"), "+lm")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("N"), "+ns")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("NN"), "+ns")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("NNN"), "+ns")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsAggregation(src, "R", "A", "a")); + REQUIRE(IsAssociation(src, "R", "B", "b")); + REQUIRE(IsAggregation(src, "R", "C", "c")); + REQUIRE(IsAssociation(src, "R", "D", "d")); + REQUIRE( + IsAggregation(src, "R", "custom_container", "e")); + REQUIRE(IsAggregation(src, "R", "F", "f")); + REQUIRE(IsAssociation(src, "R", "G", "g")); + REQUIRE(IsAggregation(src, "R", "H", "h")); + REQUIRE(IsAssociation(src, "R", "I", "i")); + REQUIRE(IsAggregation(src, "R", "J", "j")); + REQUIRE(IsAssociation(src, "R", "K", "k")); + REQUIRE(IsAggregation(src, "R", "L", "lm")); + REQUIRE(IsAggregation(src, "R", "M", "lm")); + REQUIRE(IsAggregation(src, "R", "N", "ns")); + REQUIRE(IsAggregation(src, "R", "NN", "ns")); + REQUIRE(IsAggregation(src, "R", "NNN", "ns")); + }); } \ No newline at end of file diff --git a/tests/t00007/test_case.h b/tests/t00007/test_case.h index 98bf9855..7de1274d 100644 --- a/tests/t00007/test_case.h +++ b/tests/t00007/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00007/test_case.cc + * tests/t00007/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00007", "[test-case][class]") +TEST_CASE("t00007") { + using namespace clanguml::test; + auto [config, db] = load_config("t00007"); auto diagram = config.diagrams["t00007_class"]; @@ -28,52 +30,14 @@ TEST_CASE("t00007", "[test-case][class]") REQUIRE(model->name() == "t00007_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, "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("R"))); - - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("A"), "+a")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("B"), "+b")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("C"), "+c")); - - 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, "R")); - REQUIRE(IsAggregation(j, "R", "A", "a")); - REQUIRE(IsAssociation(j, "R", "B", "b")); - REQUIRE(IsAssociation(j, "R", "C", "c")); - - 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("R"))); - - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("A"), "+a")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("B"), "+b")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("C"), "+c")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsAggregation(src, "R", "A", "a")); + REQUIRE(IsAssociation(src, "R", "B", "b")); + REQUIRE(IsAssociation(src, "R", "C", "c")); + }); } \ No newline at end of file diff --git a/tests/t00008/test_case.h b/tests/t00008/test_case.h index 480500be..6ca63719 100644 --- a/tests/t00008/test_case.h +++ b/tests/t00008/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00008/test_case.cc + * tests/t00008/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00008", "[test-case][class]") +TEST_CASE("t00008") { + using namespace clanguml::test; + auto [config, db] = load_config("t00008"); auto diagram = config.diagrams["t00008_class"]; @@ -28,73 +30,35 @@ TEST_CASE("t00008", "[test-case][class]") REQUIRE(model->name() == "t00008_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM( + config, diagram, *model, + [](const auto &src) { + // TODO: add option to resolve using declared types + // REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "B>")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - // TODO: add option to resolve using declared types - // REQUIRE_THAT(puml, IsClassTemplate("A", "T, P, bool (*)(int, int), - // int N")); - REQUIRE_THAT(src, IsClassTemplate("A", "T,P=T,CMP=nullptr,int N=3")); - REQUIRE_THAT(src, IsClassTemplate("B", "T,C<>")); + REQUIRE(IsField( + src, "A", "value", "T")); + REQUIRE(IsField( + src, "A", "pointer", "T *")); + REQUIRE(IsField( + src, "A", "reference", "T &")); + REQUIRE(IsField(src, "A", + "values", "std::vector

")); + REQUIRE(IsField(src, "A", "ints", + "std::array")); + // TODO: add option to resolve using declared types + // REQUIRE(IsField(src, Public("bool (*)(int, int) comparator")); + REQUIRE(IsField( + src, "A", "comparator", "CMP")); - REQUIRE_THAT(src, (IsField("value", "T"))); - REQUIRE_THAT(src, (IsField("pointer", "T *"))); - REQUIRE_THAT(src, (IsField("reference", "T &"))); - REQUIRE_THAT(src, (IsField("values", "std::vector

"))); - REQUIRE_THAT(src, (IsField("ints", "std::array"))); - // TODO: add option to resolve using declared types - // REQUIRE_THAT(puml, IsField(Public("bool (*)(int, int) comparator"))); - REQUIRE_THAT(src, (IsField("comparator", "CMP"))); - - REQUIRE_THAT(src, !IsClass(_A("E::nested_template"))); - REQUIRE_THAT(src, IsClassTemplate("E::nested_template", "ET")); - REQUIRE_THAT(src, IsClassTemplate("E::nested_template", "char")); - REQUIRE_THAT(src, - IsInstantiation( - _A("E::nested_template"), _A("E::nested_template"))); - - 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, "E::nested_template")); - REQUIRE(IsClass(j, "E::nested_template")); - - 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("B>"))); - - REQUIRE_THAT(src, (IsField("value", "T"))); - REQUIRE_THAT(src, (IsField("pointer", "T *"))); - REQUIRE_THAT(src, (IsField("reference", "T &"))); - REQUIRE_THAT(src, (IsField("values", "std::vector

"))); - REQUIRE_THAT(src, (IsField("ints", "std::array"))); - // TODO: add option to resolve using declared types - // REQUIRE_THAT(puml, IsField(Public("bool (*)(int, int) comparator"))); - REQUIRE_THAT(src, (IsField("comparator", "CMP"))); - - REQUIRE_THAT(src, !IsClass(_A("E::nested_template"))); - REQUIRE_THAT(src, IsClass(_A("E::nested_template"))); - REQUIRE_THAT(src, IsClass(_A("E::nested_template"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("E::nested_template"), _A("E::nested_template"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsClassTemplate(src, "E::nested_template")); + REQUIRE(IsClassTemplate(src, "E::nested_template")); + REQUIRE(IsInstantiation( + src, "E::nested_template", "E::nested_template")); + }, + [](const plantuml_t &src) { + REQUIRE(!IsClass(src, "E::nested_template")); + }); } \ No newline at end of file diff --git a/tests/t00009/test_case.h b/tests/t00009/test_case.h index 77885a25..10667f94 100644 --- a/tests/t00009/test_case.h +++ b/tests/t00009/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00009/test_case.cc + * tests/t00009/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00009", "[test-case][class]") +TEST_CASE("t00009") { + using namespace clanguml::test; + auto [config, db] = load_config("t00009"); auto diagram = config.diagrams["t00009_class"]; @@ -28,78 +30,24 @@ TEST_CASE("t00009", "[test-case][class]") REQUIRE(model->name() == "t00009_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(IsClass(src, "B")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClassTemplate("A", "T")); - REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE(IsField(src, "A", "value", "T")); + REQUIRE(IsField(src, "B", "aint", "A")); + REQUIRE(IsField(src, "B", "astring", "A *")); + REQUIRE(IsField( + src, "B", "avector", "A> &")); - REQUIRE_THAT(src, (IsField("value", "T"))); - REQUIRE_THAT(src, (IsField("aint", "A"))); - REQUIRE_THAT(src, (IsField("astring", "A *"))); - REQUIRE_THAT( - src, (IsField("avector", "A> &"))); + REQUIRE(IsInstantiation(src, "A", "A", "up")); + REQUIRE(IsInstantiation(src, "A", "A", "up")); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"), "up")); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"), "up")); - - REQUIRE_THAT( - src, IsAggregation(_A("B"), _A("A"), "+aint", "", "", "up")); - REQUIRE_THAT(src, - IsAssociation( - _A("B"), _A("A"), "+astring", "", "", "up")); - REQUIRE_THAT(src, - IsAssociation(_A("B"), _A("A>"), - "+avector", "", "", "up")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClassTemplate(j, "A")); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "A>")); - - REQUIRE(IsField(j, "A", "value", "T")); - REQUIRE(IsField(j, "B", "aint", "A")); - REQUIRE(IsField(j, "B", "astring", "A *")); - REQUIRE(IsField(j, "B", "avector", "A> &")); - - 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("B"))); - - REQUIRE_THAT(src, (IsField("value", "T"))); - REQUIRE_THAT(src, (IsField("aint", "A"))); - REQUIRE_THAT(src, (IsField("astring", "A *"))); - REQUIRE_THAT( - src, (IsField("avector", "A> &"))); - - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - - REQUIRE_THAT(src, IsAggregation(_A("B"), _A("A"), "+aint")); - REQUIRE_THAT( - src, IsAssociation(_A("B"), _A("A"), "+astring")); - REQUIRE_THAT(src, - IsAssociation( - _A("B"), _A("A>"), "+avector")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE( + IsAggregation(src, "B", "A", "aint", "", "", "up")); + REQUIRE(IsAssociation( + src, "B", "A", "astring", "", "", "up")); + REQUIRE(IsAssociation( + src, "B", "A>", "avector", "", "", "up")); + }); } \ No newline at end of file diff --git a/tests/t00010/test_case.h b/tests/t00010/test_case.h index 83dca628..e1d15a9c 100644 --- a/tests/t00010/test_case.h +++ b/tests/t00010/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00010/test_case.cc + * tests/t00010/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00010", "[test-case][class]") +TEST_CASE("t00010") { + using namespace clanguml::test; + auto [config, db] = load_config("t00010"); auto diagram = config.diagrams["t00010_class"]; @@ -28,63 +30,18 @@ TEST_CASE("t00010", "[test-case][class]") REQUIRE(model->name() == "t00010_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_THAT(src, IsClassTemplate("A", "T,P")); - REQUIRE_THAT(src, IsClassTemplate("B", "T")); + REQUIRE(IsField(src, "B", "astring", "A")); + REQUIRE(IsField(src, "C", "aintstring", "B")); - REQUIRE_THAT(src, (IsField("astring", "A"))); - REQUIRE_THAT(src, (IsField("aintstring", "B"))); + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "B", "B")); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("B"), _A("B"))); - - REQUIRE_THAT( - src, IsAggregation(_A("B"), _A("A"), "+astring")); - REQUIRE_THAT(src, IsAggregation(_A("C"), _A("B"), "+aintstring")); - - 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")); - REQUIRE(IsClass(j, "B")); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "B")); - - REQUIRE(IsField(j, "C", "aintstring", "B")); - - 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("B"))); - - REQUIRE_THAT(src, (IsField("astring", "A"))); - REQUIRE_THAT(src, (IsField("aintstring", "B"))); - - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("B"), _A("B"))); - - REQUIRE_THAT( - src, IsAggregation(_A("B"), _A("A"), "+astring")); - REQUIRE_THAT(src, IsAggregation(_A("C"), _A("B"), "+aintstring")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE( + IsAggregation(src, "B", "A", "astring")); + REQUIRE(IsAggregation(src, "C", "B", "aintstring")); + }); } \ No newline at end of file diff --git a/tests/t00011/test_case.h b/tests/t00011/test_case.h index a5c7d53a..115c41e6 100644 --- a/tests/t00011/test_case.h +++ b/tests/t00011/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00011/test_case.cc + * tests/t00011/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00011", "[test-case][class]") +TEST_CASE("t00011") { + using namespace clanguml::test; + auto [config, db] = load_config("t00011"); auto diagram = config.diagrams["t00011_class"]; @@ -28,48 +30,13 @@ TEST_CASE("t00011", "[test-case][class]") REQUIRE(model->name() == "t00011_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, "external::C")); + REQUIRE(IsClassTemplate(src, "D")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, !IsClass(_A("external::C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - - REQUIRE_THAT(src, IsAssociation(_A("B"), _A("A"))); - REQUIRE_THAT(src, IsFriend(_A("A"), _A("B"))); - // REQUIRE_THAT(puml, IsFriend(_A("A"), _A("D"))); - - 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(IsClassTemplate(j, "D")); - REQUIRE(IsFriend(j, "A", "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("B"))); - REQUIRE_THAT(src, !IsClass(_A("external::C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - - REQUIRE_THAT(src, IsAssociation(_A("B"), _A("A"))); - REQUIRE_THAT(src, IsFriend(_A("A"), _A("B"))); - // REQUIRE_THAT(src, IsFriend(_A("A"), _A("D"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsAssociation(src, "B", "A")); + REQUIRE(IsFriend(src, "A", "B")); + }); } \ No newline at end of file diff --git a/tests/t00012/test_case.h b/tests/t00012/test_case.h index 8b1a9d6a..b2bba300 100644 --- a/tests/t00012/test_case.h +++ b/tests/t00012/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00012/test_case.cc + * tests/t00012/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00012", "[test-case][class]") +TEST_CASE("t00012") { + using namespace clanguml::test; + auto [config, db] = load_config("t00012"); auto diagram = config.diagrams["t00012_class"]; @@ -28,58 +30,15 @@ TEST_CASE("t00012", "[test-case][class]") REQUIRE(model->name() == "t00012_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_THAT(src, IsClassTemplate("A", "T,Ts...")); - REQUIRE_THAT(src, IsClassTemplate("B", "int... Is")); - - REQUIRE_THAT(src, IsInstantiation(_A("B"), _A("B<3,2,1>"))); - REQUIRE_THAT( - src, IsInstantiation(_A("B"), _A("B<1,1,1,1>"))); - REQUIRE_THAT(src, - IsInstantiation(_A("C"), - _A("C>>>,3,3," - "3>"))); - - 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")); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, "A")); - REQUIRE(IsClass(j, - "C>>>" - ",3,3,3>")); - - 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, IsInstantiation(_A("B"), _A("B<3,2,1>"))); - REQUIRE_THAT( - src, IsInstantiation(_A("B"), _A("B<1,1,1,1>"))); - REQUIRE_THAT(src, - IsInstantiation(_A("C"), - _A("C>>>,3,3," - "3>"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsInstantiation(src, "B", "B<3,2,1>")); + REQUIRE(IsInstantiation(src, "B", "B<1,1,1,1>")); + REQUIRE(IsInstantiation(src, "C", + "C>>>,3,3," + "3>")); + }); } \ No newline at end of file diff --git a/tests/t00013/test_case.h b/tests/t00013/test_case.h index f12a999b..f97c1cb8 100644 --- a/tests/t00013/test_case.h +++ b/tests/t00013/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00013/test_case.cc + * tests/t00013/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00013", "[test-case][class]") +TEST_CASE("t00013") { + using namespace clanguml::test; + auto [config, db] = load_config("t00013"); auto diagram = config.diagrams["t00013_class"]; @@ -28,95 +30,29 @@ TEST_CASE("t00013", "[test-case][class]") REQUIRE(model->name() == "t00013_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(IsClassTemplate(src, "E")); + REQUIRE(IsClassTemplate(src, "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, IsClassTemplate("E", "T")); - REQUIRE_THAT(src, IsClassTemplate("G", "T,Args...")); - - REQUIRE_THAT(src, !IsDependency(_A("R"), _A("R"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("A"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("B"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("C"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("D"))); - REQUIRE_THAT(src, IsDependency(_A("D"), _A("R"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("E"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("E"))); - REQUIRE_THAT(src, IsInstantiation(_A("E"), _A("E"))); - REQUIRE_THAT(src, IsInstantiation(_A("E"), _A("E"))); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("E"), "-estring")); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("ABCD::F"))); - REQUIRE_THAT( - src, IsInstantiation(_A("ABCD::F"), _A("ABCD::F"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("ABCD::F"))); - - REQUIRE_THAT(src, - IsInstantiation( - _A("G"), _A("G"))); - - 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, "D")); - REQUIRE(IsInstantiation(j, "E", "E")); - REQUIRE(IsDependency(j, "R", "A")); - REQUIRE(IsDependency(j, "R", "B")); - REQUIRE(IsDependency(j, "R", "C")); - REQUIRE(IsDependency(j, "R", "D")); - REQUIRE(IsDependency(j, "D", "R")); - REQUIRE(IsDependency(j, "R", "E")); - REQUIRE(IsInstantiation(j, "G", "G")); - - 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("E"))); - REQUIRE_THAT(src, IsClass(_A("G"))); - - REQUIRE_THAT(src, !IsDependency(_A("R"), _A("R"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("A"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("B"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("C"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("D"))); - REQUIRE_THAT(src, IsDependency(_A("D"), _A("R"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("E"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("E"))); - REQUIRE_THAT(src, IsInstantiation(_A("E"), _A("E"))); - REQUIRE_THAT(src, IsInstantiation(_A("E"), _A("E"))); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("E"), "-estring")); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("ABCD::F"))); - REQUIRE_THAT( - src, IsInstantiation(_A("ABCD::F"), _A("ABCD::F"))); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("ABCD::F"))); - - REQUIRE_THAT(src, - IsInstantiation( - _A("G"), _A("G"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(!IsDependency(src, "R", "R")); + REQUIRE(IsDependency(src, "R", "A")); + REQUIRE(IsDependency(src, "R", "B")); + REQUIRE(IsDependency(src, "R", "C")); + REQUIRE(IsDependency(src, "R", "D")); + REQUIRE(IsDependency(src, "D", "R")); + REQUIRE(IsDependency(src, "R", "E")); + REQUIRE(IsDependency(src, "R", "E")); + REQUIRE(IsInstantiation(src, "E", "E")); + REQUIRE(IsInstantiation(src, "E", "E")); + REQUIRE(IsAggregation(src, "R", "E", "estring")); + REQUIRE(IsDependency(src, "R", "ABCD::F")); + REQUIRE(IsInstantiation(src, "ABCD::F", "ABCD::F")); + REQUIRE(IsDependency(src, "R", "ABCD::F")); + REQUIRE( + IsInstantiation(src, "G", "G")); + }); } \ No newline at end of file diff --git a/tests/t00014/test_case.h b/tests/t00014/test_case.h index 0368ba2d..bc9c1f97 100644 --- a/tests/t00014/test_case.h +++ b/tests/t00014/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00014", "[test-case][class]") +TEST_CASE("t00014") { + using namespace clanguml::test; + auto [config, db] = load_config("t00014"); auto diagram = config.diagrams["t00014_class"]; @@ -28,255 +30,345 @@ TEST_CASE("t00014", "[test-case][class]") REQUIRE(model->name() == "t00014_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_THAT(src, !Contains("type-parameter-")); - - REQUIRE_THAT(src, IsClassTemplate("A", "T,P")); - REQUIRE_THAT(src, IsClassTemplate("A", "T,std::string")); - REQUIRE_THAT( - src, IsClassTemplate("A", "T,std::unique_ptr")); - REQUIRE_THAT(src, IsClassTemplate("A", "double,T")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A")); + REQUIRE(IsClassTemplate(src, "A>")); + REQUIRE(IsClassTemplate(src, "A")); // TODO: Figure out how to handle the same templates with different // template // parameter names - // REQUIRE_THAT(puml, !IsClassTemplate("A", "long,U")); - REQUIRE_THAT(src, IsClassTemplate("A", "long,T")); - REQUIRE_THAT(src, IsClassTemplate("A", "long,bool")); - REQUIRE_THAT(src, IsClassTemplate("A", "double,bool")); - REQUIRE_THAT(src, IsClassTemplate("A", "long,float")); - REQUIRE_THAT(src, IsClassTemplate("A", "double,float")); - REQUIRE_THAT(src, IsClassTemplate("A", "bool,std::string")); - REQUIRE_THAT(src, IsClassTemplate("A", "std::string,std::string")); - REQUIRE_THAT(src, IsClassTemplate("A", "char,std::string")); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClassTemplate("R", "T")); + // REQUIRE(puml, !IsClassTemplate("A", "long,U")); + 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(IsClass(src, "B")); + REQUIRE(IsClassTemplate(src, "R")); - REQUIRE_THAT(src, IsField("bapair", "PairPairBA")); - REQUIRE_THAT(src, IsField("abool", "APtr")); - REQUIRE_THAT(src, IsField("aboolfloat", "AAPtr")); - REQUIRE_THAT(src, IsField("afloat", "ASharedPtr")); - REQUIRE_THAT( - src, IsField("boolstring", "A")); - REQUIRE_THAT(src, IsField("floatstring", "AStringPtr")); - REQUIRE_THAT(src, IsField("atfloat", "AAPtr")); + REQUIRE(IsField(src, "R", "bapair", "PairPairBA")); + REQUIRE(IsField(src, "R", "abool", "APtr")); + REQUIRE( + IsField(src, "R", "aboolfloat", "AAPtr")); + REQUIRE(IsField(src, "R", "afloat", "ASharedPtr")); + REQUIRE( + IsField(src, "R", "boolstring", "A")); + REQUIRE( + IsField(src, "R", "floatstring", "AStringPtr")); + REQUIRE(IsField(src, "R", "atfloat", "AAPtr")); - REQUIRE_THAT(src, IsField("intstring", "AIntString")); - REQUIRE_THAT(src, IsField("stringstring", "AStringString")); - REQUIRE_THAT(src, IsField("bstringstring", "BStringString")); + REQUIRE(IsField(src, "R", "intstring", "AIntString")); + REQUIRE(IsField(src, "R", "stringstring", "AStringString")); + REQUIRE( + IsField(src, "R", "bstringstring", "BStringString")); - REQUIRE_THAT(src, IsField("bs", "BVector")); + REQUIRE(IsField(src, "R", "bs", "BVector")); - REQUIRE_THAT(src, IsField("cb", "SimpleCallback")); + REQUIRE( + IsField(src, "R", "cb", "SimpleCallback")); #if LLVM_VERSION_MAJOR >= 16 - REQUIRE_THAT( - src, IsField("gcb", "GenericCallback")); + REQUIRE(IsField( + src, "R", "gcb", "GenericCallback")); #else - REQUIRE_THAT( - src, IsField("gcb", "GenericCallback")); + REQUIRE( + IsField(src, "R", "gcb", "GenericCallback")); #endif - REQUIRE_THAT(src, IsField("vcb", "VoidCallback")); + REQUIRE(IsField(src, "R", "vcb", "VoidCallback")); - REQUIRE_THAT( - src, !IsClassTemplate("std::std::function", "void(T...,int),int)")); + REQUIRE( + !IsClassTemplate(src, "std::std::function")); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A")); + REQUIRE(IsInstantiation(src, "A", "A")); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - // REQUIRE_THAT(puml, !IsInstantiation(_A("A"), + REQUIRE(IsInstantiation(src, "A", "A")); + // REQUIRE(puml, !IsInstantiation(_A("A"), // _A("A"))); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, - IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, - IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("A"), _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_THAT(src, - IsInstantiation(_A("A>"), - _A("A>"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("A"), _A("A>"))); + REQUIRE(IsInstantiation(src, "A>", + "A>")); + REQUIRE(IsInstantiation( + src, "A", "A>")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("B"), "+vps")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("B"), "-bapair")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("A"), "-aboolfloat")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("A"), "-bapair")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), _A("A"), "-aboolfloat")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("A"), "-atfloat")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("A"), "-atfloat")); - REQUIRE_THAT( - src, IsAssociation(_A("R"), _A("A"), "-afloat")); - REQUIRE_THAT(src, - IsAggregation( - _A("R"), _A("A"), "-boolstring")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), - _A("A>"), "-floatstring")); - REQUIRE_THAT(src, IsDependency(_A("R"), _A("A"))); - REQUIRE_THAT( - src, IsDependency(_A("R"), _A("A"))); + REQUIRE(IsAggregation(src, "R", "B", "vps")); + REQUIRE(IsAggregation(src, "R", "B", "bapair")); + REQUIRE( + IsAggregation(src, "R", "A", "aboolfloat")); + REQUIRE(IsAggregation(src, "R", "A", "bapair")); + REQUIRE(IsAggregation( + src, "R", "A", "aboolfloat")); + REQUIRE(IsAggregation(src, "R", "A", "atfloat")); + REQUIRE( + IsAggregation(src, "R", "A", "atfloat")); + REQUIRE( + IsAssociation(src, "R", "A", "afloat")); + REQUIRE(IsAggregation( + src, "R", "A", "boolstring")); + REQUIRE(IsAggregation(src, "R", + "A>", "floatstring")); + REQUIRE(IsDependency(src, "R", "A")); + REQUIRE(IsDependency(src, "R", "A")); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - using namespace json; + REQUIRE_THAT(src, !Contains("type-parameter-")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A>")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "A")); - REQUIRE(json::IsClass(j, "B")); + REQUIRE_THAT(src, IsClassTemplate("A", "T,P")); + REQUIRE_THAT(src, IsClassTemplate("A", "T,std::string")); + REQUIRE_THAT( + src, IsClassTemplate("A", "T,std::unique_ptr")); + REQUIRE_THAT(src, IsClassTemplate("A", "double,T")); + // TODO: Figure out how to handle the same templates with different + // template + // parameter names + // REQUIRE_THAT(puml, !IsClassTemplate("A", "long,U")); + REQUIRE_THAT(src, IsClassTemplate("A", "long,T")); + REQUIRE_THAT(src, IsClassTemplate("A", "long,bool")); + REQUIRE_THAT(src, IsClassTemplate("A", "double,bool")); + REQUIRE_THAT(src, IsClassTemplate("A", "long,float")); + REQUIRE_THAT(src, IsClassTemplate("A", "double,float")); + REQUIRE_THAT(src, IsClassTemplate("A", "bool,std::string")); + REQUIRE_THAT(src, IsClassTemplate("A", "std::string,std::string")); + REQUIRE_THAT(src, IsClassTemplate("A", "char,std::string")); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClassTemplate("R", "T")); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + REQUIRE_THAT(src, IsField("bapair", "PairPairBA")); + REQUIRE_THAT(src, IsField("abool", "APtr")); + REQUIRE_THAT(src, IsField("aboolfloat", + "AAPtr")); REQUIRE_THAT(src, IsField("afloat", + "ASharedPtr")); REQUIRE_THAT( src, IsField("boolstring", + "A")); REQUIRE_THAT(src, IsField("floatstring", + "AStringPtr")); REQUIRE_THAT(src, IsField("atfloat", + "AAPtr")); - mermaid::AliasMatcher _A(src); - using mermaid::IsField; + REQUIRE_THAT(src, IsField("intstring", "AIntString")); + REQUIRE_THAT(src, IsField("stringstring", + "AStringString")); REQUIRE_THAT(src, IsField("bstringstring", + "BStringString")); - REQUIRE_THAT(src, !Contains("type-parameter-")); + REQUIRE_THAT(src, IsField("bs", "BVector")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A>"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - // TODO: Figure out how to handle the same templates with different - // template - // parameter names - // REQUIRE_THAT(puml, !IsClass("A", "long,U")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("R"))); + REQUIRE_THAT(src, IsField("cb", + "SimpleCallback")); #if LLVM_VERSION_MAJOR >= 16 REQUIRE_THAT( + src, IsField("gcb", "GenericCallback")); + #else + REQUIRE_THAT( + src, IsField("gcb", + "GenericCallback")); #endif REQUIRE_THAT(src, + IsField("vcb", "VoidCallback")); - REQUIRE_THAT(src, IsField("bapair", "PairPairBA")); - REQUIRE_THAT(src, IsField("abool", "APtr")); - REQUIRE_THAT(src, IsField("aboolfloat", "AAPtr")); - REQUIRE_THAT(src, IsField("afloat", "ASharedPtr")); - REQUIRE_THAT( - src, IsField("boolstring", "A")); - REQUIRE_THAT(src, IsField("floatstring", "AStringPtr")); - REQUIRE_THAT(src, IsField("atfloat", "AAPtr")); + REQUIRE_THAT( + src, !IsClassTemplate("std::std::function", + "void(T...,int),int)")); - REQUIRE_THAT(src, IsField("intstring", "AIntString")); - REQUIRE_THAT(src, IsField("stringstring", "AStringString")); - REQUIRE_THAT(src, IsField("bstringstring", "BStringString")); + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT(src, IsInstantiation(_A("A"), + _A("A"))); - REQUIRE_THAT(src, IsField("bs", "BVector")); + REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); + // REQUIRE_THAT(puml, !IsInstantiation(_A("A"), + // _A("A"))); + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT(src, + IsInstantiation(_A("A"), + _A("A"))); REQUIRE_THAT(src, + IsInstantiation(_A("A"), + _A("A"))); REQUIRE_THAT(src, IsInstantiation( + _A("A"), _A("A"))); - REQUIRE_THAT(src, IsField("cb", "SimpleCallback")); -#if LLVM_VERSION_MAJOR >= 16 - REQUIRE_THAT( - src, IsField("gcb", "GenericCallback")); -#else - REQUIRE_THAT( - src, IsField("gcb", "GenericCallback")); -#endif - REQUIRE_THAT(src, IsField("vcb", "VoidCallback")); + REQUIRE_THAT(src, + IsInstantiation(_A("A>"), + _A("A>"))); + REQUIRE_THAT(src, + IsInstantiation( + _A("A"), _A("A>"))); - REQUIRE_THAT( - src, !IsClassTemplate("std::std::function", "void(T...,int),int)")); + REQUIRE_THAT(src, IsAggregation(_A("R"), _A("B"), "+vps")); + REQUIRE_THAT(src, IsAggregation(_A("R"), _A("B"), "-bapair")); + REQUIRE_THAT( + src, IsAggregation(_A("R"), _A("A"), + "-aboolfloat")); REQUIRE_THAT( src, IsAggregation(_A("R"), + _A("A"), "-bapair")); REQUIRE_THAT(src, IsAggregation(_A("R"), + _A("A"), "-aboolfloat")); REQUIRE_THAT( src, + IsAggregation(_A("R"), _A("A"), "-atfloat")); REQUIRE_THAT( + src, IsAggregation(_A("R"), _A("A"), + "-atfloat")); REQUIRE_THAT( src, IsAssociation(_A("R"), + _A("A"), "-afloat")); REQUIRE_THAT(src, IsAggregation( + _A("R"), _A("A"), "-boolstring")); + REQUIRE_THAT(src, + IsAggregation(_A("R"), + _A("A>"), + "-floatstring")); REQUIRE_THAT(src, IsDependency(_A("R"), + _A("A"))); REQUIRE_THAT( src, IsDependency(_A("R"), + _A("A"))); - 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); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - // REQUIRE_THAT(puml, !IsInstantiation(_A("A"), - // _A("A"))); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT( - src, IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, - IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, - IsInstantiation(_A("A"), _A("A"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("A"), _A("A"))); + using namespace json; - REQUIRE_THAT(src, - IsInstantiation(_A("A>"), - _A("A>"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("A"), _A("A>"))); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A>")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "A")); + REQUIRE(json::IsClass(j, "B")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("B"), "+vps")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("B"), "-bapair")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("A"), "-aboolfloat")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("A"), "-bapair")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), _A("A"), "-aboolfloat")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("A"), "-atfloat")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("A"), "-atfloat")); - REQUIRE_THAT( - src, IsAssociation(_A("R"), _A("A"), "-afloat")); - REQUIRE_THAT(src, - IsAggregation( - _A("R"), _A("A"), "-boolstring")); - REQUIRE_THAT(src, - IsAggregation(_A("R"), - _A("A>"), "-floatstring")); -#if !defined(__APPLE__) - // TODO(#176) - REQUIRE_THAT(src, IsDependency(_A("R"), _A("A"))); - REQUIRE_THAT( - src, IsDependency(_A("R"), _A("A"))); -#endif + save_json(config.output_directory(), diagram->name + ".json", j); + } + { + auto src = generate_class_mermaid(diagram, *model); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + mermaid::AliasMatcher _A(src); + using mermaid::IsField; + + REQUIRE_THAT(src, !Contains("type-parameter-")); + + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("A>"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + // TODO: Figure out how to handle the same templates with different + // template + // parameter names + // REQUIRE_THAT(puml, !IsClass("A", "long,U")); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClass(_A("R"))); + + REQUIRE_THAT(src, IsField("bapair", "PairPairBA")); + REQUIRE_THAT(src, IsField("abool", "APtr")); + REQUIRE_THAT(src, IsField("aboolfloat", + "AAPtr")); REQUIRE_THAT(src, IsField("afloat", + "ASharedPtr")); REQUIRE_THAT( src, IsField("boolstring", + "A")); REQUIRE_THAT(src, IsField("floatstring", + "AStringPtr")); REQUIRE_THAT(src, IsField("atfloat", + "AAPtr")); + + REQUIRE_THAT(src, IsField("intstring", "AIntString")); + REQUIRE_THAT(src, IsField("stringstring", + "AStringString")); REQUIRE_THAT(src, IsField("bstringstring", + "BStringString")); + + REQUIRE_THAT(src, IsField("bs", "BVector")); + + REQUIRE_THAT(src, IsField("cb", + "SimpleCallback")); #if LLVM_VERSION_MAJOR >= 16 REQUIRE_THAT( + src, IsField("gcb", "GenericCallback")); + #else + REQUIRE_THAT( + src, IsField("gcb", + "GenericCallback")); #endif REQUIRE_THAT(src, + IsField("vcb", "VoidCallback")); + + REQUIRE_THAT( + src, !IsClassTemplate("std::std::function", + "void(T...,int),int)")); + + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT(src, IsInstantiation(_A("A"), + _A("A"))); + + REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); + // REQUIRE_THAT(puml, !IsInstantiation(_A("A"), + // _A("A"))); + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT(src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT( + src, IsInstantiation(_A("A"), _A("A"))); + REQUIRE_THAT(src, + IsInstantiation(_A("A"), + _A("A"))); REQUIRE_THAT(src, + IsInstantiation(_A("A"), + _A("A"))); REQUIRE_THAT(src, IsInstantiation( + _A("A"), _A("A"))); + + REQUIRE_THAT(src, + IsInstantiation(_A("A>"), + _A("A>"))); + REQUIRE_THAT(src, + IsInstantiation( + _A("A"), _A("A>"))); + + REQUIRE_THAT(src, IsAggregation(_A("R"), _A("B"), "+vps")); + REQUIRE_THAT(src, IsAggregation(_A("R"), _A("B"), "-bapair")); + REQUIRE_THAT( + src, IsAggregation(_A("R"), _A("A"), + "-aboolfloat")); REQUIRE_THAT( src, IsAggregation(_A("R"), + _A("A"), "-bapair")); REQUIRE_THAT(src, IsAggregation(_A("R"), + _A("A"), "-aboolfloat")); REQUIRE_THAT( src, + IsAggregation(_A("R"), _A("A"), "-atfloat")); REQUIRE_THAT( + src, IsAggregation(_A("R"), _A("A"), + "-atfloat")); REQUIRE_THAT( src, IsAssociation(_A("R"), + _A("A"), "-afloat")); REQUIRE_THAT(src, IsAggregation( + _A("R"), _A("A"), "-boolstring")); + REQUIRE_THAT(src, + IsAggregation(_A("R"), + _A("A>"), + "-floatstring")); #if !defined(__APPLE__) + // TODO(#176) + REQUIRE_THAT(src, IsDependency(_A("R"), + _A("A"))); REQUIRE_THAT( src, IsDependency(_A("R"), + _A("A"))); #endif + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + } + */ } \ No newline at end of file diff --git a/tests/t00015/test_case.h b/tests/t00015/test_case.h index 42752d54..9dd602f2 100644 --- a/tests/t00015/test_case.h +++ b/tests/t00015/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00015/test_case.cc + * tests/t00015/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00015", "[test-case][class]") +TEST_CASE("t00015") { + using namespace clanguml::test; + auto [config, db] = load_config("t00015"); auto diagram = config.diagrams["t00015_class"]; @@ -28,44 +30,11 @@ TEST_CASE("t00015", "[test-case][class]") REQUIRE(model->name() == "t00015_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("ns1::A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2_v0_9_0::A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::Anon"))); - REQUIRE_THAT(src, IsClass(_A("ns3::ns1::ns2::Anon"))); - REQUIRE_THAT(src, IsClass(_A("ns3::B"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "ns1::A")); - REQUIRE(IsClass(j, "ns1::ns2_v0_9_0::A")); - REQUIRE(IsClass(j, "ns1::Anon")); - REQUIRE(IsClass(j, "ns3::ns1::ns2::Anon")); - REQUIRE(IsClass(j, "ns3::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("ns1::A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::ns2_v0_9_0::A"))); - REQUIRE_THAT(src, IsClass(_A("ns1::Anon"))); - REQUIRE_THAT(src, IsClass(_A("ns3::ns1::ns2::Anon"))); - REQUIRE_THAT(src, IsClass(_A("ns3::B"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "ns1::A")); + REQUIRE(IsClass(src, "ns1::ns2_v0_9_0::A")); + REQUIRE(IsClass(src, "ns1::Anon")); + REQUIRE(IsClass(src, "ns3::ns1::ns2::Anon")); + REQUIRE(IsClass(src, "ns3::B")); + }); } \ No newline at end of file diff --git a/tests/t00016/test_case.h b/tests/t00016/test_case.h index 5efdbe20..161597e8 100644 --- a/tests/t00016/test_case.h +++ b/tests/t00016/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00016/test_case.cc + * tests/t00016/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00016", "[test-case][class]") +TEST_CASE("t00016") { + using namespace clanguml::test; + auto [config, db] = load_config("t00016"); auto diagram = config.diagrams["t00016_class"]; @@ -28,69 +30,20 @@ TEST_CASE("t00016", "[test-case][class]") REQUIRE(model->name() == "t00016_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClassTemplate(src, "is_numeric")); + REQUIRE(IsClassTemplate(src, "is_numeric")); + REQUIRE(IsClassTemplate(src, "is_numeric")); + REQUIRE(IsClassTemplate(src, "is_numeric")); + REQUIRE(IsClassTemplate(src, "is_numeric")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClassTemplate("is_numeric", "typename")); - REQUIRE_THAT(src, IsClassTemplate("is_numeric", "int")); - REQUIRE_THAT(src, IsClassTemplate("is_numeric", "bool")); - REQUIRE_THAT(src, IsClassTemplate("is_numeric", "char")); - REQUIRE_THAT(src, IsClassTemplate("is_numeric", "float")); - - REQUIRE_THAT(src, - IsInstantiation( - _A("is_numeric"), _A("is_numeric"), "up")); - REQUIRE_THAT(src, - IsInstantiation( - _A("is_numeric"), _A("is_numeric"), "up")); - REQUIRE_THAT(src, - IsInstantiation( - _A("is_numeric"), _A("is_numeric"), "up")); - REQUIRE_THAT(src, - IsInstantiation( - _A("is_numeric"), _A("is_numeric"), "up")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClassTemplate(j, "is_numeric")); - REQUIRE(IsClass(j, "is_numeric")); - REQUIRE(IsClass(j, "is_numeric")); - REQUIRE(IsClass(j, "is_numeric")); - REQUIRE(IsClass(j, "is_numeric")); - - 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("is_numeric"))); - REQUIRE_THAT(src, IsClass(_A("is_numeric"))); - REQUIRE_THAT(src, IsClass(_A("is_numeric"))); - REQUIRE_THAT(src, IsClass(_A("is_numeric"))); - REQUIRE_THAT(src, IsClass(_A("is_numeric"))); - - REQUIRE_THAT(src, - IsInstantiation(_A("is_numeric"), _A("is_numeric"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("is_numeric"), _A("is_numeric"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("is_numeric"), _A("is_numeric"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("is_numeric"), _A("is_numeric"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsInstantiation( + src, "is_numeric", "is_numeric", "up")); + REQUIRE(IsInstantiation( + src, "is_numeric", "is_numeric", "up")); + REQUIRE(IsInstantiation( + src, "is_numeric", "is_numeric", "up")); + REQUIRE(IsInstantiation( + src, "is_numeric", "is_numeric", "up")); + }); } \ No newline at end of file diff --git a/tests/t00017/test_case.h b/tests/t00017/test_case.h index 865764ba..644aebec 100644 --- a/tests/t00017/test_case.h +++ b/tests/t00017/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00017/test_case.cc + * tests/t00017/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00017", "[test-case][class]") +TEST_CASE("t00017") { + using namespace clanguml::test; + auto [config, db] = load_config("t00017"); auto diagram = config.diagrams["t00017_class"]; @@ -28,107 +30,47 @@ TEST_CASE("t00017", "[test-case][class]") REQUIRE(model->name() == "t00017_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(IsClass(src, "H")); + REQUIRE(IsClass(src, "I")); + REQUIRE(IsClass(src, "J")); + REQUIRE(IsClass(src, "K")); + REQUIRE(IsClass(src, "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("F"))); - REQUIRE_THAT(src, IsClass(_A("G"))); - REQUIRE_THAT(src, IsClass(_A("H"))); - REQUIRE_THAT(src, IsClass(_A("I"))); - REQUIRE_THAT(src, IsClass(_A("J"))); - REQUIRE_THAT(src, IsClass(_A("K"))); - REQUIRE_THAT(src, IsClass(_A("R"))); + REQUIRE(IsField(src, "R", "some_int", "int")); + REQUIRE((IsField(src, "R", "some_int_pointer", "int *"))); + REQUIRE((IsField( + src, "R", "some_int_pointer_pointer", "int **"))); - REQUIRE_THAT(src, (IsField("some_int", "int"))); - REQUIRE_THAT(src, (IsField("some_int_pointer", "int *"))); - REQUIRE_THAT( - src, (IsField("some_int_pointer_pointer", "int **"))); - - // Relationship members should not be rendered as part of this testcase - REQUIRE_THAT(src, !(IsField("a", _A("A")))); - REQUIRE_THAT(src, !(IsField("b", _A("B")))); - - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("A"), "-a")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("B"), "-b")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("C"), "-c")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("D"), "-d")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("E"), "-e")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("F"), "-f")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("G"), "-g")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("H"), "-h")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("I"), "-i")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("J"), "-j")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("K"), "-k")); - - 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, "D")); - REQUIRE(IsClass(j, "E")); - REQUIRE(IsClass(j, "F")); - REQUIRE(IsClass(j, "G")); - REQUIRE(IsClass(j, "H")); - REQUIRE(IsClass(j, "I")); - REQUIRE(IsClass(j, "J")); - REQUIRE(IsClass(j, "K")); - REQUIRE(IsClass(j, "R")); - - 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("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, IsClass(_A("H"))); - REQUIRE_THAT(src, IsClass(_A("I"))); - REQUIRE_THAT(src, IsClass(_A("J"))); - REQUIRE_THAT(src, IsClass(_A("K"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT(src, (IsField("some_int", "int"))); - REQUIRE_THAT(src, (IsField("some_int_pointer", "int *"))); - REQUIRE_THAT( - src, (IsField("some_int_pointer_pointer", "int **"))); - - // Relationship members should not be rendered as part of this testcase - REQUIRE_THAT(src, !(IsField("a", _A("A")))); - REQUIRE_THAT(src, !(IsField("b", _A("B")))); - - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("A"), "-a")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("B"), "-b")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("C"), "-c")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("D"), "-d")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("E"), "-e")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("F"), "-f")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("G"), "-g")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("H"), "-h")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("I"), "-i")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("J"), "-j")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("K"), "-k")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsAggregation(src, "R", "A", "a")); + REQUIRE(IsAssociation(src, "R", "B", "b")); + REQUIRE(IsAssociation(src, "R", "C", "c")); + REQUIRE(IsAssociation(src, "R", "D", "d")); + REQUIRE(IsAssociation(src, "R", "E", "e")); + REQUIRE(IsAggregation(src, "R", "F", "f")); + REQUIRE(IsAssociation(src, "R", "G", "g")); + REQUIRE(IsAssociation(src, "R", "H", "h")); + REQUIRE(IsAssociation(src, "R", "I", "i")); + REQUIRE(IsAssociation(src, "R", "J", "j")); + REQUIRE(IsAssociation(src, "R", "K", "k")); + }, + [](const plantuml_t &src) { + // Relationship members should not be rendered as part of this + // testcase + REQUIRE(!IsField(src, "R", "a", "A")); + REQUIRE(!IsField(src, "R", "b", "B")); + }, + [](const mermaid_t &src) { + REQUIRE(!IsField(src, "R", "a", "A")); + REQUIRE(!IsField(src, "R", "b", "B")); + }); } \ No newline at end of file diff --git a/tests/t00018/test_case.h b/tests/t00018/test_case.h index 8ca24e0b..7424462f 100644 --- a/tests/t00018/test_case.h +++ b/tests/t00018/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00018/test_case.cc + * tests/t00018/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00018", "[test-case][class]") +TEST_CASE("t00018") { + using namespace clanguml::test; + auto [config, db] = load_config("t00018"); auto diagram = config.diagrams["t00018_class"]; @@ -28,45 +30,13 @@ TEST_CASE("t00018", "[test-case][class]") REQUIRE(model->name() == "t00018_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "widget")); + REQUIRE(IsClass(src, "impl::widget")); + REQUIRE(IsDependency(src, "impl::widget", "widget")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClass(_A("widget"))); - REQUIRE_THAT(src, IsClass(_A("impl::widget"))); - - REQUIRE_THAT( - src, IsAggregation(_A("widget"), _A("impl::widget"), "-pImpl")); - REQUIRE_THAT(src, IsDependency(_A("impl::widget"), _A("widget"))); - REQUIRE_THAT(src, !IsDependency(_A("widget"), _A("widget"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "widget")); - REQUIRE(IsClass(j, "impl::widget")); - REQUIRE(IsDependency(j, "impl::widget", "widget")); - - 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("widget"))); - REQUIRE_THAT(src, IsClass(_A("impl::widget"))); - - REQUIRE_THAT( - src, IsAggregation(_A("widget"), _A("impl::widget"), "-pImpl")); - REQUIRE_THAT(src, IsDependency(_A("impl::widget"), _A("widget"))); - REQUIRE_THAT(src, !IsDependency(_A("widget"), _A("widget"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsAggregation(src, "widget", "impl::widget", "pImpl")); + REQUIRE(IsDependency(src, "impl::widget", "widget")); + REQUIRE(!IsDependency(src, "widget", "widget")); + }); } \ No newline at end of file diff --git a/tests/t00019/test_case.h b/tests/t00019/test_case.h index d7bdb746..7d17aa32 100644 --- a/tests/t00019/test_case.h +++ b/tests/t00019/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00019/test_case.cc + * tests/t00019/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00019", "[test-case][class]") +TEST_CASE("t00019") { + using namespace clanguml::test; + auto [config, db] = load_config("t00019"); auto diagram = config.diagrams["t00019_class"]; @@ -28,101 +30,33 @@ TEST_CASE("t00019", "[test-case][class]") REQUIRE(model->name() == "t00019_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(IsClassTemplate(src, "Layer1")); + REQUIRE(IsClassTemplate(src, "Layer2")); + REQUIRE(IsClassTemplate(src, "Layer3")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClass(_A("Base"))); - REQUIRE_THAT(src, IsClassTemplate("Layer1", "LowerLayer")); - REQUIRE_THAT(src, IsClassTemplate("Layer2", "LowerLayer")); - REQUIRE_THAT(src, IsClassTemplate("Layer3", "LowerLayer")); + REQUIRE(IsBaseClass(src, "Base", "Layer3")); + REQUIRE(!IsDependency(src, "Base", "Layer3")); - REQUIRE_THAT(src, IsBaseClass(_A("Base"), _A("Layer3"))); - REQUIRE_THAT(src, !IsDependency(_A("Base"), _A("Layer3"))); + REQUIRE(IsBaseClass(src, "Layer3", "Layer2>")); + REQUIRE(!IsDependency(src, "Layer3", "Layer2>")); - REQUIRE_THAT( - src, IsBaseClass(_A("Layer3"), _A("Layer2>"))); - REQUIRE_THAT( - src, !IsDependency(_A("Layer3"), _A("Layer2>"))); + REQUIRE(IsBaseClass( + src, "Layer2>", "Layer1>>")); - REQUIRE_THAT(src, - IsBaseClass(_A("Layer2>"), - _A("Layer1>>"))); + REQUIRE(!IsDependency( + src, "Layer2>", "Layer1>>")); - REQUIRE_THAT(src, - !IsDependency(_A("Layer2>"), - _A("Layer1>>"))); + REQUIRE(IsAggregation( + src, "A", "Layer1>>", "layers")); + REQUIRE(!IsDependency(src, "A", "Layer1>>")); - REQUIRE_THAT(src, - IsAggregation( - _A("A"), _A("Layer1>>"), "+layers")); - REQUIRE_THAT( - src, !IsDependency(_A("A"), _A("Layer1>>"))); + REQUIRE( + !IsAggregation(src, "A", "Layer2>", "layers")); - REQUIRE_THAT(src, - !IsAggregation(_A("A"), _A("Layer2>"), "+layers")); + REQUIRE(!IsAggregation(src, "A", "Layer3", "layers")); - REQUIRE_THAT( - src, !IsAggregation(_A("A"), _A("Layer3"), "+layers")); - - REQUIRE_THAT(src, !IsAggregation(_A("A"), _A("Base"), "+layers")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "Base")); - REQUIRE(IsClassTemplate(j, "Layer1")); - REQUIRE(IsClassTemplate(j, "Layer2")); - REQUIRE(IsClassTemplate(j, "Layer3")); - - 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("Layer1"))); - REQUIRE_THAT(src, IsClass(_A("Layer2"))); - REQUIRE_THAT(src, IsClass(_A("Layer3"))); - - REQUIRE_THAT(src, IsBaseClass(_A("Base"), _A("Layer3"))); - REQUIRE_THAT(src, !IsDependency(_A("Base"), _A("Layer3"))); - - REQUIRE_THAT( - src, IsBaseClass(_A("Layer3"), _A("Layer2>"))); - REQUIRE_THAT( - src, !IsDependency(_A("Layer3"), _A("Layer2>"))); - - REQUIRE_THAT(src, - IsBaseClass(_A("Layer2>"), - _A("Layer1>>"))); - - REQUIRE_THAT(src, - !IsDependency(_A("Layer2>"), - _A("Layer1>>"))); - - REQUIRE_THAT(src, - IsAggregation( - _A("A"), _A("Layer1>>"), "+layers")); - REQUIRE_THAT( - src, !IsDependency(_A("A"), _A("Layer1>>"))); - - REQUIRE_THAT(src, - !IsAggregation(_A("A"), _A("Layer2>"), "+layers")); - - REQUIRE_THAT( - src, !IsAggregation(_A("A"), _A("Layer3"), "+layers")); - - REQUIRE_THAT(src, !IsAggregation(_A("A"), _A("Base"), "+layers")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(!IsAggregation(src, "A", "Base", "layers")); + }); } \ No newline at end of file diff --git a/tests/t00020/test_case.h b/tests/t00020/test_case.h index d959b04c..6657869d 100644 --- a/tests/t00020/test_case.h +++ b/tests/t00020/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00020/test_case.cc + * tests/t00020/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00020", "[test-case][class]") +TEST_CASE("t00020") { + using namespace clanguml::test; + auto [config, db] = load_config("t00020"); auto diagram = config.diagrams["t00020_class"]; @@ -28,53 +30,66 @@ TEST_CASE("t00020", "[test-case][class]") REQUIRE(model->name() == "t00020_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsAbstractClass(src, "AbstractFactory")); + REQUIRE(IsAbstractClass(src, "ProductA")); + REQUIRE(IsAbstractClass(src, "ProductB")); + REQUIRE(IsClass(src, "ProductA1")); + REQUIRE(IsClass(src, "ProductA2")); + REQUIRE(IsClass(src, "ProductB1")); + REQUIRE(IsClass(src, "ProductB2")); + REQUIRE(IsClass(src, "Factory1")); + REQUIRE(IsClass(src, "Factory2")); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsAbstractClass(_A("ProductA"))); - REQUIRE_THAT(src, IsAbstractClass(_A("ProductB"))); - REQUIRE_THAT(src, IsClass(_A("ProductA1"))); - REQUIRE_THAT(src, IsClass(_A("ProductA2"))); - REQUIRE_THAT(src, IsClass(_A("ProductB1"))); - REQUIRE_THAT(src, IsClass(_A("ProductB2"))); - REQUIRE_THAT(src, IsAbstractClass(_A("AbstractFactory"))); - REQUIRE_THAT(src, IsClass(_A("Factory1"))); - REQUIRE_THAT(src, IsClass(_A("Factory2"))); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE_THAT(src, IsAbstractClass(_A("ProductA"))); + REQUIRE_THAT(src, IsAbstractClass(_A("ProductB"))); + REQUIRE_THAT(src, IsClass(_A("ProductA1"))); + REQUIRE_THAT(src, IsClass(_A("ProductA2"))); + REQUIRE_THAT(src, IsClass(_A("ProductB1"))); + REQUIRE_THAT(src, IsClass(_A("ProductB2"))); + REQUIRE_THAT(src, IsAbstractClass(_A("AbstractFactory"))); + REQUIRE_THAT(src, IsClass(_A("Factory1"))); + REQUIRE_THAT(src, IsClass(_A("Factory2"))); - 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); + } + { + auto j = generate_class_json(diagram, *model); - using namespace json; + using namespace json; - REQUIRE(IsClass(j, "ProductA1")); - REQUIRE(IsClass(j, "ProductA2")); - REQUIRE(IsClass(j, "ProductB1")); - REQUIRE(IsClass(j, "ProductB2")); - REQUIRE(IsAbstractClass(j, "AbstractFactory")); + REQUIRE(IsClass(j, "ProductA1")); + REQUIRE(IsClass(j, "ProductA2")); + REQUIRE(IsClass(j, "ProductB1")); + REQUIRE(IsClass(j, "ProductB2")); + REQUIRE(IsAbstractClass(j, "AbstractFactory")); - 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::IsAbstractClass; + mermaid::AliasMatcher _A(src); + using mermaid::IsAbstractClass; - REQUIRE_THAT(src, IsAbstractClass(_A("ProductA"))); - REQUIRE_THAT(src, IsAbstractClass(_A("ProductB"))); - REQUIRE_THAT(src, IsClass(_A("ProductA1"))); - REQUIRE_THAT(src, IsClass(_A("ProductA2"))); - REQUIRE_THAT(src, IsClass(_A("ProductB1"))); - REQUIRE_THAT(src, IsClass(_A("ProductB2"))); - REQUIRE_THAT(src, IsAbstractClass(_A("AbstractFactory"))); - REQUIRE_THAT(src, IsClass(_A("Factory1"))); - REQUIRE_THAT(src, IsClass(_A("Factory2"))); + REQUIRE_THAT(src, IsAbstractClass(_A("ProductA"))); + REQUIRE_THAT(src, IsAbstractClass(_A("ProductB"))); + REQUIRE_THAT(src, IsClass(_A("ProductA1"))); + REQUIRE_THAT(src, IsClass(_A("ProductA2"))); + REQUIRE_THAT(src, IsClass(_A("ProductB1"))); + REQUIRE_THAT(src, IsClass(_A("ProductB2"))); + REQUIRE_THAT(src, IsAbstractClass(_A("AbstractFactory"))); + REQUIRE_THAT(src, IsClass(_A("Factory1"))); + REQUIRE_THAT(src, IsClass(_A("Factory2"))); - 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/t00021/test_case.h b/tests/t00021/test_case.h index f916adf3..a9c511b6 100644 --- a/tests/t00021/test_case.h +++ b/tests/t00021/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00021/test_case.cc + * tests/t00021/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00021", "[test-case][class]") +TEST_CASE("t00021") { + using namespace clanguml::test; + auto [config, db] = load_config("t00021"); auto diagram = config.diagrams["t00021_class"]; @@ -28,47 +30,14 @@ TEST_CASE("t00021", "[test-case][class]") REQUIRE(model->name() == "t00021_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsAbstractClass(src, "Item")); + REQUIRE(IsAbstractClass(src, "Visitor")); + REQUIRE(IsClass(src, "A")); + REQUIRE(IsClass(src, "B")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsAbstractClass(_A("Item"))); - REQUIRE_THAT(src, IsAbstractClass(_A("Visitor"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("Visitor1"))); - REQUIRE_THAT(src, IsClass(_A("Visitor2"))); - REQUIRE_THAT(src, IsClass(_A("Visitor3"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "Visitor1")); - REQUIRE(IsClass(j, "Visitor2")); - REQUIRE(IsAbstractClass(j, "Item")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsAbstractClass; - - REQUIRE_THAT(src, IsAbstractClass(_A("Item"))); - REQUIRE_THAT(src, IsAbstractClass(_A("Visitor"))); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("B"))); - REQUIRE_THAT(src, IsClass(_A("Visitor1"))); - REQUIRE_THAT(src, IsClass(_A("Visitor2"))); - REQUIRE_THAT(src, IsClass(_A("Visitor3"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsClass(src, "Visitor1")); + REQUIRE(IsClass(src, "Visitor2")); + REQUIRE(IsClass(src, "Visitor3")); + }); } \ No newline at end of file diff --git a/tests/t00022/test_case.h b/tests/t00022/test_case.h index ab38da8c..af819cb7 100644 --- a/tests/t00022/test_case.h +++ b/tests/t00022/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00022/test_case.cc + * tests/t00022/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00022", "[test-case][class]") +TEST_CASE("t00022") { + using namespace clanguml::test; + auto [config, db] = load_config("t00022"); auto diagram = config.diagrams["t00022_class"]; @@ -28,38 +30,9 @@ TEST_CASE("t00022", "[test-case][class]") REQUIRE(model->name() == "t00022_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, IsAbstractClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A1"))); - REQUIRE_THAT(src, IsClass(_A("A2"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "A1")); - REQUIRE(IsClass(j, "A2")); - REQUIRE(IsAbstractClass(j, "A")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsAbstractClass; - - REQUIRE_THAT(src, IsAbstractClass(_A("A"))); - REQUIRE_THAT(src, IsClass(_A("A1"))); - REQUIRE_THAT(src, IsClass(_A("A2"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "A1")); + REQUIRE(IsClass(src, "A2")); + REQUIRE(IsAbstractClass(src, "A")); + }); } diff --git a/tests/t00023/test_case.h b/tests/t00023/test_case.h index a0c74506..0e49a4fb 100644 --- a/tests/t00023/test_case.h +++ b/tests/t00023/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00023/test_case.cc + * tests/t00023/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00023", "[test-case][class]") +TEST_CASE("t00023") { + using namespace clanguml::test; + auto [config, db] = load_config("t00023"); auto diagram = config.diagrams["t00023_class"]; @@ -28,39 +30,9 @@ TEST_CASE("t00023", "[test-case][class]") REQUIRE(model->name() == "t00023_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, IsAbstractClass(_A("Strategy"))); - REQUIRE_THAT(src, IsClass(_A("StrategyA"))); - REQUIRE_THAT(src, IsClass(_A("StrategyB"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "StrategyA")); - REQUIRE(IsClass(j, "StrategyB")); - REQUIRE(IsAbstractClass(j, "Strategy")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsAbstractClass; - - REQUIRE_THAT(src, IsAbstractClass(_A("Strategy"))); - REQUIRE_THAT(src, IsClass(_A("StrategyA"))); - REQUIRE_THAT(src, IsClass(_A("StrategyB"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsAbstractClass(src, "Strategy")); + REQUIRE(IsClass(src, "StrategyA")); + REQUIRE(IsClass(src, "StrategyB")); + }); } \ No newline at end of file diff --git a/tests/t00024/test_case.h b/tests/t00024/test_case.h index 7ede8607..7ecd61c1 100644 --- a/tests/t00024/test_case.h +++ b/tests/t00024/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00024/test_case.cc + * tests/t00024/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00024", "[test-case][class]") +TEST_CASE("t00024") { + using namespace clanguml::test; + auto [config, db] = load_config("t00024"); auto diagram = config.diagrams["t00024_class"]; @@ -28,50 +30,13 @@ TEST_CASE("t00024", "[test-case][class]") REQUIRE(model->name() == "t00024_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, IsAbstractClass(_A("Target"))); - REQUIRE_THAT(src, IsClass(_A("Target1"))); - REQUIRE_THAT(src, IsClass(_A("Target2"))); - REQUIRE_THAT(src, IsClass(_A("Proxy"))); - REQUIRE_THAT(src, IsBaseClass(_A("Target"), _A("Target1"))); - REQUIRE_THAT(src, IsBaseClass(_A("Target"), _A("Target2"))); - REQUIRE_THAT(src, IsBaseClass(_A("Target"), _A("Proxy"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "Target1")); - REQUIRE(IsClass(j, "Target2")); - REQUIRE(IsAbstractClass(j, "Target")); - REQUIRE(IsBaseClass(j, "Target", "Target1")); - REQUIRE(IsBaseClass(j, "Target", "Target2")); - REQUIRE(IsBaseClass(j, "Target", "Proxy")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::IsAbstractClass; - - REQUIRE_THAT(src, IsAbstractClass(_A("Target"))); - REQUIRE_THAT(src, IsClass(_A("Target1"))); - REQUIRE_THAT(src, IsClass(_A("Target2"))); - REQUIRE_THAT(src, IsClass(_A("Proxy"))); - REQUIRE_THAT(src, IsBaseClass(_A("Target"), _A("Target1"))); - REQUIRE_THAT(src, IsBaseClass(_A("Target"), _A("Target2"))); - REQUIRE_THAT(src, IsBaseClass(_A("Target"), _A("Proxy"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "Target1")); + REQUIRE(IsClass(src, "Target2")); + REQUIRE(IsClass(src, "Proxy")); + REQUIRE(IsAbstractClass(src, "Target")); + REQUIRE(IsBaseClass(src, "Target", "Target1")); + REQUIRE(IsBaseClass(src, "Target", "Target2")); + REQUIRE(IsBaseClass(src, "Target", "Proxy")); + }); } \ No newline at end of file diff --git a/tests/t00025/test_case.h b/tests/t00025/test_case.h index c15ba9e9..dbe33d13 100644 --- a/tests/t00025/test_case.h +++ b/tests/t00025/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00025/test_case.cc + * tests/t00025/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00025", "[test-case][class]") +TEST_CASE("t00025") { + using namespace clanguml::test; + auto [config, db] = load_config("t00025"); auto diagram = config.diagrams["t00025_class"]; @@ -28,68 +30,22 @@ TEST_CASE("t00025", "[test-case][class]") REQUIRE(model->name() == "t00025_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClass(src, "Target1")); + REQUIRE(IsClass(src, "Target2")); + REQUIRE(IsClassTemplate(src, "Proxy")); + REQUIRE(IsDependency(src, "Proxy", "Target1")); + REQUIRE(IsDependency(src, "Proxy", "Target2")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClass(_A("Target1"))); - REQUIRE_THAT(src, IsClass(_A("Target2"))); - REQUIRE_THAT(src, IsClassTemplate("Proxy", "T")); - REQUIRE_THAT( - src, IsInstantiation(_A("Proxy"), _A("Proxy"))); - REQUIRE_THAT( - src, IsInstantiation(_A("Proxy"), _A("Proxy"))); - REQUIRE_THAT(src, - IsAggregation(_A("ProxyHolder"), _A("Proxy"), "+proxy1")); - REQUIRE_THAT(src, - IsAggregation(_A("ProxyHolder"), _A("Proxy"), "+proxy2")); - REQUIRE_THAT( - src, !IsAggregation(_A("ProxyHolder"), _A("Target1"), "+proxy1")); - REQUIRE_THAT( - src, !IsAggregation(_A("ProxyHolder"), _A("Target2"), "+proxy2")); - REQUIRE_THAT(src, IsDependency(_A("Proxy"), _A("Target1"))); - REQUIRE_THAT(src, IsDependency(_A("Proxy"), _A("Target2"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClass(j, "Target1")); - REQUIRE(IsClass(j, "Target2")); - REQUIRE(IsClassTemplate(j, "Proxy")); - REQUIRE(IsDependency(j, "Proxy", "Target1")); - REQUIRE(IsDependency(j, "Proxy", "Target2")); - - 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("Target1"))); - REQUIRE_THAT(src, IsClass(_A("Target2"))); - REQUIRE_THAT(src, IsClass(_A("Proxy"))); - REQUIRE_THAT( - src, IsInstantiation(_A("Proxy"), _A("Proxy"))); - REQUIRE_THAT( - src, IsInstantiation(_A("Proxy"), _A("Proxy"))); - REQUIRE_THAT(src, - IsAggregation(_A("ProxyHolder"), _A("Proxy"), "+proxy1")); - REQUIRE_THAT(src, - IsAggregation(_A("ProxyHolder"), _A("Proxy"), "+proxy2")); - REQUIRE_THAT( - src, !IsAggregation(_A("ProxyHolder"), _A("Target1"), "+proxy1")); - REQUIRE_THAT( - src, !IsAggregation(_A("ProxyHolder"), _A("Target2"), "+proxy2")); - REQUIRE_THAT(src, IsDependency(_A("Proxy"), _A("Target1"))); - REQUIRE_THAT(src, IsDependency(_A("Proxy"), _A("Target2"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsInstantiation(src, "Proxy", "Proxy")); + REQUIRE(IsInstantiation(src, "Proxy", "Proxy")); + REQUIRE(IsAggregation( + src, "ProxyHolder", "Proxy", "proxy1")); + REQUIRE(IsAggregation( + src, "ProxyHolder", "Proxy", "proxy2")); + REQUIRE( + !IsAggregation(src, "ProxyHolder", "Target1", "proxy1")); + REQUIRE( + !IsAggregation(src, "ProxyHolder", "Target2", "proxy2")); + }); } \ No newline at end of file diff --git a/tests/t00026/test_case.h b/tests/t00026/test_case.h index 3de355c2..90ecca47 100644 --- a/tests/t00026/test_case.h +++ b/tests/t00026/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00026/test_case.cc + * tests/t00026/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00026", "[test-case][class]") +TEST_CASE("t00026") { + using namespace clanguml::test; + auto [config, db] = load_config("t00026"); auto diagram = config.diagrams["t00026_class"]; @@ -28,48 +30,15 @@ TEST_CASE("t00026", "[test-case][class]") REQUIRE(model->name() == "t00026_class"); - { - auto src = generate_class_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsClassTemplate(src, "Memento")); + REQUIRE(IsClassTemplate(src, "Originator")); + REQUIRE(IsClassTemplate(src, "Caretaker")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsClassTemplate("Memento", "T")); - REQUIRE_THAT(src, IsClassTemplate("Originator", "T")); - REQUIRE_THAT(src, IsClassTemplate("Caretaker", "T")); - REQUIRE_THAT(src, - IsInstantiation( - _A("Originator"), _A("Originator"))); - REQUIRE_THAT(src, - IsInstantiation(_A("Caretaker"), _A("Caretaker"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsClassTemplate(j, "Memento")); - REQUIRE(IsClassTemplate(j, "Originator")); - REQUIRE(IsInstantiation(j, "Originator", "Originator")); - - 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("Memento"))); - REQUIRE_THAT(src, IsClass(_A("Originator"))); - REQUIRE_THAT(src, IsClass(_A("Caretaker"))); - REQUIRE_THAT(src, - IsInstantiation( - _A("Originator"), _A("Originator"))); - REQUIRE_THAT(src, - IsInstantiation(_A("Caretaker"), _A("Caretaker"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE( + IsInstantiation(src, "Originator", "Originator")); + REQUIRE( + IsInstantiation(src, "Originator", "Originator")); + REQUIRE(IsInstantiation(src, "Caretaker", "Caretaker")); + }); } \ No newline at end of file diff --git a/tests/t00027/test_case.h b/tests/t00027/test_case.h index e9cd07a8..afc9133f 100644 --- a/tests/t00027/test_case.h +++ b/tests/t00027/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00027", "[test-case][class]") +TEST_CASE("t00027") { + using namespace clanguml::test; + auto [config, db] = load_config("t00027"); auto diagram = config.diagrams["t00027_class"]; @@ -28,6 +30,29 @@ TEST_CASE("t00027", "[test-case][class]") REQUIRE(model->name() == "t00027_class"); + CHECK_CLASS_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsAbstractClass(src, "Shape")); + REQUIRE(IsAbstractClass(src, "ShapeDecorator")); + + REQUIRE(IsClassTemplate(src, "Line...>")); + REQUIRE(IsInstantiation(src, "Line...>", "Line")); + REQUIRE(IsInstantiation(src, "Line...>", "Line")); + REQUIRE(IsAggregation(src, "Window", "Text", "description")); + + REQUIRE(IsInstantiation(src, "Line...>", "Line")); + REQUIRE(IsInstantiation(src, "Line...>", "Line")); + REQUIRE(IsInstantiation(src, "Text...>", "Text")); + REQUIRE(IsInstantiation(src, "Text...>", "Text")); + + REQUIRE(IsAggregation( + src, "Window", "Line", "border")); + REQUIRE(IsAggregation(src, "Window", "Line", "divider")); + REQUIRE(IsAggregation( + src, "Window", "Text", "title")); + REQUIRE( + IsAggregation(src, "Window", "Text", "description")); + }); +/* { auto src = generate_class_puml(diagram, *model); AliasMatcher _A(src); @@ -102,5 +127,5 @@ TEST_CASE("t00027", "[test-case][class]") IsAggregation(_A("Window"), _A("Text"), "+description")); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } \ No newline at end of file diff --git a/tests/t00028/test_case.h b/tests/t00028/test_case.h index 77b8df35..3598f279 100644 --- a/tests/t00028/test_case.h +++ b/tests/t00028/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00028/test_case.cc + * tests/t00028/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00028", "[test-case][class]") +TEST_CASE("t00028") { + using namespace clanguml::test; + auto [config, db] = load_config("t00028"); auto diagram = config.diagrams["t00028_class"]; @@ -28,78 +30,105 @@ TEST_CASE("t00028", "[test-case][class]") REQUIRE(model->name() == "t00028_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("B"))); - REQUIRE_THAT(src, IsClass(_A("C"))); - REQUIRE_THAT(src, IsClass(_A("D"))); - REQUIRE_THAT(src, IsClassTemplate("E", "T")); - REQUIRE_THAT(src, IsEnum(_A("F"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - REQUIRE_THAT(src, HasNote(_A("A"), "top", "A class note.")); - REQUIRE_THAT(src, HasNote(_A("B"), "left", "B class note.")); - REQUIRE_THAT(src, HasNote(_A("C"), "bottom", "C class note.")); + 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_THAT(src, HasNote(_A("D"), "left", d_note)); - REQUIRE_THAT( - src, HasNote(_A("E"), "left", "E template class note.")); - REQUIRE_THAT(src, HasNote(_A("F"), "bottom", "F enum note.")); - REQUIRE_THAT(src, !HasNote(_A("G"), "left", "G class note.")); - REQUIRE_THAT(src, HasNote(_A("R"), "right", "R class note.")); - REQUIRE_THAT(src, - HasMemberNote( - _A("R"), "aaa", "left", "R contains an instance of A.")); - REQUIRE_THAT( - src, !HasMemberNote(_A("R"), "bbb", "right", "R class note.")); - REQUIRE_THAT( - src, HasMemberNote(_A("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, "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.")); + }); + /* + { + auto src = generate_class_puml(diagram, *model); + AliasMatcher _A(src); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - using namespace json; + 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, IsClassTemplate("E", "T")); + REQUIRE_THAT(src, IsEnum(_A("F"))); + REQUIRE_THAT(src, IsClass(_A("R"))); + REQUIRE_THAT(src, HasNote(_A("A"), "top", "A class note.")); + REQUIRE_THAT(src, HasNote(_A("B"), "left", "B class note.")); + REQUIRE_THAT(src, HasNote(_A("C"), "bottom", "C class note.")); + const auto d_note = R"( + D + class + note.)"; + REQUIRE_THAT(src, HasNote(_A("D"), "left", d_note)); + REQUIRE_THAT( + src, HasNote(_A("E"), "left", "E template class note.")); + REQUIRE_THAT(src, HasNote(_A("F"), "bottom", "F enum note.")); + REQUIRE_THAT(src, !HasNote(_A("G"), "left", "G class note.")); + REQUIRE_THAT(src, HasNote(_A("R"), "right", "R class note.")); + REQUIRE_THAT(src, + HasMemberNote( + _A("R"), "aaa", "left", "R contains an instance of A.")); + REQUIRE_THAT( + src, !HasMemberNote(_A("R"), "bbb", "right", "R class note.")); + REQUIRE_THAT( + src, HasMemberNote(_A("R"), "ccc", "left", "Reference to C.")); - save_json(config.output_directory(), diagram->name + ".json", j); - } - { - auto src = generate_class_mermaid(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } + { + auto j = generate_class_json(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::HasNote; - using mermaid::IsEnum; + using namespace json; - 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, IsEnum(_A("F"))); - REQUIRE_THAT(src, IsClass(_A("R"))); - REQUIRE_THAT(src, HasNote(_A("A"), "top", "A class note.")); - REQUIRE_THAT(src, HasNote(_A("B"), "left", "B class note.")); - REQUIRE_THAT(src, HasNote(_A("C"), "bottom", "C class note.")); - const auto d_note = R"( -D -class -note.)"; - REQUIRE_THAT(src, HasNote(_A("D"), "left", d_note)); - REQUIRE_THAT( - src, HasNote(_A("E"), "left", "E template class note.")); - REQUIRE_THAT(src, HasNote(_A("F"), "bottom", "F enum note.")); - REQUIRE_THAT(src, !HasNote(_A("G"), "left", "G class note.")); - REQUIRE_THAT(src, HasNote(_A("R"), "right", "R class note.")); + save_json(config.output_directory(), diagram->name + ".json", j); + } + { + auto src = generate_class_mermaid(diagram, *model); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + mermaid::AliasMatcher _A(src); + using mermaid::HasNote; + 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("D"))); + REQUIRE_THAT(src, IsClass(_A("E"))); + REQUIRE_THAT(src, IsEnum(_A("F"))); + REQUIRE_THAT(src, IsClass(_A("R"))); + REQUIRE_THAT(src, HasNote(_A("A"), "top", "A class note.")); + REQUIRE_THAT(src, HasNote(_A("B"), "left", "B class note.")); + REQUIRE_THAT(src, HasNote(_A("C"), "bottom", "C class note.")); + const auto d_note = R"( + D + class + note.)"; + REQUIRE_THAT(src, HasNote(_A("D"), "left", d_note)); + REQUIRE_THAT( + src, HasNote(_A("E"), "left", "E template class note.")); + REQUIRE_THAT(src, HasNote(_A("F"), "bottom", "F enum note.")); + REQUIRE_THAT(src, !HasNote(_A("G"), "left", "G class note.")); + REQUIRE_THAT(src, HasNote(_A("R"), "right", "R class note.")); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t00029/test_case.h b/tests/t00029/test_case.h index c5ed006b..4e70ae2d 100644 --- a/tests/t00029/test_case.h +++ b/tests/t00029/test_case.h @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00029", "[test-case][class]") +TEST_CASE("t00029") { + using namespace clanguml::test; + auto [config, db] = load_config("t00029"); auto diagram = config.diagrams["t00029_class"]; @@ -28,66 +30,23 @@ TEST_CASE("t00029", "[test-case][class]") REQUIRE(model->name() == "t00029_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(IsClassTemplate(src, "C")); + REQUIRE(!IsClassTemplate(src, "D")); + REQUIRE(IsEnum(src, "E")); + REQUIRE(!IsEnum(src, "F")); + REQUIRE(IsClass(src, "G1")); + REQUIRE(IsClass(src, "G2")); + REQUIRE(IsClass(src, "G3")); + REQUIRE(IsClass(src, "G4")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsClass(src, "R")); - REQUIRE_THAT(src, IsClass(_A("A"))); - REQUIRE_THAT(src, !IsClass(_A("B"))); - REQUIRE_THAT(src, IsClassTemplate("C", "T")); - REQUIRE_THAT(src, !IsClassTemplate("D", "T")); - REQUIRE_THAT(src, IsEnum(_A("E"))); - REQUIRE_THAT(src, !IsEnum(_A("F"))); - REQUIRE_THAT(src, IsClass(_A("G1"))); - REQUIRE_THAT(src, IsClass(_A("G2"))); - REQUIRE_THAT(src, IsClass(_A("G3"))); - REQUIRE_THAT(src, IsClass(_A("G4"))); - - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("G1"), "+g1")); - REQUIRE_THAT(src, !IsAggregation(_A("R"), _A("G2"), "+g2")); - REQUIRE_THAT(src, !IsAggregation(_A("R"), _A("G3"), "+g3")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("G4"), "+g4")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsAggregation(j, "R", "G1", "g1")); - - 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("D"))); - REQUIRE_THAT(src, IsEnum(_A("E"))); - REQUIRE_THAT(src, !IsEnum(_A("F"))); - REQUIRE_THAT(src, IsClass(_A("G1"))); - REQUIRE_THAT(src, IsClass(_A("G2"))); - REQUIRE_THAT(src, IsClass(_A("G3"))); - REQUIRE_THAT(src, IsClass(_A("G4"))); - - REQUIRE_THAT(src, IsClass(_A("R"))); - - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("G1"), "+g1")); - REQUIRE_THAT(src, !IsAggregation(_A("R"), _A("G2"), "+g2")); - REQUIRE_THAT(src, !IsAggregation(_A("R"), _A("G3"), "+g3")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("G4"), "+g4")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsAggregation(src, "R", "G1", "g1")); + REQUIRE(!IsAggregation(src, "R", "G2", "g2")); + REQUIRE(!IsAggregation(src, "R", "G3", "g3")); + REQUIRE(IsAssociation(src, "R", "G4", "g4")); + }); } \ No newline at end of file diff --git a/tests/t00030/test_case.h b/tests/t00030/test_case.h index bd04683e..30a0a2f0 100644 --- a/tests/t00030/test_case.h +++ b/tests/t00030/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00030/test_case.cc + * tests/t00030/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t00030", "[test-case][class]") +TEST_CASE("t00030") { + using namespace clanguml::test; + auto [config, db] = load_config("t00030"); auto diagram = config.diagrams["t00030_class"]; @@ -28,55 +30,16 @@ TEST_CASE("t00030", "[test-case][class]") REQUIRE(model->name() == "t00030_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_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, IsAssociation(_A("R"), _A("A"), "+aaa")); - REQUIRE_THAT( - src, IsComposition(_A("R"), _A("B"), "+bbb", "0..1", "1..*")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("C"), "+ccc", "0..1", "1..5")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("D"), "+ddd", "", "1")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("E"), "+eee", "", "1")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - { - auto j = generate_class_json(diagram, *model); - - using namespace json; - - REQUIRE(IsAggregation(j, "R", "C", "ccc")); - - 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, IsAssociation(_A("R"), _A("A"), "+aaa")); - REQUIRE_THAT( - src, IsComposition(_A("R"), _A("B"), "+bbb", "0..1", "1..*")); - REQUIRE_THAT( - src, IsAggregation(_A("R"), _A("C"), "+ccc", "0..1", "1..5")); - REQUIRE_THAT(src, IsAssociation(_A("R"), _A("D"), "+ddd", "", "1")); - REQUIRE_THAT(src, IsAggregation(_A("R"), _A("E"), "+eee", "", "1")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsAssociation(src, "R", "A", "aaa")); + REQUIRE(IsComposition(src, "R", "B", "bbb", "0..1", "1..*")); + REQUIRE(IsAggregation(src, "R", "C", "ccc", "0..1", "1..5")); + REQUIRE(IsAssociation(src, "R", "D", "ddd", "", "1")); + REQUIRE(IsAggregation(src, "R", "E", "eee", "", "1")); + }); } \ No newline at end of file diff --git a/tests/t30001/test_case.h b/tests/t30001/test_case.h index 4772e727..8b85fbe1 100644 --- a/tests/t30001/test_case.h +++ b/tests/t30001/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t30001/test_case.cc + * tests/t30001/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30001", "[test-case][package]") +TEST_CASE("t30001") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30001"); auto diagram = config.diagrams["t30001_package"]; @@ -28,104 +31,34 @@ TEST_CASE("t30001", "[test-case][package]") REQUIRE(model->name() == "t30001_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(HasTitle(src, "Basic package diagram example")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(!IsNamespacePackage(src, "clanguml"s)); + REQUIRE(!IsNamespacePackage(src, "t30001"s)); + REQUIRE(IsNamespacePackage(src, "A"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "AAA"s)); + REQUIRE(IsNamespacePackage(src, "B"s, "AA"s, "AAA"s)); + REQUIRE(IsNamespacePackage(src, "B"s, "AA"s, "BBB"s)); + REQUIRE(IsNamespacePackage(src, "B"s, "BB"s)); + REQUIRE(IsNamespacePackage(src, "B"s)); - REQUIRE_THAT(src, HasTitle("Basic package diagram example")); + REQUIRE( + HasNote(src, "AA", "top", "This is namespace AA in namespace A")); - REQUIRE_THAT(src, IsPackage("A")); - REQUIRE_THAT(src, IsPackage("AAA")); - REQUIRE_THAT(src, IsPackage("AAA")); + REQUIRE(HasLink(src, "AAA", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t30001/t30001.cc#L6", + clanguml::util::get_git_commit()), + "AAA")); - // TODO: Fix _A() to handle fully qualified names, right - // now it only finds the first element with unqualified - // name match - REQUIRE_THAT(src, - HasNote(_A("AA"), "top", "This is namespace AA in namespace A")); + REQUIRE(HasLink(src, "BBB", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t30001/t30001.cc#L8", + clanguml::util::get_git_commit()), + "BBB")); - REQUIRE_THAT(src, - HasLink(_A("AAA"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t30001/t30001.cc#L6", - clanguml::util::get_git_commit()), - "AAA")); - - REQUIRE_THAT(src, - HasLink(_A("BBB"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t30001/t30001.cc#L8", - clanguml::util::get_git_commit()), - "BBB")); - - REQUIRE_THAT(src, HasComment("t30001 test diagram of type package")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_package_json(diagram, *model); - - using namespace json; - using namespace std::string_literals; - - REQUIRE(HasTitle(j, "Basic package diagram example")); - - REQUIRE(!IsNamespacePackage(j, "clanguml"s)); - REQUIRE(!IsNamespacePackage(j, "t30001"s)); - REQUIRE(IsNamespacePackage(j, "A"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "AAA"s)); - REQUIRE(IsNamespacePackage(j, "B"s, "AA"s, "AAA"s)); - REQUIRE(IsNamespacePackage(j, "B"s, "AA"s, "BBB"s)); - REQUIRE(IsNamespacePackage(j, "B"s, "BB"s)); - REQUIRE(IsNamespacePackage(j, "B"s)); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_package_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - - using mermaid::HasComment; - using mermaid::HasLink; - using mermaid::HasPackageNote; - using mermaid::HasTitle; - using mermaid::IsPackage; - - REQUIRE_THAT(src, HasTitle("Basic package diagram example")); - - REQUIRE_THAT(src, IsPackage(_A("A"))); - REQUIRE_THAT(src, IsPackage(_A("AAA"))); - REQUIRE_THAT(src, IsPackage(_A("AAA"))); - - // TODO: Fix _A() to handle fully qualified names, right - // now it only finds the first element with unqualified - // name match - REQUIRE_THAT(src, - HasPackageNote( - _A("AA"), "top", "This is namespace AA in namespace A")); - - REQUIRE_THAT(src, - HasLink(_A("AAA"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t30001/t30001.cc#L6", - clanguml::util::get_git_commit()), - "AAA")); - - REQUIRE_THAT(src, - HasLink(_A("BBB"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t30001/t30001.cc#L8", - clanguml::util::get_git_commit()), - "BBB")); - - REQUIRE_THAT(src, HasComment("t30001 test diagram of type package")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(HasComment(src, "t30001 test diagram of type package")); + }); } diff --git a/tests/t30002/test_case.h b/tests/t30002/test_case.h index 908402ae..8b5daa65 100644 --- a/tests/t30002/test_case.h +++ b/tests/t30002/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t30002/test_case.cc + * tests/t30002/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30002", "[test-case][package]") +TEST_CASE("t30002") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30002"); auto diagram = config.diagrams["t30002_package"]; @@ -28,146 +31,191 @@ TEST_CASE("t30002", "[test-case][package]") REQUIRE(model->name() == "t30002_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A1"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A2"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A3"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A4"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A5"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A6"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A7"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A8"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A9"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A10"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A11"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A12"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A13"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A14"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A15"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A16"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A17"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "A18"s)); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsNamespacePackage(src, "B"s, "BB"s, "BBB"s)); - REQUIRE_THAT(src, IsPackage("A1")); - REQUIRE_THAT(src, IsPackage("A2")); - REQUIRE_THAT(src, IsPackage("A3")); - REQUIRE_THAT(src, IsPackage("A4")); - REQUIRE_THAT(src, IsPackage("A5")); - REQUIRE_THAT(src, IsPackage("A6")); - REQUIRE_THAT(src, IsPackage("A7")); - REQUIRE_THAT(src, IsPackage("A8")); - REQUIRE_THAT(src, IsPackage("A9")); - REQUIRE_THAT(src, IsPackage("A11")); - REQUIRE_THAT(src, IsPackage("A12")); - REQUIRE_THAT(src, IsPackage("A13")); - REQUIRE_THAT(src, IsPackage("A14")); - REQUIRE_THAT(src, IsPackage("A15")); - REQUIRE_THAT(src, IsPackage("A16")); - REQUIRE_THAT(src, IsPackage("A17")); - REQUIRE_THAT(src, IsPackage("A18")); + REQUIRE(IsDependency(src, "BBB", "A1")); + REQUIRE(IsDependency(src, "BBB", "A2")); + REQUIRE(IsDependency(src, "BBB", "A3")); + REQUIRE(IsDependency(src, "BBB", "A4")); + REQUIRE(IsDependency(src, "BBB", "A5")); + REQUIRE(IsDependency(src, "BBB", "A6")); + REQUIRE(IsDependency(src, "BBB", "A7")); + REQUIRE(IsDependency(src, "BBB", "A8")); + REQUIRE(IsDependency(src, "BBB", "A9")); + REQUIRE(IsDependency(src, "BBB", "A10")); + REQUIRE(IsDependency(src, "BBB", "A11")); + REQUIRE(IsDependency(src, "BBB", "A12")); + REQUIRE(IsDependency(src, "BBB", "A13")); + REQUIRE(IsDependency(src, "BBB", "A14")); + REQUIRE(IsDependency(src, "BBB", "A15")); + REQUIRE(IsDependency(src, "BBB", "A16")); + REQUIRE(IsDependency(src, "BBB", "A17")); + REQUIRE(IsDependency(src, "BBB", "A18")); + }); + /* + { + auto src = generate_package_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A1"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A2"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A3"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A4"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A5"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A6"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A7"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A8"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A9"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A10"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A11"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A12"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A13"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A14"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A15"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A16"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A17"))); - REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A18"))); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsPackage("A1")); + REQUIRE_THAT(src, IsPackage("A2")); + REQUIRE_THAT(src, IsPackage("A3")); + REQUIRE_THAT(src, IsPackage("A4")); + REQUIRE_THAT(src, IsPackage("A5")); + REQUIRE_THAT(src, IsPackage("A6")); + REQUIRE_THAT(src, IsPackage("A7")); + REQUIRE_THAT(src, IsPackage("A8")); + REQUIRE_THAT(src, IsPackage("A9")); + REQUIRE_THAT(src, IsPackage("A11")); + REQUIRE_THAT(src, IsPackage("A12")); + REQUIRE_THAT(src, IsPackage("A13")); + REQUIRE_THAT(src, IsPackage("A14")); + REQUIRE_THAT(src, IsPackage("A15")); + REQUIRE_THAT(src, IsPackage("A16")); + REQUIRE_THAT(src, IsPackage("A17")); + REQUIRE_THAT(src, IsPackage("A18")); - { - auto j = generate_package_json(diagram, *model); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A1"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A2"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A3"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A4"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A5"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A6"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A7"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A8"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A9"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A10"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A11"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A12"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A13"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A14"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A15"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A16"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A17"))); + REQUIRE_THAT(src, IsDependency(_A("BBB"), _A("A18"))); - using namespace json; - using namespace std::string_literals; + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A1"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A2"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A3"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A4"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A5"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A6"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A7"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A8"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A9"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A10"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A11"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A12"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A13"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A14"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A15"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A16"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A17"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A18"s)); + { + auto j = generate_package_json(diagram, *model); - REQUIRE(IsNamespacePackage(j, "B"s, "BB"s, "BBB"s)); + using namespace json; + using namespace std::string_literals; - REQUIRE(IsDependency(j, "BBB", "A1")); - REQUIRE(IsDependency(j, "BBB", "A2")); - REQUIRE(IsDependency(j, "BBB", "A3")); - REQUIRE(IsDependency(j, "BBB", "A4")); - REQUIRE(IsDependency(j, "BBB", "A5")); - REQUIRE(IsDependency(j, "BBB", "A6")); - REQUIRE(IsDependency(j, "BBB", "A7")); - REQUIRE(IsDependency(j, "BBB", "A8")); - REQUIRE(IsDependency(j, "BBB", "A9")); - REQUIRE(IsDependency(j, "BBB", "A10")); - REQUIRE(IsDependency(j, "BBB", "A11")); - REQUIRE(IsDependency(j, "BBB", "A12")); - REQUIRE(IsDependency(j, "BBB", "A13")); - REQUIRE(IsDependency(j, "BBB", "A14")); - REQUIRE(IsDependency(j, "BBB", "A15")); - REQUIRE(IsDependency(j, "BBB", "A16")); - REQUIRE(IsDependency(j, "BBB", "A17")); - REQUIRE(IsDependency(j, "BBB", "A18")); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A1"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A2"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A3"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A4"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A5"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A6"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A7"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A8"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A9"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A10"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A11"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A12"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A13"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A14"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A15"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A16"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A17"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s, "A18"s)); - save_json(config.output_directory(), diagram->name + ".json", j); - } + REQUIRE(IsNamespacePackage(j, "B"s, "BB"s, "BBB"s)); - { - auto src = generate_package_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsPackage; - using mermaid::IsPackageDependency; + REQUIRE(IsDependency(j, "BBB", "A1")); + REQUIRE(IsDependency(j, "BBB", "A2")); + REQUIRE(IsDependency(j, "BBB", "A3")); + REQUIRE(IsDependency(j, "BBB", "A4")); + REQUIRE(IsDependency(j, "BBB", "A5")); + REQUIRE(IsDependency(j, "BBB", "A6")); + REQUIRE(IsDependency(j, "BBB", "A7")); + REQUIRE(IsDependency(j, "BBB", "A8")); + REQUIRE(IsDependency(j, "BBB", "A9")); + REQUIRE(IsDependency(j, "BBB", "A10")); + REQUIRE(IsDependency(j, "BBB", "A11")); + REQUIRE(IsDependency(j, "BBB", "A12")); + REQUIRE(IsDependency(j, "BBB", "A13")); + REQUIRE(IsDependency(j, "BBB", "A14")); + REQUIRE(IsDependency(j, "BBB", "A15")); + REQUIRE(IsDependency(j, "BBB", "A16")); + REQUIRE(IsDependency(j, "BBB", "A17")); + REQUIRE(IsDependency(j, "BBB", "A18")); - REQUIRE_THAT(src, IsPackage(_A("A1"))); - REQUIRE_THAT(src, IsPackage(_A("A2"))); - REQUIRE_THAT(src, IsPackage(_A("A3"))); - REQUIRE_THAT(src, IsPackage(_A("A4"))); - REQUIRE_THAT(src, IsPackage(_A("A5"))); - REQUIRE_THAT(src, IsPackage(_A("A6"))); - REQUIRE_THAT(src, IsPackage(_A("A7"))); - REQUIRE_THAT(src, IsPackage(_A("A8"))); - REQUIRE_THAT(src, IsPackage(_A("A9"))); - REQUIRE_THAT(src, IsPackage(_A("A11"))); - REQUIRE_THAT(src, IsPackage(_A("A12"))); - REQUIRE_THAT(src, IsPackage(_A("A13"))); - REQUIRE_THAT(src, IsPackage(_A("A14"))); - REQUIRE_THAT(src, IsPackage(_A("A15"))); - REQUIRE_THAT(src, IsPackage(_A("A16"))); - REQUIRE_THAT(src, IsPackage(_A("A17"))); - REQUIRE_THAT(src, IsPackage(_A("A18"))); + save_json(config.output_directory(), diagram->name + ".json", j); + } - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A1"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A2"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A3"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A4"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A5"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A6"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A7"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A8"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A9"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A10"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A11"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A12"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A13"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A14"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A15"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A16"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A17"))); - REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A18"))); + { + auto src = generate_package_mermaid(diagram, *model); + mermaid::AliasMatcher _A(src); + using mermaid::IsPackage; + using mermaid::IsPackageDependency; - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsPackage(_A("A1"))); + REQUIRE_THAT(src, IsPackage(_A("A2"))); + REQUIRE_THAT(src, IsPackage(_A("A3"))); + REQUIRE_THAT(src, IsPackage(_A("A4"))); + REQUIRE_THAT(src, IsPackage(_A("A5"))); + REQUIRE_THAT(src, IsPackage(_A("A6"))); + REQUIRE_THAT(src, IsPackage(_A("A7"))); + REQUIRE_THAT(src, IsPackage(_A("A8"))); + REQUIRE_THAT(src, IsPackage(_A("A9"))); + REQUIRE_THAT(src, IsPackage(_A("A11"))); + REQUIRE_THAT(src, IsPackage(_A("A12"))); + REQUIRE_THAT(src, IsPackage(_A("A13"))); + REQUIRE_THAT(src, IsPackage(_A("A14"))); + REQUIRE_THAT(src, IsPackage(_A("A15"))); + REQUIRE_THAT(src, IsPackage(_A("A16"))); + REQUIRE_THAT(src, IsPackage(_A("A17"))); + REQUIRE_THAT(src, IsPackage(_A("A18"))); + + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A1"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A2"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A3"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A4"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A5"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A6"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A7"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A8"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A9"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A10"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A11"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A12"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A13"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A14"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A15"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A16"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A17"))); + REQUIRE_THAT(src, IsPackageDependency(_A("BBB"), _A("A18"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + } + */ } diff --git a/tests/t30003/test_case.h b/tests/t30003/test_case.h index 4b9f5863..301bbb73 100644 --- a/tests/t30003/test_case.h +++ b/tests/t30003/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t30003/test_case.cc + * tests/t30003/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30003", "[test-case][package]") +TEST_CASE("t30003") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30003"); auto diagram = config.diagrams["t30003_package"]; @@ -27,58 +30,16 @@ TEST_CASE("t30003", "[test-case][package]") auto model = generate_package_diagram(*db, diagram); REQUIRE(model->name() == "t30003_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsNamespacePackage(src, "ns1"s)); + REQUIRE(IsNamespacePackage(src, "ns1"s, "ns2_v1_0_0"s)); + REQUIRE(IsNamespacePackage(src, "ns1"s, "ns2_v0_9_0"s)); + REQUIRE(IsNamespacePackage(src, "ns3"s)); + REQUIRE(IsNamespacePackage(src, "ns3"s, "ns1"s)); + REQUIRE(IsNamespacePackage(src, "ns3"s, "ns1"s, "ns2"s)); - REQUIRE_THAT(src, IsPackage("ns1")); - REQUIRE_THAT(src, IsPackage("ns2")); - REQUIRE_THAT(src, IsPackage("ns3")); - REQUIRE_THAT(src, IsPackage("ns2_v1_0_0")); - REQUIRE_THAT(src, IsPackage("ns2_v0_9_0")); - - REQUIRE_THAT(src, IsDeprecated(_A("ns2_v0_9_0"))); - REQUIRE_THAT(src, IsDeprecated(_A("ns3"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_package_json(diagram, *model); - - using namespace json; - using namespace std::string_literals; - - REQUIRE(IsNamespacePackage(j, "ns1"s)); - REQUIRE(IsNamespacePackage(j, "ns1"s, "ns2_v1_0_0"s)); - REQUIRE(IsNamespacePackage(j, "ns1"s, "ns2_v0_9_0"s)); - REQUIRE(IsNamespacePackage(j, "ns3"s)); - REQUIRE(IsNamespacePackage(j, "ns3"s, "ns1"s)); - REQUIRE(IsNamespacePackage(j, "ns3"s, "ns1"s, "ns2"s)); - - REQUIRE(IsDeprecated(j, "ns2_v0_9_0")); - REQUIRE(IsDeprecated(j, "ns3")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_package_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsPackage; - - REQUIRE_THAT(src, IsPackage(_A("ns1"))); - REQUIRE_THAT(src, IsPackage(_A("ns2"))); - REQUIRE_THAT(src, IsPackage(_A("ns3"))); - REQUIRE_THAT(src, IsPackage(_A("ns2_v1_0_0"))); - REQUIRE_THAT(src, IsPackage(_A("ns2_v0_9_0"))); - - // REQUIRE_THAT(src, IsDeprecated(_A("ns2_v0_9_0"))); - // REQUIRE_THAT(src, IsDeprecated(_A("ns3"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + // REQUIRE(IsDeprecated(src, "ns2_v0_9_0")); + // REQUIRE(IsDeprecated(src, "ns3")); + }); } diff --git a/tests/t30004/test_case.h b/tests/t30004/test_case.h index bd66c760..4829f92a 100644 --- a/tests/t30004/test_case.h +++ b/tests/t30004/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t30004/test_case.cc + * tests/t30004/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30004", "[test-case][package]") +TEST_CASE("t30004") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30004"); auto diagram = config.diagrams["t30004_package"]; @@ -28,7 +31,15 @@ TEST_CASE("t30004", "[test-case][package]") REQUIRE(model->name() == "t30004_package"); - { + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsNamespacePackage(src, "A"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AAA"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "BBB"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "CCC"s)); + REQUIRE(!IsNamespacePackage(src, "A"s, "DDD"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "EEE"s)); + }); + /*{ auto src = generate_package_puml(diagram, *model); AliasMatcher _A(src); @@ -72,5 +83,5 @@ TEST_CASE("t30004", "[test-case][package]") REQUIRE_THAT(src, IsPackage(_A("EEE"))); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } diff --git a/tests/t30005/test_case.h b/tests/t30005/test_case.h index 57248548..ef0098b3 100644 --- a/tests/t30005/test_case.h +++ b/tests/t30005/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t30005/test_case.cc + * tests/t30005/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30005", "[test-case][package]") +TEST_CASE("t30005") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30005"); auto diagram = config.diagrams["t30005_package"]; @@ -28,6 +31,21 @@ TEST_CASE("t30005", "[test-case][package]") REQUIRE(model->name() == "t30005_package"); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsNamespacePackage(src, "A"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s, "AAA"s)); + REQUIRE(IsNamespacePackage(src, "B"s)); + REQUIRE(IsNamespacePackage(src, "B"s, "BB"s)); + REQUIRE(IsNamespacePackage(src, "B"s, "BB"s, "BBB"s)); + REQUIRE(IsNamespacePackage(src, "C"s)); + REQUIRE(IsNamespacePackage(src, "C"s, "CC"s)); + REQUIRE(IsNamespacePackage(src, "C"s, "CC"s, "CCC"s)); + + REQUIRE(IsDependency(src, "BBB", "AAA")); + REQUIRE(IsDependency(src, "CCC", "AAA")); + }); +/* { auto src = generate_package_puml(diagram, *model); AliasMatcher _A(src); @@ -82,5 +100,5 @@ TEST_CASE("t30005", "[test-case][package]") REQUIRE_THAT(src, IsPackageDependency(_A("CCC"), _A("AAA"))); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } diff --git a/tests/t30006/test_case.h b/tests/t30006/test_case.h index 6201fa50..3e580e14 100644 --- a/tests/t30006/test_case.h +++ b/tests/t30006/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30006", "[test-case][package]") +TEST_CASE("t30006") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30006"); auto diagram = config.diagrams["t30006_package"]; @@ -28,6 +31,16 @@ TEST_CASE("t30006", "[test-case][package]") REQUIRE(model->name() == "t30006_package"); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsNamespacePackage(src, "A"s)); + REQUIRE(IsNamespacePackage(src, "B"s)); + REQUIRE(IsNamespacePackage(src, "C"s)); + + REQUIRE(IsDependency(src, "A", "B")); + REQUIRE(IsDependency(src, "A", "C")); + }); + + /* { auto src = generate_package_puml(diagram, *model); AliasMatcher _A(src); @@ -75,5 +88,5 @@ TEST_CASE("t30006", "[test-case][package]") REQUIRE_THAT(src, IsPackageDependency(_A("A"), _A("C"))); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } diff --git a/tests/t30007/test_case.h b/tests/t30007/test_case.h index 653212db..58fd9b39 100644 --- a/tests/t30007/test_case.h +++ b/tests/t30007/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30007", "[test-case][package]") +TEST_CASE("t30007") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30007"); auto diagram = config.diagrams["t30007_package"]; @@ -28,56 +31,68 @@ TEST_CASE("t30007", "[test-case][package]") REQUIRE(model->name() == "t30007_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsNamespacePackage(src, "A"s)); + REQUIRE(IsNamespacePackage(src, "A"s, "AA"s)); + REQUIRE(IsNamespacePackage(src, "B"s)); + REQUIRE(IsNamespacePackage(src, "C"s)); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsDependency(src, "AA", "B")); + REQUIRE(IsDependency(src, "AA", "C")); + }); + /* + { + auto src = generate_package_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, IsPackage("A")); - REQUIRE_THAT(src, IsPackage("B")); - REQUIRE_THAT(src, IsPackage("C")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsDependency(_A("AA"), _A("B"))); - REQUIRE_THAT(src, IsDependency(_A("AA"), _A("C"))); + REQUIRE_THAT(src, IsPackage("A")); + REQUIRE_THAT(src, IsPackage("B")); + REQUIRE_THAT(src, IsPackage("C")); - REQUIRE_THAT(src, IsLayoutHint(_A("C"), "up", _A("AA"))); - REQUIRE_THAT(src, IsLayoutHint(_A("C"), "left", _A("B"))); + REQUIRE_THAT(src, IsDependency(_A("AA"), _A("B"))); + REQUIRE_THAT(src, IsDependency(_A("AA"), _A("C"))); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsLayoutHint(_A("C"), "up", _A("AA"))); + REQUIRE_THAT(src, IsLayoutHint(_A("C"), "left", _A("B"))); - { - auto j = generate_package_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - using namespace json; - using namespace std::string_literals; + { + auto j = generate_package_json(diagram, *model); - REQUIRE(IsNamespacePackage(j, "A"s)); - REQUIRE(IsNamespacePackage(j, "A"s, "AA"s)); - REQUIRE(IsNamespacePackage(j, "B"s)); - REQUIRE(IsNamespacePackage(j, "C"s)); + using namespace json; + using namespace std::string_literals; - REQUIRE(IsDependency(j, "AA", "B")); - REQUIRE(IsDependency(j, "AA", "C")); + REQUIRE(IsNamespacePackage(j, "A"s)); + REQUIRE(IsNamespacePackage(j, "A"s, "AA"s)); + REQUIRE(IsNamespacePackage(j, "B"s)); + REQUIRE(IsNamespacePackage(j, "C"s)); - save_json(config.output_directory(), diagram->name + ".json", j); - } + REQUIRE(IsDependency(j, "AA", "B")); + REQUIRE(IsDependency(j, "AA", "C")); - { - auto src = generate_package_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsPackage; - using mermaid::IsPackageDependency; + save_json(config.output_directory(), diagram->name + ".json", j); + } - REQUIRE_THAT(src, IsPackage(_A("A"))); - REQUIRE_THAT(src, IsPackage(_A("B"))); - REQUIRE_THAT(src, IsPackage(_A("C"))); + { + auto src = generate_package_mermaid(diagram, *model); + mermaid::AliasMatcher _A(src); + using mermaid::IsPackage; + using mermaid::IsPackageDependency; - REQUIRE_THAT(src, IsPackageDependency(_A("AA"), _A("B"))); - REQUIRE_THAT(src, IsPackageDependency(_A("AA"), _A("C"))); + REQUIRE_THAT(src, IsPackage(_A("A"))); + REQUIRE_THAT(src, IsPackage(_A("B"))); + REQUIRE_THAT(src, IsPackage(_A("C"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsPackageDependency(_A("AA"), _A("B"))); + REQUIRE_THAT(src, IsPackageDependency(_A("AA"), _A("C"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + } + */ } diff --git a/tests/t30008/test_case.h b/tests/t30008/test_case.h index 70f52d6a..9100a09e 100644 --- a/tests/t30008/test_case.h +++ b/tests/t30008/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30008", "[test-case][package]") +TEST_CASE("t30008") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30008"); auto diagram = config.diagrams["t30008_package"]; @@ -28,79 +31,98 @@ TEST_CASE("t30008", "[test-case][package]") REQUIRE(model->name() == "t30008_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsNamespacePackage(src, "dependants"s, "A"s)); + REQUIRE(IsNamespacePackage(src, "dependants"s, "B"s)); + REQUIRE(IsNamespacePackage(src, "dependants"s, "C"s)); + REQUIRE(!IsNamespacePackage(src, "dependants"s, "X"s)); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsDependency(src, "B", "A")); + REQUIRE(IsDependency(src, "C", "B")); - REQUIRE_THAT(src, IsPackage("A")); - REQUIRE_THAT(src, IsPackage("B")); - REQUIRE_THAT(src, IsPackage("C")); - REQUIRE_THAT(src, !IsPackage("X")); + REQUIRE(IsNamespacePackage(src, "dependencies"s, "D"s)); + REQUIRE(IsNamespacePackage(src, "dependencies"s, "E"s)); + REQUIRE(IsNamespacePackage(src, "dependencies"s, "F"s)); + REQUIRE(!IsNamespacePackage(src, "dependencies"s, "Y"s)); - REQUIRE_THAT(src, IsDependency(_A("B"), _A("A"))); - REQUIRE_THAT(src, IsDependency(_A("C"), _A("B"))); + REQUIRE(IsDependency(src, "E", "D")); + REQUIRE(IsDependency(src, "F", "E")); + }); + /* + { + auto src = generate_package_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, IsPackage("D")); - REQUIRE_THAT(src, IsPackage("E")); - REQUIRE_THAT(src, IsPackage("F")); - REQUIRE_THAT(src, !IsPackage("Y")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsDependency(_A("E"), _A("D"))); - REQUIRE_THAT(src, IsDependency(_A("F"), _A("E"))); + REQUIRE_THAT(src, IsPackage("A")); + REQUIRE_THAT(src, IsPackage("B")); + REQUIRE_THAT(src, IsPackage("C")); + REQUIRE_THAT(src, !IsPackage("X")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsDependency(_A("B"), _A("A"))); + REQUIRE_THAT(src, IsDependency(_A("C"), _A("B"))); - { - auto j = generate_package_json(diagram, *model); + REQUIRE_THAT(src, IsPackage("D")); + REQUIRE_THAT(src, IsPackage("E")); + REQUIRE_THAT(src, IsPackage("F")); + REQUIRE_THAT(src, !IsPackage("Y")); - using namespace json; - using namespace std::string_literals; + REQUIRE_THAT(src, IsDependency(_A("E"), _A("D"))); + REQUIRE_THAT(src, IsDependency(_A("F"), _A("E"))); - REQUIRE(IsNamespacePackage(j, "dependants"s, "A"s)); - REQUIRE(IsNamespacePackage(j, "dependants"s, "B"s)); - REQUIRE(IsNamespacePackage(j, "dependants"s, "C"s)); - REQUIRE(!IsNamespacePackage(j, "dependants"s, "X"s)); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - REQUIRE(IsDependency(j, "B", "A")); - REQUIRE(IsDependency(j, "C", "B")); + { + auto j = generate_package_json(diagram, *model); - REQUIRE(IsNamespacePackage(j, "dependencies"s, "D"s)); - REQUIRE(IsNamespacePackage(j, "dependencies"s, "E"s)); - REQUIRE(IsNamespacePackage(j, "dependencies"s, "F"s)); - REQUIRE(!IsNamespacePackage(j, "dependencies"s, "Y"s)); + using namespace json; + using namespace std::string_literals; - REQUIRE(IsDependency(j, "E", "D")); - REQUIRE(IsDependency(j, "F", "E")); + REQUIRE(IsNamespacePackage(j, "dependants"s, "A"s)); + REQUIRE(IsNamespacePackage(j, "dependants"s, "B"s)); + REQUIRE(IsNamespacePackage(j, "dependants"s, "C"s)); + REQUIRE(!IsNamespacePackage(j, "dependants"s, "X"s)); - save_json(config.output_directory(), diagram->name + ".json", j); - } + REQUIRE(IsDependency(j, "B", "A")); + REQUIRE(IsDependency(j, "C", "B")); - { - auto src = generate_package_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsPackage; - using mermaid::IsPackageDependency; + REQUIRE(IsNamespacePackage(j, "dependencies"s, "D"s)); + REQUIRE(IsNamespacePackage(j, "dependencies"s, "E"s)); + REQUIRE(IsNamespacePackage(j, "dependencies"s, "F"s)); + REQUIRE(!IsNamespacePackage(j, "dependencies"s, "Y"s)); - REQUIRE_THAT(src, IsPackage(_A("A"))); - REQUIRE_THAT(src, IsPackage(_A("B"))); - REQUIRE_THAT(src, IsPackage(_A("C"))); - REQUIRE_THAT(src, !IsPackage(_A("X"))); + REQUIRE(IsDependency(j, "E", "D")); + REQUIRE(IsDependency(j, "F", "E")); - REQUIRE_THAT(src, IsPackageDependency(_A("B"), _A("A"))); - REQUIRE_THAT(src, IsPackageDependency(_A("C"), _A("B"))); + save_json(config.output_directory(), diagram->name + ".json", j); + } - REQUIRE_THAT(src, IsPackage(_A("D"))); - REQUIRE_THAT(src, IsPackage(_A("E"))); - REQUIRE_THAT(src, IsPackage(_A("F"))); - REQUIRE_THAT(src, !IsPackage(_A("Y"))); + { + auto src = generate_package_mermaid(diagram, *model); + mermaid::AliasMatcher _A(src); + using mermaid::IsPackage; + using mermaid::IsPackageDependency; - REQUIRE_THAT(src, IsPackageDependency(_A("E"), _A("D"))); - REQUIRE_THAT(src, IsPackageDependency(_A("F"), _A("E"))); + REQUIRE_THAT(src, IsPackage(_A("A"))); + REQUIRE_THAT(src, IsPackage(_A("B"))); + REQUIRE_THAT(src, IsPackage(_A("C"))); + REQUIRE_THAT(src, !IsPackage(_A("X"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsPackageDependency(_A("B"), _A("A"))); + REQUIRE_THAT(src, IsPackageDependency(_A("C"), _A("B"))); + + REQUIRE_THAT(src, IsPackage(_A("D"))); + REQUIRE_THAT(src, IsPackage(_A("E"))); + REQUIRE_THAT(src, IsPackage(_A("F"))); + REQUIRE_THAT(src, !IsPackage(_A("Y"))); + + REQUIRE_THAT(src, IsPackageDependency(_A("E"), _A("D"))); + REQUIRE_THAT(src, IsPackageDependency(_A("F"), _A("E"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } diff --git a/tests/t30009/test_case.h b/tests/t30009/test_case.h index 84600695..8a2156b3 100644 --- a/tests/t30009/test_case.h +++ b/tests/t30009/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30009", "[test-case][package]") +TEST_CASE("t30009") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30009"); auto diagram = config.diagrams["t30009_package"]; @@ -28,56 +31,70 @@ TEST_CASE("t30009", "[test-case][package]") REQUIRE(model->name() == "t30009_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsNamespacePackage(src, "One"s)); + REQUIRE(IsNamespacePackage(src, "Two"s)); + REQUIRE(IsNamespacePackage(src, "One"s, "A"s)); + REQUIRE(IsNamespacePackage(src, "One"s, "B"s)); + REQUIRE(IsNamespacePackage(src, "One"s, "C"s)); + REQUIRE(IsNamespacePackage(src, "One"s, "D"s)); + REQUIRE(IsNamespacePackage(src, "Two"s, "A"s)); + REQUIRE(IsNamespacePackage(src, "Two"s, "B"s)); + REQUIRE(IsNamespacePackage(src, "Two"s, "C"s)); + REQUIRE(IsNamespacePackage(src, "Two"s, "D"s)); + }); + /* + { + auto src = generate_package_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 packages exist - REQUIRE_THAT(src, IsPackage("One")); - REQUIRE_THAT(src, IsPackage("Two")); - REQUIRE_THAT(src, IsPackage("A")); - REQUIRE_THAT(src, IsPackage("B")); - REQUIRE_THAT(src, IsPackage("C")); - REQUIRE_THAT(src, IsPackage("D")); + // Check if all packages exist + REQUIRE_THAT(src, IsPackage("One")); + REQUIRE_THAT(src, IsPackage("Two")); + REQUIRE_THAT(src, IsPackage("A")); + REQUIRE_THAT(src, IsPackage("B")); + REQUIRE_THAT(src, IsPackage("C")); + REQUIRE_THAT(src, IsPackage("D")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - { - auto j = generate_package_json(diagram, *model); + { + auto j = generate_package_json(diagram, *model); - using namespace json; - using namespace std::string_literals; + using namespace json; + using namespace std::string_literals; - REQUIRE(IsNamespacePackage(j, "One"s)); - REQUIRE(IsNamespacePackage(j, "Two"s)); - REQUIRE(IsNamespacePackage(j, "One"s, "A"s)); - REQUIRE(IsNamespacePackage(j, "One"s, "B"s)); - REQUIRE(IsNamespacePackage(j, "One"s, "C"s)); - REQUIRE(IsNamespacePackage(j, "One"s, "D"s)); - REQUIRE(IsNamespacePackage(j, "Two"s, "A"s)); - REQUIRE(IsNamespacePackage(j, "Two"s, "B"s)); - REQUIRE(IsNamespacePackage(j, "Two"s, "C"s)); - REQUIRE(IsNamespacePackage(j, "Two"s, "D"s)); + REQUIRE(IsNamespacePackage(j, "One"s)); + REQUIRE(IsNamespacePackage(j, "Two"s)); + REQUIRE(IsNamespacePackage(j, "One"s, "A"s)); + REQUIRE(IsNamespacePackage(j, "One"s, "B"s)); + REQUIRE(IsNamespacePackage(j, "One"s, "C"s)); + REQUIRE(IsNamespacePackage(j, "One"s, "D"s)); + REQUIRE(IsNamespacePackage(j, "Two"s, "A"s)); + REQUIRE(IsNamespacePackage(j, "Two"s, "B"s)); + REQUIRE(IsNamespacePackage(j, "Two"s, "C"s)); + REQUIRE(IsNamespacePackage(j, "Two"s, "D"s)); - save_json(config.output_directory(), diagram->name + ".json", j); - } + save_json(config.output_directory(), diagram->name + ".json", j); + } - { - auto src = generate_package_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsPackage; + { + auto src = generate_package_mermaid(diagram, *model); + mermaid::AliasMatcher _A(src); + using mermaid::IsPackage; - REQUIRE_THAT(src, IsPackage(_A("One"))); - REQUIRE_THAT(src, IsPackage(_A("Two"))); - REQUIRE_THAT(src, IsPackage(_A("A"))); - REQUIRE_THAT(src, IsPackage(_A("B"))); - REQUIRE_THAT(src, IsPackage(_A("C"))); - REQUIRE_THAT(src, IsPackage(_A("D"))); + REQUIRE_THAT(src, IsPackage(_A("One"))); + REQUIRE_THAT(src, IsPackage(_A("Two"))); + REQUIRE_THAT(src, IsPackage(_A("A"))); + REQUIRE_THAT(src, IsPackage(_A("B"))); + REQUIRE_THAT(src, IsPackage(_A("C"))); + REQUIRE_THAT(src, IsPackage(_A("D"))); - 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/t30010/test_case.h b/tests/t30010/test_case.h index 19d06edf..cab73e2b 100644 --- a/tests/t30010/test_case.h +++ b/tests/t30010/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30010", "[test-case][package]") +TEST_CASE("t30010") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30010"); auto diagram = config.diagrams["t30010_package"]; @@ -28,61 +31,75 @@ TEST_CASE("t30010", "[test-case][package]") REQUIRE(model->name() == "t30010_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsDirectoryPackage(src, "app"s)); + REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib1"s)); + REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib2"s)); + REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib3"s)); + REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib4"s)); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsDependency(src, "app", "lib1")); + REQUIRE(IsDependency(src, "app", "lib2")); + REQUIRE(IsDependency(src, "app", "lib3")); + REQUIRE(IsDependency(src, "app", "lib4")); + }); + /* + { + auto src = generate_package_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, IsPackage("app")); - REQUIRE_THAT(src, IsPackage("libraries")); - REQUIRE_THAT(src, IsPackage("lib1")); - REQUIRE_THAT(src, IsPackage("lib2")); - REQUIRE_THAT(src, !IsPackage("library1")); - REQUIRE_THAT(src, !IsPackage("library2")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib1"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib2"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib3"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib4"))); + REQUIRE_THAT(src, IsPackage("app")); + REQUIRE_THAT(src, IsPackage("libraries")); + REQUIRE_THAT(src, IsPackage("lib1")); + REQUIRE_THAT(src, IsPackage("lib2")); + REQUIRE_THAT(src, !IsPackage("library1")); + REQUIRE_THAT(src, !IsPackage("library2")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib1"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib2"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib3"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib4"))); - { - auto j = generate_package_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - using namespace json; - using namespace std::string_literals; + { + auto j = generate_package_json(diagram, *model); - REQUIRE(IsDirectoryPackage(j, "app"s)); - REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib1"s)); - REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib2"s)); - REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib3"s)); - REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib4"s)); + using namespace json; + using namespace std::string_literals; - save_json(config.output_directory(), diagram->name + ".json", j); - } + REQUIRE(IsDirectoryPackage(j, "app"s)); + REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib1"s)); + REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib2"s)); + REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib3"s)); + REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib4"s)); - { - auto src = generate_package_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsPackage; - using mermaid::IsPackageDependency; + save_json(config.output_directory(), diagram->name + ".json", j); + } - REQUIRE_THAT(src, IsPackage(_A("app"))); - REQUIRE_THAT(src, IsPackage(_A("libraries"))); - REQUIRE_THAT(src, IsPackage(_A("lib1"))); - REQUIRE_THAT(src, IsPackage(_A("lib2"))); - REQUIRE_THAT(src, !IsPackage(_A("library1"))); - REQUIRE_THAT(src, !IsPackage(_A("library2"))); + { + auto src = generate_package_mermaid(diagram, *model); + mermaid::AliasMatcher _A(src); + using mermaid::IsPackage; + using mermaid::IsPackageDependency; - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib1"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib2"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib3"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib4"))); + REQUIRE_THAT(src, IsPackage(_A("app"))); + REQUIRE_THAT(src, IsPackage(_A("libraries"))); + REQUIRE_THAT(src, IsPackage(_A("lib1"))); + REQUIRE_THAT(src, IsPackage(_A("lib2"))); + REQUIRE_THAT(src, !IsPackage(_A("library1"))); + REQUIRE_THAT(src, !IsPackage(_A("library2"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib1"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib2"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib3"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib4"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + }*/ } \ No newline at end of file diff --git a/tests/t30011/test_case.h b/tests/t30011/test_case.h index a8adfd0a..949ab8b0 100644 --- a/tests/t30011/test_case.h +++ b/tests/t30011/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30011", "[test-case][package]") +TEST_CASE("t30011") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30011"); auto diagram = config.diagrams["t30011_package"]; @@ -28,66 +31,81 @@ TEST_CASE("t30011", "[test-case][package]") REQUIRE(model->name() == "t30011_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsDirectoryPackage(src, "app"s)); + REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib1"s)); + REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib2"s)); + REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib3"s)); + REQUIRE(IsDirectoryPackage(src, "libraries"s, "lib4"s)); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + 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)); + }); + /* + { + auto src = generate_package_puml(diagram, *model); + AliasMatcher _A(src); - REQUIRE_THAT(src, IsPackage("app")); - REQUIRE_THAT(src, IsPackage("libraries")); - REQUIRE_THAT(src, IsPackage("lib1")); - REQUIRE_THAT(src, IsPackage("lib2")); - REQUIRE_THAT(src, !IsPackage("library1")); - REQUIRE_THAT(src, !IsPackage("library2")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib1"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib2"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib3"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib4"))); + REQUIRE_THAT(src, IsPackage("app")); + REQUIRE_THAT(src, IsPackage("libraries")); + REQUIRE_THAT(src, IsPackage("lib1")); + REQUIRE_THAT(src, IsPackage("lib2")); + REQUIRE_THAT(src, !IsPackage("library1")); + REQUIRE_THAT(src, !IsPackage("library2")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib1"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib2"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib3"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("lib4"))); - { - auto j = generate_package_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - using namespace json; - using namespace std::string_literals; + { + auto j = generate_package_json(diagram, *model); - REQUIRE(IsDirectoryPackage(j, "app"s)); - REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib1"s)); - REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib2"s)); - REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib3"s)); - REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib4"s)); + using namespace json; + using namespace std::string_literals; - REQUIRE(IsDependency(j, "app"s, "lib1"s)); - REQUIRE(IsDependency(j, "app"s, "lib2"s)); - REQUIRE(IsDependency(j, "app"s, "lib3"s)); - REQUIRE(IsDependency(j, "app"s, "lib4"s)); + REQUIRE(IsDirectoryPackage(j, "app"s)); + REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib1"s)); + REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib2"s)); + REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib3"s)); + REQUIRE(IsDirectoryPackage(j, "libraries"s, "lib4"s)); - save_json(config.output_directory(), diagram->name + ".json", j); - } + REQUIRE(IsDependency(j, "app"s, "lib1"s)); + REQUIRE(IsDependency(j, "app"s, "lib2"s)); + REQUIRE(IsDependency(j, "app"s, "lib3"s)); + REQUIRE(IsDependency(j, "app"s, "lib4"s)); - { - auto src = generate_package_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsPackage; - using mermaid::IsPackageDependency; + save_json(config.output_directory(), diagram->name + ".json", j); + } - REQUIRE_THAT(src, IsPackage(_A("app"))); - REQUIRE_THAT(src, IsPackage(_A("libraries"))); - REQUIRE_THAT(src, IsPackage(_A("lib1"))); - REQUIRE_THAT(src, IsPackage(_A("lib2"))); - REQUIRE_THAT(src, !IsPackage(_A("library1"))); - REQUIRE_THAT(src, !IsPackage(_A("library2"))); + { + auto src = generate_package_mermaid(diagram, *model); + mermaid::AliasMatcher _A(src); + using mermaid::IsPackage; + using mermaid::IsPackageDependency; - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib1"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib2"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib3"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib4"))); + REQUIRE_THAT(src, IsPackage(_A("app"))); + REQUIRE_THAT(src, IsPackage(_A("libraries"))); + REQUIRE_THAT(src, IsPackage(_A("lib1"))); + REQUIRE_THAT(src, IsPackage(_A("lib2"))); + REQUIRE_THAT(src, !IsPackage(_A("library1"))); + REQUIRE_THAT(src, !IsPackage(_A("library2"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib1"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib2"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib3"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("lib4"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + } + */ } \ No newline at end of file diff --git a/tests/t30012/test_case.h b/tests/t30012/test_case.h index 1e841adb..8c4a6736 100644 --- a/tests/t30012/test_case.h +++ b/tests/t30012/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30012", "[test-case][package]") +TEST_CASE("t30012") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30012"); auto diagram = config.diagrams["t30012_package"]; @@ -28,6 +31,14 @@ TEST_CASE("t30012", "[test-case][package]") REQUIRE(model->name() == "t30012_package"); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + 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)); + REQUIRE(IsModulePackage(src, "app"s, "lib2"s)); + }); +/* { auto src = generate_package_puml(diagram, *model); AliasMatcher _A(src); @@ -73,5 +84,5 @@ TEST_CASE("t30012", "[test-case][package]") REQUIRE_THAT(src, IsPackage(_A("mod2"))); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } \ No newline at end of file diff --git a/tests/t30013/test_case.h b/tests/t30013/test_case.h index 44b9024f..bfdf866e 100644 --- a/tests/t30013/test_case.h +++ b/tests/t30013/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30013", "[test-case][package]") +TEST_CASE("t30013") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30013"); auto diagram = config.diagrams["t30013_package"]; @@ -28,130 +31,173 @@ TEST_CASE("t30013", "[test-case][package]") REQUIRE(model->name() == "t30013_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsModulePackage(src, "app"s)); + REQUIRE(IsModulePackage(src, "mod1"s)); + REQUIRE(IsModulePackage(src, "mod2"s)); + REQUIRE(IsModulePackage(src, "mod3"s)); + REQUIRE(IsModulePackage(src, "mod4"s)); + REQUIRE(IsModulePackage(src, "mod5"s)); + REQUIRE(IsModulePackage(src, "mod6"s)); + REQUIRE(IsModulePackage(src, "mod7"s)); + REQUIRE(IsModulePackage(src, "mod8"s)); + REQUIRE(IsModulePackage(src, "mod9"s)); + REQUIRE(IsModulePackage(src, "mod10"s)); + REQUIRE(IsModulePackage(src, "mod11"s)); + REQUIRE(IsModulePackage(src, "mod12"s)); + REQUIRE(IsModulePackage(src, "mod13"s)); + REQUIRE(IsModulePackage(src, "mod14"s)); + REQUIRE(IsModulePackage(src, "mod15"s)); + REQUIRE(IsModulePackage(src, "mod16"s)); + REQUIRE(IsModulePackage(src, "mod17"s)); + REQUIRE(IsModulePackage(src, "mod18"s)); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsDependency(src, "app", "mod1")); + REQUIRE(IsDependency(src, "app", "mod2")); + REQUIRE(IsDependency(src, "app", "mod3")); + REQUIRE(IsDependency(src, "app", "mod4")); + REQUIRE(IsDependency(src, "app", "mod5")); + REQUIRE(IsDependency(src, "app", "mod6")); + REQUIRE(IsDependency(src, "app", "mod7")); + REQUIRE(IsDependency(src, "app", "mod8")); + REQUIRE(IsDependency(src, "app", "mod9")); + REQUIRE(IsDependency(src, "app", "mod10")); + REQUIRE(IsDependency(src, "app", "mod11")); + REQUIRE(IsDependency(src, "app", "mod12")); + REQUIRE(IsDependency(src, "app", "mod13")); + REQUIRE(IsDependency(src, "app", "mod14")); + REQUIRE(IsDependency(src, "app", "mod15")); + REQUIRE(IsDependency(src, "app", "mod16")); + REQUIRE(IsDependency(src, "app", "mod17")); + REQUIRE(IsDependency(src, "app", "mod18")); + }); + /* + { + auto src = generate_package_puml(diagram, *model); + AliasMatcher _A(src); - // Check if all packages exist - REQUIRE_THAT(src, IsPackage("app")); - REQUIRE_THAT(src, IsPackage("mod1")); - REQUIRE_THAT(src, IsPackage("mod2")); - REQUIRE_THAT(src, IsPackage("mod3")); - REQUIRE_THAT(src, IsPackage("mod4")); - REQUIRE_THAT(src, IsPackage("mod5")); - REQUIRE_THAT(src, IsPackage("mod6")); - REQUIRE_THAT(src, IsPackage("mod7")); - REQUIRE_THAT(src, IsPackage("mod8")); - REQUIRE_THAT(src, IsPackage("mod9")); - REQUIRE_THAT(src, IsPackage("mod10")); - REQUIRE_THAT(src, IsPackage("mod11")); - REQUIRE_THAT(src, IsPackage("mod12")); - REQUIRE_THAT(src, IsPackage("mod13")); - REQUIRE_THAT(src, IsPackage("mod14")); - REQUIRE_THAT(src, IsPackage("mod15")); - REQUIRE_THAT(src, IsPackage("mod16")); - REQUIRE_THAT(src, IsPackage("mod17")); - REQUIRE_THAT(src, IsPackage("mod18")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod1"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod2"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod3"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod4"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod5"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod6"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod7"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod8"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod9"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod10"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod11"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod12"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod13"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod14"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod15"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod16"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod17"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod18"))); + // Check if all packages exist + REQUIRE_THAT(src, IsPackage("app")); + REQUIRE_THAT(src, IsPackage("mod1")); + REQUIRE_THAT(src, IsPackage("mod2")); + REQUIRE_THAT(src, IsPackage("mod3")); + REQUIRE_THAT(src, IsPackage("mod4")); + REQUIRE_THAT(src, IsPackage("mod5")); + REQUIRE_THAT(src, IsPackage("mod6")); + REQUIRE_THAT(src, IsPackage("mod7")); + REQUIRE_THAT(src, IsPackage("mod8")); + REQUIRE_THAT(src, IsPackage("mod9")); + REQUIRE_THAT(src, IsPackage("mod10")); + REQUIRE_THAT(src, IsPackage("mod11")); + REQUIRE_THAT(src, IsPackage("mod12")); + REQUIRE_THAT(src, IsPackage("mod13")); + REQUIRE_THAT(src, IsPackage("mod14")); + REQUIRE_THAT(src, IsPackage("mod15")); + REQUIRE_THAT(src, IsPackage("mod16")); + REQUIRE_THAT(src, IsPackage("mod17")); + REQUIRE_THAT(src, IsPackage("mod18")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod1"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod2"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod3"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod4"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod5"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod6"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod7"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod8"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod9"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod10"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod11"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod12"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod13"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod14"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod15"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod16"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod17"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A("mod18"))); - { - auto j = generate_package_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - using namespace json; - using namespace std::string_literals; - REQUIRE(IsModulePackage(j, "app"s)); - REQUIRE(IsModulePackage(j, "mod1"s)); - REQUIRE(IsModulePackage(j, "mod2"s)); - REQUIRE(IsModulePackage(j, "mod3"s)); - REQUIRE(IsModulePackage(j, "mod4"s)); - REQUIRE(IsModulePackage(j, "mod5"s)); - REQUIRE(IsModulePackage(j, "mod6"s)); - REQUIRE(IsModulePackage(j, "mod7"s)); - REQUIRE(IsModulePackage(j, "mod8"s)); - REQUIRE(IsModulePackage(j, "mod9"s)); - REQUIRE(IsModulePackage(j, "mod10"s)); - REQUIRE(IsModulePackage(j, "mod11"s)); - REQUIRE(IsModulePackage(j, "mod12"s)); - REQUIRE(IsModulePackage(j, "mod13"s)); - REQUIRE(IsModulePackage(j, "mod14"s)); - REQUIRE(IsModulePackage(j, "mod15"s)); - REQUIRE(IsModulePackage(j, "mod16"s)); - REQUIRE(IsModulePackage(j, "mod17"s)); - REQUIRE(IsModulePackage(j, "mod18"s)); + { + auto j = generate_package_json(diagram, *model); - save_json(config.output_directory(), diagram->name + ".json", j); - } + using namespace json; + using namespace std::string_literals; + REQUIRE(IsModulePackage(j, "app"s)); + REQUIRE(IsModulePackage(j, "mod1"s)); + REQUIRE(IsModulePackage(j, "mod2"s)); + REQUIRE(IsModulePackage(j, "mod3"s)); + REQUIRE(IsModulePackage(j, "mod4"s)); + REQUIRE(IsModulePackage(j, "mod5"s)); + REQUIRE(IsModulePackage(j, "mod6"s)); + REQUIRE(IsModulePackage(j, "mod7"s)); + REQUIRE(IsModulePackage(j, "mod8"s)); + REQUIRE(IsModulePackage(j, "mod9"s)); + REQUIRE(IsModulePackage(j, "mod10"s)); + REQUIRE(IsModulePackage(j, "mod11"s)); + REQUIRE(IsModulePackage(j, "mod12"s)); + REQUIRE(IsModulePackage(j, "mod13"s)); + REQUIRE(IsModulePackage(j, "mod14"s)); + REQUIRE(IsModulePackage(j, "mod15"s)); + REQUIRE(IsModulePackage(j, "mod16"s)); + REQUIRE(IsModulePackage(j, "mod17"s)); + REQUIRE(IsModulePackage(j, "mod18"s)); - { - auto src = generate_package_mermaid(diagram, *model); + save_json(config.output_directory(), diagram->name + ".json", j); + } - mermaid::AliasMatcher _A(src); - using mermaid::IsPackage; - using mermaid::IsPackageDependency; + { + auto src = generate_package_mermaid(diagram, *model); - REQUIRE_THAT(src, IsPackage(_A("app"))); - REQUIRE_THAT(src, IsPackage(_A("mod1"))); - REQUIRE_THAT(src, IsPackage(_A("mod2"))); - REQUIRE_THAT(src, IsPackage(_A("mod3"))); - REQUIRE_THAT(src, IsPackage(_A("mod4"))); - REQUIRE_THAT(src, IsPackage(_A("mod5"))); - REQUIRE_THAT(src, IsPackage(_A("mod6"))); - REQUIRE_THAT(src, IsPackage(_A("mod7"))); - REQUIRE_THAT(src, IsPackage(_A("mod8"))); - REQUIRE_THAT(src, IsPackage(_A("mod9"))); - REQUIRE_THAT(src, IsPackage(_A("mod10"))); - REQUIRE_THAT(src, IsPackage(_A("mod11"))); - REQUIRE_THAT(src, IsPackage(_A("mod12"))); - REQUIRE_THAT(src, IsPackage(_A("mod13"))); - REQUIRE_THAT(src, IsPackage(_A("mod14"))); - REQUIRE_THAT(src, IsPackage(_A("mod15"))); - REQUIRE_THAT(src, IsPackage(_A("mod16"))); - REQUIRE_THAT(src, IsPackage(_A("mod17"))); - REQUIRE_THAT(src, IsPackage(_A("mod18"))); + mermaid::AliasMatcher _A(src); + using mermaid::IsPackage; + using mermaid::IsPackageDependency; - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod1"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod2"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod3"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod4"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod5"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod6"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod7"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod8"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod9"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod10"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod11"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod12"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod13"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod14"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod15"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod16"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod17"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod18"))); + REQUIRE_THAT(src, IsPackage(_A("app"))); + REQUIRE_THAT(src, IsPackage(_A("mod1"))); + REQUIRE_THAT(src, IsPackage(_A("mod2"))); + REQUIRE_THAT(src, IsPackage(_A("mod3"))); + REQUIRE_THAT(src, IsPackage(_A("mod4"))); + REQUIRE_THAT(src, IsPackage(_A("mod5"))); + REQUIRE_THAT(src, IsPackage(_A("mod6"))); + REQUIRE_THAT(src, IsPackage(_A("mod7"))); + REQUIRE_THAT(src, IsPackage(_A("mod8"))); + REQUIRE_THAT(src, IsPackage(_A("mod9"))); + REQUIRE_THAT(src, IsPackage(_A("mod10"))); + REQUIRE_THAT(src, IsPackage(_A("mod11"))); + REQUIRE_THAT(src, IsPackage(_A("mod12"))); + REQUIRE_THAT(src, IsPackage(_A("mod13"))); + REQUIRE_THAT(src, IsPackage(_A("mod14"))); + REQUIRE_THAT(src, IsPackage(_A("mod15"))); + REQUIRE_THAT(src, IsPackage(_A("mod16"))); + REQUIRE_THAT(src, IsPackage(_A("mod17"))); + REQUIRE_THAT(src, IsPackage(_A("mod18"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod1"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod2"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod3"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod4"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod5"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod6"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod7"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod8"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod9"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod10"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod11"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod12"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod13"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod14"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod15"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod16"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod17"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A("mod18"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + } + */ } \ No newline at end of file diff --git a/tests/t30014/test_case.h b/tests/t30014/test_case.h index 06c30eed..63005d94 100644 --- a/tests/t30014/test_case.h +++ b/tests/t30014/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30014", "[test-case][package]") +TEST_CASE("t30014") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30014"); auto diagram = config.diagrams["t30014_package"]; @@ -28,6 +31,14 @@ TEST_CASE("t30014", "[test-case][package]") REQUIRE(model->name() == "t30014_package"); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsModulePackage(src, "app"s)); + REQUIRE(IsModulePackage(src, "app"s, ":lib1"s)); + REQUIRE(IsModulePackage(src, "app"s, ":lib2"s)); + REQUIRE(IsModulePackage(src, "app"s, ":lib1"s, "mod1"s)); + REQUIRE(!IsModulePackage(src, "app"s, ":lib1"s, "mod2"s)); + }); +/* { auto src = generate_package_puml(diagram, *model); AliasMatcher _A(src); @@ -72,5 +83,5 @@ TEST_CASE("t30014", "[test-case][package]") REQUIRE_THAT(src, IsPackage(_A("mod1"))); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + }*/ } \ No newline at end of file diff --git a/tests/t30015/test_case.h b/tests/t30015/test_case.h index 85dc7eab..ee24f2df 100644 --- a/tests/t30015/test_case.h +++ b/tests/t30015/test_case.h @@ -16,8 +16,11 @@ * limitations under the License. */ -TEST_CASE("t30015", "[test-case][package]") +TEST_CASE("t30015") { + using namespace clanguml::test; + using namespace std::string_literals; + auto [config, db] = load_config("t30015"); auto diagram = config.diagrams["t30015_package"]; @@ -28,134 +31,178 @@ TEST_CASE("t30015", "[test-case][package]") REQUIRE(model->name() == "t30015_package"); - { - auto src = generate_package_puml(diagram, *model); - AliasMatcher _A(src); + CHECK_PACKAGE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsModulePackage(src, "app"s)); + REQUIRE(IsModulePackage(src, "lib1"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod1"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod2"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod3"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod4"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod5"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod6"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod7"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod8"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod9"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod10"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod11"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod12"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod13"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod14"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod15"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod16"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod17"s)); + REQUIRE(IsModulePackage(src, "lib1"s, ":mod18"s)); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE(IsDependency(src, "app", ":mod1")); + REQUIRE(IsDependency(src, "app", ":mod2")); + REQUIRE(IsDependency(src, "app", ":mod3")); + REQUIRE(IsDependency(src, "app", ":mod4")); + REQUIRE(IsDependency(src, "app", ":mod5")); + REQUIRE(IsDependency(src, "app", ":mod6")); + REQUIRE(IsDependency(src, "app", ":mod7")); + REQUIRE(IsDependency(src, "app", ":mod8")); + REQUIRE(IsDependency(src, "app", ":mod9")); + REQUIRE(IsDependency(src, "app", ":mod10")); + REQUIRE(IsDependency(src, "app", ":mod11")); + REQUIRE(IsDependency(src, "app", ":mod12")); + REQUIRE(IsDependency(src, "app", ":mod13")); + REQUIRE(IsDependency(src, "app", ":mod14")); + REQUIRE(IsDependency(src, "app", ":mod15")); + REQUIRE(IsDependency(src, "app", ":mod16")); + REQUIRE(IsDependency(src, "app", ":mod17")); + REQUIRE(IsDependency(src, "app", ":mod18")); + }); + /* + { + auto src = generate_package_puml(diagram, *model); + AliasMatcher _A(src); - // Check if all packages exist - REQUIRE_THAT(src, IsPackage("app")); - REQUIRE_THAT(src, IsPackage("lib1")); - REQUIRE_THAT(src, IsPackage(":mod1")); - REQUIRE_THAT(src, IsPackage(":mod2")); - REQUIRE_THAT(src, IsPackage(":mod3")); - REQUIRE_THAT(src, IsPackage(":mod4")); - REQUIRE_THAT(src, IsPackage(":mod5")); - REQUIRE_THAT(src, IsPackage(":mod6")); - REQUIRE_THAT(src, IsPackage(":mod7")); - REQUIRE_THAT(src, IsPackage(":mod8")); - REQUIRE_THAT(src, IsPackage(":mod9")); - REQUIRE_THAT(src, IsPackage(":mod10")); - REQUIRE_THAT(src, IsPackage(":mod11")); - REQUIRE_THAT(src, IsPackage(":mod12")); - REQUIRE_THAT(src, IsPackage(":mod13")); - REQUIRE_THAT(src, IsPackage(":mod14")); - REQUIRE_THAT(src, IsPackage(":mod15")); - REQUIRE_THAT(src, IsPackage(":mod16")); - REQUIRE_THAT(src, IsPackage(":mod17")); - REQUIRE_THAT(src, IsPackage(":mod18")); + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod1"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod2"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod3"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod4"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod5"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod6"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod7"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod8"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod9"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod10"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod11"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod12"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod13"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod14"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod15"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod16"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod17"))); - REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod18"))); + // Check if all packages exist + REQUIRE_THAT(src, IsPackage("app")); + REQUIRE_THAT(src, IsPackage("lib1")); + REQUIRE_THAT(src, IsPackage(":mod1")); + REQUIRE_THAT(src, IsPackage(":mod2")); + REQUIRE_THAT(src, IsPackage(":mod3")); + REQUIRE_THAT(src, IsPackage(":mod4")); + REQUIRE_THAT(src, IsPackage(":mod5")); + REQUIRE_THAT(src, IsPackage(":mod6")); + REQUIRE_THAT(src, IsPackage(":mod7")); + REQUIRE_THAT(src, IsPackage(":mod8")); + REQUIRE_THAT(src, IsPackage(":mod9")); + REQUIRE_THAT(src, IsPackage(":mod10")); + REQUIRE_THAT(src, IsPackage(":mod11")); + REQUIRE_THAT(src, IsPackage(":mod12")); + REQUIRE_THAT(src, IsPackage(":mod13")); + REQUIRE_THAT(src, IsPackage(":mod14")); + REQUIRE_THAT(src, IsPackage(":mod15")); + REQUIRE_THAT(src, IsPackage(":mod16")); + REQUIRE_THAT(src, IsPackage(":mod17")); + REQUIRE_THAT(src, IsPackage(":mod18")); - save_puml(config.output_directory(), diagram->name + ".puml", src); - } + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod1"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod2"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod3"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod4"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod5"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod6"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod7"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod8"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod9"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod10"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod11"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod12"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod13"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod14"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod15"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod16"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod17"))); + REQUIRE_THAT(src, IsDependency(_A("app"), _A(":mod18"))); - { - auto j = generate_package_json(diagram, *model); + save_puml(config.output_directory(), diagram->name + ".puml", src); + } - using namespace json; - using namespace std::string_literals; + { + auto j = generate_package_json(diagram, *model); - REQUIRE(IsModulePackage(j, "app"s)); - REQUIRE(IsModulePackage(j, "lib1"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod1"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod2"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod3"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod4"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod5"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod6"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod7"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod8"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod9"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod10"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod11"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod12"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod13"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod14"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod15"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod16"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod17"s)); - REQUIRE(IsModulePackage(j, "lib1"s, ":mod18"s)); + using namespace json; + using namespace std::string_literals; - save_json(config.output_directory(), diagram->name + ".json", j); - } + REQUIRE(IsModulePackage(j, "app"s)); + REQUIRE(IsModulePackage(j, "lib1"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod1"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod2"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod3"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod4"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod5"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod6"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod7"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod8"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod9"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod10"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod11"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod12"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod13"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod14"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod15"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod16"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod17"s)); + REQUIRE(IsModulePackage(j, "lib1"s, ":mod18"s)); - { - auto src = generate_package_mermaid(diagram, *model); + save_json(config.output_directory(), diagram->name + ".json", j); + } - mermaid::AliasMatcher _A(src); - using mermaid::IsPackage; - using mermaid::IsPackageDependency; + { + auto src = generate_package_mermaid(diagram, *model); - REQUIRE_THAT(src, IsPackage(_A("app"))); - REQUIRE_THAT(src, IsPackage(_A("lib1"))); - REQUIRE_THAT(src, IsPackage(_A(":mod1"))); - REQUIRE_THAT(src, IsPackage(_A(":mod2"))); - REQUIRE_THAT(src, IsPackage(_A(":mod3"))); - REQUIRE_THAT(src, IsPackage(_A(":mod4"))); - REQUIRE_THAT(src, IsPackage(_A(":mod5"))); - REQUIRE_THAT(src, IsPackage(_A(":mod6"))); - REQUIRE_THAT(src, IsPackage(_A(":mod7"))); - REQUIRE_THAT(src, IsPackage(_A(":mod8"))); - REQUIRE_THAT(src, IsPackage(_A(":mod9"))); - REQUIRE_THAT(src, IsPackage(_A(":mod10"))); - REQUIRE_THAT(src, IsPackage(_A(":mod11"))); - REQUIRE_THAT(src, IsPackage(_A(":mod12"))); - REQUIRE_THAT(src, IsPackage(_A(":mod13"))); - REQUIRE_THAT(src, IsPackage(_A(":mod14"))); - REQUIRE_THAT(src, IsPackage(_A(":mod15"))); - REQUIRE_THAT(src, IsPackage(_A(":mod16"))); - REQUIRE_THAT(src, IsPackage(_A(":mod17"))); - REQUIRE_THAT(src, IsPackage(_A(":mod18"))); + mermaid::AliasMatcher _A(src); + using mermaid::IsPackage; + using mermaid::IsPackageDependency; - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod1"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod2"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod3"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod4"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod5"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod6"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod7"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod8"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod9"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod10"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod11"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod12"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod13"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod14"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod15"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod16"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod17"))); - REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod18"))); + REQUIRE_THAT(src, IsPackage(_A("app"))); + REQUIRE_THAT(src, IsPackage(_A("lib1"))); + REQUIRE_THAT(src, IsPackage(_A(":mod1"))); + REQUIRE_THAT(src, IsPackage(_A(":mod2"))); + REQUIRE_THAT(src, IsPackage(_A(":mod3"))); + REQUIRE_THAT(src, IsPackage(_A(":mod4"))); + REQUIRE_THAT(src, IsPackage(_A(":mod5"))); + REQUIRE_THAT(src, IsPackage(_A(":mod6"))); + REQUIRE_THAT(src, IsPackage(_A(":mod7"))); + REQUIRE_THAT(src, IsPackage(_A(":mod8"))); + REQUIRE_THAT(src, IsPackage(_A(":mod9"))); + REQUIRE_THAT(src, IsPackage(_A(":mod10"))); + REQUIRE_THAT(src, IsPackage(_A(":mod11"))); + REQUIRE_THAT(src, IsPackage(_A(":mod12"))); + REQUIRE_THAT(src, IsPackage(_A(":mod13"))); + REQUIRE_THAT(src, IsPackage(_A(":mod14"))); + REQUIRE_THAT(src, IsPackage(_A(":mod15"))); + REQUIRE_THAT(src, IsPackage(_A(":mod16"))); + REQUIRE_THAT(src, IsPackage(_A(":mod17"))); + REQUIRE_THAT(src, IsPackage(_A(":mod18"))); - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod1"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod2"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod3"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod4"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod5"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod6"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod7"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod8"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod9"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod10"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod11"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod12"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod13"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod14"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod15"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod16"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod17"))); + REQUIRE_THAT(src, IsPackageDependency(_A("app"), _A(":mod18"))); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", + src); + } + */ } \ No newline at end of file diff --git a/tests/t40001/test_case.h b/tests/t40001/test_case.h index 1bdef77c..b972f298 100644 --- a/tests/t40001/test_case.h +++ b/tests/t40001/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t40001/test_case.cc + * tests/t40001/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t40001", "[test-case][include]") +TEST_CASE("t40001") { + using namespace clanguml::test; + auto [config, db] = load_config("t40001"); auto diagram = config.diagrams["t40001_include"]; @@ -28,89 +30,23 @@ TEST_CASE("t40001", "[test-case][include]") REQUIRE(model->name() == "t40001_include"); - { - auto src = generate_include_puml(diagram, *model); + CHECK_INCLUDE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(HasTitle(src, "Basic include diagram example")); - AliasMatcher _A(src); + REQUIRE(IsFolder(src, "include/lib1")); + REQUIRE(IsFile(src, "include/lib1/lib1.h")); + REQUIRE(IsFile(src, "src/t40001.cc")); + REQUIRE(IsFile(src, "include/t40001_include1.h")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - REQUIRE_THAT(src, HasTitle("Basic include diagram example")); + REQUIRE(IsSystemHeader(src, "string")); + REQUIRE(IsSystemHeader(src, "yaml-cpp/yaml.h")); - REQUIRE_THAT(src, IsFolder("lib1")); - REQUIRE_THAT(src, IsFile("lib1.h")); - REQUIRE_THAT(src, IsFile("t40001.cc")); - REQUIRE_THAT(src, IsFile("t40001_include1.h")); + REQUIRE(IsHeaderDependency( + src, "src/t40001.cc", "include/t40001_include1.h")); + REQUIRE(IsHeaderDependency( + src, "include/t40001_include1.h", "include/lib1/lib1.h")); - REQUIRE_THAT(src, IsFile("string")); - REQUIRE_THAT(src, IsFile("yaml-cpp/yaml.h")); - - REQUIRE_THAT( - src, IsAssociation(_A("t40001.cc"), _A("t40001_include1.h"))); - REQUIRE_THAT(src, IsAssociation(_A("t40001_include1.h"), _A("lib1.h"))); - - REQUIRE_THAT(src, IsDependency(_A("t40001_include1.h"), _A("string"))); - - REQUIRE_THAT(src, HasComment("t40001 test diagram of type include")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_include_json(diagram, *model); - - using namespace json; - - REQUIRE(HasTitle(j, "Basic include diagram example")); - - REQUIRE(IsFolder(j, "include")); - REQUIRE(IsFolder(j, "include/lib1")); - REQUIRE(IsFolder(j, "src")); - - REQUIRE(IsHeader(j, "include/lib1/lib1.h")); - REQUIRE(IsHeader(j, "include/t40001_include1.h")); - REQUIRE(IsFile(j, "src/t40001.cc")); - REQUIRE(IsSystemHeader(j, "yaml-cpp/yaml.h")); - - REQUIRE(IsFile(j, "string")); - - REQUIRE(IsAssociation(j, "src/t40001.cc", "include/t40001_include1.h")); - REQUIRE(IsAssociation( - j, "include/t40001_include1.h", "include/lib1/lib1.h")); - REQUIRE(IsDependency(j, "include/t40001_include1.h", "string")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_include_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::HasComment; - using mermaid::HasTitle; - using mermaid::IsFile; - using mermaid::IsFolder; - using mermaid::IsIncludeDependency; - - REQUIRE_THAT(src, HasTitle("Basic include diagram example")); - - REQUIRE_THAT(src, IsFolder(_A("lib1"))); - REQUIRE_THAT(src, IsFile(_A("lib1.h"))); - REQUIRE_THAT(src, IsFile(_A("t40001.cc"))); - REQUIRE_THAT(src, IsFile(_A("t40001_include1.h"))); - - REQUIRE_THAT(src, IsFile(_A("string"))); - REQUIRE_THAT(src, IsFile(_A("yaml-cpp/yaml.h"))); - - REQUIRE_THAT( - src, IsAssociation(_A("t40001.cc"), _A("t40001_include1.h"))); - REQUIRE_THAT(src, IsAssociation(_A("t40001_include1.h"), _A("lib1.h"))); - - REQUIRE_THAT( - src, IsIncludeDependency(_A("t40001_include1.h"), _A("string"))); - - REQUIRE_THAT(src, HasComment("t40001 test diagram of type include")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsSystemHeaderDependency( + src, "include/t40001_include1.h", "string")); + }); } diff --git a/tests/t40002/test_case.h b/tests/t40002/test_case.h index bf09cb1d..52e7659c 100644 --- a/tests/t40002/test_case.h +++ b/tests/t40002/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t40002/test_case.cc + * tests/t40002/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t40002", "[test-case][include]") +TEST_CASE("t40002") { + using namespace clanguml::test; + auto [config, db] = load_config("t40002"); auto diagram = config.diagrams["t40002_include"]; @@ -28,141 +30,53 @@ TEST_CASE("t40002", "[test-case][include]") REQUIRE(model->name() == "t40002_include"); - { - auto src = generate_include_puml(diagram, *model); + CHECK_INCLUDE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsFolder(src, "include")); + REQUIRE(IsFolder(src, "include/lib1")); + REQUIRE(IsFolder(src, "include/lib2")); + REQUIRE(IsFolder(src, "src")); + REQUIRE(IsFolder(src, "src/lib1")); + REQUIRE(IsFolder(src, "src/lib2")); + REQUIRE(IsFile(src, "include/lib1/lib1.h")); + REQUIRE(IsFile(src, "include/lib2/lib2.h")); + REQUIRE(!IsFile(src, "include/lib2/lib2_detail.h")); + REQUIRE(IsFile(src, "src/lib1/lib1.cc")); + REQUIRE(IsFile(src, "src/lib2/lib2.cc")); + REQUIRE(IsFile(src, "src/t40002.cc")); - AliasMatcher _A(src); + REQUIRE(!IsFile(src, "string")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); + REQUIRE( + IsHeaderDependency(src, "src/t40002.cc", "include/lib1/lib1.h")); + REQUIRE(IsHeaderDependency( + src, "include/lib1/lib1.h", "include/lib2/lib2.h")); + REQUIRE( + IsHeaderDependency(src, "src/lib1/lib1.cc", "include/lib1/lib1.h")); + REQUIRE( + IsHeaderDependency(src, "src/lib2/lib2.cc", "include/lib2/lib2.h")); - REQUIRE_THAT(src, IsFolder("lib1")); - REQUIRE_THAT(src, IsFolder("lib2")); - REQUIRE_THAT(src, IsFile("lib1.h")); - REQUIRE_THAT(src, IsFile("lib2.h")); - REQUIRE_THAT(src, !IsFile("lib2_detail.h")); - REQUIRE_THAT(src, IsFile("t40002.cc")); - REQUIRE_THAT(src, IsFile("lib1.cc")); - REQUIRE_THAT(src, IsFile("lib2.cc")); + REQUIRE(HasLink(src, "t40002.cc", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t40002/src/t40002.cc#L0", + clanguml::util::get_git_commit()), + "t40002.cc")); - REQUIRE_THAT(src, !IsFile("string")); + REQUIRE(HasLink(src, "lib1.cc", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t40002/src/lib1/lib1.cc#L0", + clanguml::util::get_git_commit()), + "lib1.cc")); - REQUIRE_THAT(src, IsAssociation(_A("t40002.cc"), _A("lib1.h"))); - REQUIRE_THAT(src, IsAssociation(_A("lib1.h"), _A("lib2.h"))); - REQUIRE_THAT(src, IsAssociation(_A("lib1.cc"), _A("lib1.h"))); - REQUIRE_THAT(src, IsAssociation(_A("lib2.cc"), _A("lib2.h"))); + REQUIRE(HasLink(src, "lib1.h", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t40002/include/lib1/lib1.h#L0", + clanguml::util::get_git_commit()), + "lib1.h")); - REQUIRE_THAT(src, - HasLink(_A("t40002.cc"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t40002/src/t40002.cc#L0", - clanguml::util::get_git_commit()), - "t40002.cc")); - - REQUIRE_THAT(src, - HasLink(_A("lib1.cc"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t40002/src/lib1/lib1.cc#L0", - clanguml::util::get_git_commit()), - "lib1.cc")); - - REQUIRE_THAT(src, - HasLink(_A("lib1.h"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t40002/include/lib1/lib1.h#L0", - clanguml::util::get_git_commit()), - "lib1.h")); - - REQUIRE_THAT(src, - HasLink(_A("lib2.h"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t40002/include/lib2/lib2.h#L0", - clanguml::util::get_git_commit()), - "lib2.h")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_include_json(diagram, *model); - - using namespace json; - - REQUIRE(IsFolder(j, "include")); - REQUIRE(IsFolder(j, "include/lib1")); - REQUIRE(IsFolder(j, "include/lib2")); - REQUIRE(IsFolder(j, "src")); - REQUIRE(IsFolder(j, "src/lib1")); - REQUIRE(IsFolder(j, "src/lib2")); - REQUIRE(IsFile(j, "include/lib1/lib1.h")); - REQUIRE(IsFile(j, "include/lib2/lib2.h")); - REQUIRE(!IsFile(j, "include/lib2/lib2_detail.h")); - REQUIRE(IsFile(j, "src/lib1/lib1.cc")); - REQUIRE(IsFile(j, "src/lib2/lib2.cc")); - REQUIRE(IsFile(j, "src/t40002.cc")); - - REQUIRE(!IsFile(j, "string")); - - REQUIRE(IsAssociation(j, "src/t40002.cc", "include/lib1/lib1.h")); - REQUIRE(IsAssociation(j, "include/lib1/lib1.h", "include/lib2/lib2.h")); - REQUIRE(IsAssociation(j, "src/lib1/lib1.cc", "include/lib1/lib1.h")); - REQUIRE(IsAssociation(j, "src/lib2/lib2.cc", "include/lib2/lib2.h")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_include_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::HasLink; - using mermaid::IsFile; - using mermaid::IsFolder; - - REQUIRE_THAT(src, IsFolder(_A("lib1"))); - REQUIRE_THAT(src, IsFolder(_A("lib2"))); - REQUIRE_THAT(src, IsFile(_A("lib1.h"))); - REQUIRE_THAT(src, IsFile(_A("lib2.h"))); - REQUIRE_THAT(src, !IsFile(_A("lib2_detail.h"))); - REQUIRE_THAT(src, IsFile(_A("t40002.cc"))); - REQUIRE_THAT(src, IsFile(_A("lib1.cc"))); - REQUIRE_THAT(src, IsFile(_A("lib2.cc"))); - - REQUIRE_THAT(src, !IsFile(_A("string"))); - - REQUIRE_THAT(src, IsAssociation(_A("t40002.cc"), _A("lib1.h"))); - REQUIRE_THAT(src, IsAssociation(_A("lib1.h"), _A("lib2.h"))); - REQUIRE_THAT(src, IsAssociation(_A("lib1.cc"), _A("lib1.h"))); - REQUIRE_THAT(src, IsAssociation(_A("lib2.cc"), _A("lib2.h"))); - - REQUIRE_THAT(src, - HasLink(_A("t40002.cc"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t40002/src/t40002.cc#L0", - clanguml::util::get_git_commit()), - "t40002.cc")); - - REQUIRE_THAT(src, - HasLink(_A("lib1.cc"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t40002/src/lib1/lib1.cc#L0", - clanguml::util::get_git_commit()), - "lib1.cc")); - - REQUIRE_THAT(src, - HasLink(_A("lib1.h"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t40002/include/lib1/lib1.h#L0", - clanguml::util::get_git_commit()), - "lib1.h")); - - REQUIRE_THAT(src, - HasLink(_A("lib2.h"), - fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" - "t40002/include/lib2/lib2.h#L0", - clanguml::util::get_git_commit()), - "lib2.h")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(HasLink(src, "lib2.h", + fmt::format("https://github.com/bkryza/clang-uml/blob/{}/tests/" + "t40002/include/lib2/lib2.h#L0", + clanguml::util::get_git_commit()), + "lib2.h")); + }); } diff --git a/tests/t40003/test_case.h b/tests/t40003/test_case.h index 5b44ae41..9e76177d 100644 --- a/tests/t40003/test_case.h +++ b/tests/t40003/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t40003/test_case.cc + * tests/t40003/test_case.h * * Copyright (c) 2021-2024 Bartek Kryza * @@ -16,8 +16,10 @@ * limitations under the License. */ -TEST_CASE("t40003", "[test-case][include]") +TEST_CASE("t40003") { + using namespace clanguml::test; + auto [config, db] = load_config("t40003"); auto diagram = config.diagrams["t40003_include"]; @@ -28,72 +30,22 @@ TEST_CASE("t40003", "[test-case][include]") REQUIRE(model->name() == "t40003_include"); - { - auto src = generate_include_puml(diagram, *model); + CHECK_INCLUDE_DIAGRAM(config, diagram, *model, [](const auto &src) { + REQUIRE(IsFolder(src, "include/dependants")); + REQUIRE(IsFolder(src, "include/dependencies")); + REQUIRE(IsFolder(src, "src/dependants")); + REQUIRE(IsFolder(src, "src/dependencies")); - AliasMatcher _A(src); + REQUIRE(IsFile(src, "include/dependants/t1.h")); + REQUIRE(IsFile(src, "include/dependants/t2.h")); + REQUIRE(IsFile(src, "include/dependants/t3.h")); + REQUIRE(!IsFile(src, "include/dependants/t4.h")); + REQUIRE(IsFile(src, "src/dependants/t1.cc")); - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, IsFolder("dependants")); - REQUIRE_THAT(src, IsFolder("dependencies")); - - REQUIRE_THAT(src, IsFile("t1.h")); - REQUIRE_THAT(src, IsFile("t2.h")); - REQUIRE_THAT(src, IsFile("t3.h")); - - REQUIRE_THAT(src, !IsFile("t4.h")); - REQUIRE_THAT(src, IsFile("t5.h")); - REQUIRE_THAT(src, !IsFile("t6.h")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_include_json(diagram, *model); - - using namespace json; - - REQUIRE(IsFolder(j, "include/dependants")); - REQUIRE(IsFolder(j, "include/dependencies")); - REQUIRE(IsFolder(j, "src/dependants")); - REQUIRE(IsFolder(j, "src/dependencies")); - - REQUIRE(IsFile(j, "include/dependants/t1.h")); - REQUIRE(IsFile(j, "include/dependants/t2.h")); - REQUIRE(IsFile(j, "include/dependants/t3.h")); - REQUIRE(!IsFile(j, "include/dependants/t4.h")); - REQUIRE(IsFile(j, "src/dependants/t1.cc")); - - REQUIRE(IsFile(j, "include/dependencies/t1.h")); - REQUIRE(IsFile(j, "include/dependencies/t2.h")); - REQUIRE(IsFile(j, "include/dependencies/t3.h")); - REQUIRE(!IsFile(j, "include/dependencies/t4.h")); - REQUIRE(IsFile(j, "src/dependencies/t2.cc")); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_include_mermaid(diagram, *model); - - mermaid::AliasMatcher _A(src); - using mermaid::HasLink; - using mermaid::IsFile; - using mermaid::IsFolder; - - REQUIRE_THAT(src, IsFolder(_A("dependants"))); - REQUIRE_THAT(src, IsFolder(_A("dependencies"))); - - REQUIRE_THAT(src, IsFile(_A("t1.h"))); - REQUIRE_THAT(src, IsFile(_A("t2.h"))); - REQUIRE_THAT(src, IsFile(_A("t3.h"))); - - REQUIRE_THAT(src, !IsFile(_A("t4.h"))); - REQUIRE_THAT(src, IsFile(_A("t5.h"))); - REQUIRE_THAT(src, !IsFile(_A("t6.h"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } + REQUIRE(IsFile(src, "include/dependencies/t1.h")); + REQUIRE(IsFile(src, "include/dependencies/t2.h")); + REQUIRE(IsFile(src, "include/dependencies/t3.h")); + REQUIRE(!IsFile(src, "include/dependencies/t4.h")); + REQUIRE(IsFile(src, "src/dependencies/t2.cc")); + }); } diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 524f994e..f4637578 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -74,6 +74,500 @@ load_config(const std::string &test_name) return res; } +namespace detail { +template +auto generate_diagram_impl(clanguml::common::compilation_database &db, + std::shared_ptr diagram) +{ + LOG_INFO("All paths will be evaluated relative to {}", + diagram->root_directory().string()); + + using diagram_config = DiagramConfig; + using diagram_model = + typename clanguml::common::generators::diagram_model_t< + diagram_config>::type; + using diagram_visitor = + typename clanguml::common::generators::diagram_visitor_t< + diagram_config>::type; + + inject_diagram_options(diagram); + + auto model = clanguml::common::generators::generate(db, diagram->name, + dynamic_cast(*diagram), + diagram->get_translation_units()); + + return model; +} + +template +auto render_diagram( + std::shared_ptr config, DiagramModel &model) +{ + using diagram_config = DiagramConfig; + using diagram_model = DiagramModel; + using diagram_generator = + typename clanguml::common::generators::diagram_generator_t< + DiagramConfig, typename GeneratorType::generator_tag>::type; + + std::stringstream ss; + + ss << diagram_generator(dynamic_cast(*config), model); + + if constexpr (std::is_same_v) { + return nlohmann::json::parse(ss.str()); + } + else { + return ss.str(); + } +} +// +// template +// auto generate_diagram_json( +// std::shared_ptr config, DiagramModel &model) +//{ +// using diagram_config = DiagramConfig; +// using diagram_model = DiagramModel; +// using diagram_generator = +// typename clanguml::common::generators::diagram_generator_t< +// DiagramConfig, +// clanguml::common::generators::json_generator_tag>::type; +// +// std::stringstream ss; +// +// ss << diagram_generator(dynamic_cast(*config), model); +// +// return nlohmann::json::parse(ss.str()); +//} +// +// template +// auto generate_diagram_mermaid( +// std::shared_ptr config, DiagramModel &model) +//{ +// using diagram_config = DiagramConfig; +// using diagram_model = DiagramModel; +// using diagram_generator = +// typename clanguml::common::generators::diagram_generator_t< +// DiagramConfig, +// clanguml::common::generators::mermaid_generator_tag>::type; +// +// std::stringstream ss; +// +// ss << diagram_generator(dynamic_cast(*config), model); +// +// return ss.str(); +//} +} // namespace detail + +/// +/// @defgroup Diagram generators +/// @{ +/// + +std::unique_ptr generate_class_diagram( + clanguml::common::compilation_database &db, + std::shared_ptr diagram) +{ + return detail::generate_diagram_impl( + db, diagram); +} + +std::unique_ptr +generate_sequence_diagram(clanguml::common::compilation_database &db, + std::shared_ptr diagram) +{ + return detail::generate_diagram_impl( + db, diagram); +} + +std::unique_ptr +generate_package_diagram(clanguml::common::compilation_database &db, + std::shared_ptr diagram) +{ + return detail::generate_diagram_impl( + db, diagram); +} + +std::unique_ptr +generate_include_diagram(clanguml::common::compilation_database &db, + std::shared_ptr diagram) +{ + return detail::generate_diagram_impl( + db, diagram); +} + +/// }@ + +/// +/// @defgroup Diagram renderers +/// @{ +/// +/* +template +std::string render_class_diagram( + std::shared_ptr config, + clanguml::class_diagram::model::diagram &model) +{ + return detail::generate_diagram(config, model); +} + +std::string render_sequence_diagram( + std::shared_ptr config, + clanguml::sequence_diagram::model::diagram &model) +{ + return detail::generate_diagram_puml( + config, model); +} + +std::string generate_package_puml( + std::shared_ptr config, + clanguml::package_diagram::model::diagram &model) +{ + return detail::generate_diagram_puml( + config, model); +} + +std::string generate_include_puml( + std::shared_ptr config, + clanguml::include_diagram::model::diagram &model) +{ + return detail::generate_diagram_puml( + config, model); +} + +nlohmann::json generate_class_json( + std::shared_ptr config, + clanguml::class_diagram::model::diagram &model) +{ + return detail::generate_diagram_json( + config, model); +} + +nlohmann::json generate_sequence_json( + std::shared_ptr config, + clanguml::sequence_diagram::model::diagram &model) +{ + return detail::generate_diagram_json( + config, model); +} + +nlohmann::json generate_package_json( + std::shared_ptr config, + clanguml::package_diagram::model::diagram &model) +{ + return detail::generate_diagram_json( + config, model); +} + +nlohmann::json generate_include_json( + std::shared_ptr config, + clanguml::include_diagram::model::diagram &model) +{ + return detail::generate_diagram_json( + config, model); +} + +std::string generate_class_mermaid( + std::shared_ptr config, + clanguml::class_diagram::model::diagram &model) +{ + return detail::generate_diagram_mermaid( + config, model); +} + +std::string generate_sequence_mermaid( + std::shared_ptr config, + clanguml::sequence_diagram::model::diagram &model) +{ + return detail::generate_diagram_mermaid( + config, model); +} + +std::string generate_package_mermaid( + std::shared_ptr config, + clanguml::package_diagram::model::diagram &model) +{ + return detail::generate_diagram_mermaid( + config, model); +} + +std::string generate_include_mermaid( + std::shared_ptr config, + clanguml::include_diagram::model::diagram &model) +{ + return detail::generate_diagram_mermaid( + config, model); +} +*/ + +template +void save_diagram(const std::filesystem::path &path, const T &diagram) +{ + static_assert( + std::is_same_v || std::is_same_v); + + std::filesystem::create_directories(path.parent_path()); + std::ofstream ofs; + ofs.open(path, std::ofstream::out | std::ofstream::trunc); + if constexpr (std::is_same_v) { + ofs << std::setw(2) << diagram; + } + else { + ofs << diagram; + } + + ofs.close(); +} + +void save_puml(const std::string &path, const std::string &filename, + const std::string &puml) +{ + std::filesystem::path p{path}; + p /= filename; + save_diagram(p, puml); +} + +void save_json(const std::string &path, const std::string &filename, + const nlohmann::json &j) +{ + std::filesystem::path p{path}; + p /= filename; + save_diagram(p, j); +} + +void save_mermaid(const std::string &path, const std::string &filename, + const std::string &mmd) +{ + std::filesystem::path p{path}; + p /= filename; + save_diagram(p, mmd); +} + +namespace clanguml::test { + +struct diagram_source_storage { + diagram_source_storage(plantuml_t &&p, json_t &&j, mermaid_t &&m) + : plantuml{std::move(p)} + , json{std::move(j)} + , mermaid{std::move(m)} + { + } + + template const T &get() const; + + plantuml_t plantuml; + json_t json; + mermaid_t mermaid; +}; + +template <> const plantuml_t &diagram_source_storage::get() const +{ + return plantuml; +} + +template <> const json_t &diagram_source_storage::get() const +{ + return json; +} + +template <> const mermaid_t &diagram_source_storage::get() const +{ + return mermaid; +} + +template +void try_run_test_case(const diagram_source_storage &diagrams, TC &&tc) +{ + if constexpr (std::is_invocable_v) { + try { + tc(diagrams.get()); + } + catch (doctest::TestFailureException &e) { + std::cout << "-----------------------------------------------------" + "--------------------------\n"; + std::cout << "Test case failed for diagram type " + << T::diagram_type_name << ": " << "\n"; + std::cout << diagrams.get().to_string() << "\n"; + + throw e; + } + } +} + +template +DiagramType render_class_diagram(std::shared_ptr c, + clanguml::class_diagram::model::diagram &model) +{ + return DiagramType{common::model::diagram_t::kClass, + detail::render_diagram( + c, model)}; +} + +template +DiagramType render_sequence_diagram( + std::shared_ptr c, + clanguml::sequence_diagram::model::diagram &model) +{ + return DiagramType{common::model::diagram_t::kSequence, + detail::render_diagram( + c, model)}; +} + +template +DiagramType render_package_diagram(std::shared_ptr c, + clanguml::package_diagram::model::diagram &model) +{ + return DiagramType{common::model::diagram_t::kPackage, + detail::render_diagram( + c, model)}; +} + +template +DiagramType render_include_diagram(std::shared_ptr c, + clanguml::include_diagram::model::diagram &model) +{ + return DiagramType{common::model::diagram_t::kInclude, + detail::render_diagram( + c, model)}; +} + +template +void CHECK_DIAGRAM_IMPL( + const diagram_source_storage &diagrams, TC &&tc, TCs &&...tcs) +{ + try_run_test_case(diagrams, tc); + try_run_test_case(diagrams, tc); + try_run_test_case(diagrams, tc); + + if constexpr (sizeof...(tcs) > 0) { + CHECK_DIAGRAM_IMPL(diagrams, std::forward(tcs)...); + } +} + +template +void CHECK_CLASS_DIAGRAM(const clanguml::config::config &config, + DiagramConfig diagram, DiagramModel &model, TCs &&...tcs) +{ + diagram_source_storage diagram_sources{ + render_class_diagram(diagram, model), + render_class_diagram(diagram, model), + render_class_diagram(diagram, model)}; + + CHECK_DIAGRAM_IMPL(diagram_sources, std::forward(tcs)...); + + save_puml(config.output_directory(), diagram->name + ".puml", + diagram_sources.plantuml.src); + save_json(config.output_directory(), diagram->name + ".json", + diagram_sources.json.src); + save_mermaid(config.output_directory(), diagram->name + ".mmd", + diagram_sources.mermaid.src); +} + +template +void CHECK_SEQUENCE_DIAGRAM(const clanguml::config::config &config, + DiagramConfig diagram, DiagramModel &model, TCs &&...tcs) +{ + diagram_source_storage diagram_sources{ + render_sequence_diagram(diagram, model), + render_sequence_diagram(diagram, model), + render_sequence_diagram(diagram, model)}; + + CHECK_DIAGRAM_IMPL(diagram_sources, std::forward(tcs)...); + + save_puml(config.output_directory(), diagram->name + ".puml", + diagram_sources.plantuml.src); + save_json(config.output_directory(), diagram->name + ".json", + diagram_sources.json.src); + save_mermaid(config.output_directory(), diagram->name + ".mmd", + diagram_sources.mermaid.src); +} + +template +void CHECK_PACKAGE_DIAGRAM(const clanguml::config::config &config, + DiagramConfig diagram, DiagramModel &model, TCs &&...tcs) +{ + diagram_source_storage diagram_sources{ + render_package_diagram(diagram, model), + render_package_diagram(diagram, model), + render_package_diagram(diagram, model)}; + + CHECK_DIAGRAM_IMPL(diagram_sources, std::forward(tcs)...); + + save_puml(config.output_directory(), diagram->name + ".puml", + diagram_sources.plantuml.src); + save_json(config.output_directory(), diagram->name + ".json", + diagram_sources.json.src); + save_mermaid(config.output_directory(), diagram->name + ".mmd", + diagram_sources.mermaid.src); +} + +template +void CHECK_INCLUDE_DIAGRAM(const clanguml::config::config &config, + DiagramConfig diagram, DiagramModel &model, TCs &&...tcs) +{ + diagram_source_storage diagram_sources{ + render_include_diagram(diagram, model), + render_include_diagram(diagram, model), + render_include_diagram(diagram, model)}; + + CHECK_DIAGRAM_IMPL(diagram_sources, std::forward(tcs)...); + + save_puml(config.output_directory(), diagram->name + ".puml", + diagram_sources.plantuml.src); + save_json(config.output_directory(), diagram->name + ".json", + diagram_sources.json.src); + save_mermaid(config.output_directory(), diagram->name + ".mmd", + diagram_sources.mermaid.src); +} + +} // namespace clanguml::test + +/* +template <> +plantuml_t render_class_diagram( + std::shared_ptr c, + clanguml::class_diagram::model::diagram &d) +{ + return detail::generate_diagram_puml(c, d); +} + +template <> +mermaid_t render_class_diagram( + std::shared_ptr c, + clanguml::class_diagram::model::diagram &d) +{ + return generate_class_mermaid(c, d); +} + +template <> +json_t render_class_diagram( + std::shared_ptr c, + clanguml::class_diagram::model::diagram &d) +{ + return generate_class_json(c, d); +} + +template <> +DiagramType render_sequence_diagram( + std::shared_ptr c, + clanguml::sequence_diagram::model::diagram &model); + +template +DiagramType render_package_diagram(std::shared_ptr c, + clanguml::package_diagram::model::diagram &model); + +template +DiagramType render_include_diagram(std::shared_ptr c, + clanguml::include_diagram::model::diagram &model); + +} +*/ +// using namespace clanguml::test::matchers; + +/* + + namespace detail { template auto generate_diagram_impl(clanguml::common::compilation_database &db, @@ -326,8 +820,198 @@ void save_mermaid(const std::string &path, const std::string &filename, save_diagram(p, mmd); } -using namespace clanguml::test::matchers; +namespace clanguml::test { +template struct test_traits; + +// function pointer +template +struct test_traits : public test_traits { }; + +template struct test_traits { + using return_type = R; + + static constexpr std::size_t arity = sizeof...(Args); + + template struct argument { + static_assert(N < arity, "error: invalid parameter index."); + using type = typename std::tuple_element>::type; + }; +}; + +struct diagram_source_storage { + diagram_source_storage(plantuml_t &&p, json_t &&j, mermaid_t &&m) + : plantuml{std::move(p)} + , json{std::move(j)} + , mermaid{std::move(m)} + { + } + + template const T &get() const; + + plantuml_t plantuml; + json_t json; + mermaid_t mermaid; +}; + +template <> const plantuml_t &diagram_source_storage::get() const +{ + return plantuml; +} + +template <> const json_t &diagram_source_storage::get() const +{ + return json; +} + +template <> const mermaid_t &diagram_source_storage::get() const +{ + return mermaid; +} + +template +void CHECK_CLASS_DIAGRAM_IMPL( + const diagram_source_storage &diagrams, TC &&tc, TCs &&...tcs) +{ + if constexpr (std::is_invocable_v) { + tc(diagrams.get()); + } + if constexpr (std::is_invocable_v) { + tc(diagrams.get()); + } + if constexpr (std::is_invocable_v) { + tc(diagrams.get()); + } + if constexpr (sizeof...(tcs) > 0) { + CHECK_CLASS_DIAGRAM_IMPL(diagrams, std::forward(tcs)...); + } +} + +template +void CHECK_CLASS_DIAGRAM( + DiagramConfig diagram, DiagramModel &model, TCs &&...tcs) +{ + diagram_source_storage diagram_sources{ + render_class_diagram(diagram, model), + render_class_diagram(diagram, model), + render_class_diagram(diagram, model)}; + + CHECK_CLASS_DIAGRAM_IMPL(diagram_sources, std::forward(tcs)...); +} + +// +// PlantUML test helpers +// +template <> +plantuml_t render_class_diagram( + std::shared_ptr c, + clanguml::class_diagram::model::diagram &d) +{ + return generate_class_puml(c, d); +} + +template <> bool IsClass(plantuml_t d, std::string name) +{ + return util::contains(d.src, fmt::format("class {}", name)); +} + +// +// MermaidJS test helpers +// +template <> +mermaid_t render_class_diagram( + std::shared_ptr c, + clanguml::class_diagram::model::diagram &d) +{ + return generate_class_mermaid(c, d); +} + +template <> bool IsClass(mermaid_t d, std::string name) +{ + return util::contains(d.src, fmt::format("class {}", name)); +} + +// +// JSON test helpers +// +struct File { + explicit File(const std::string &f) + : file{f} + { + } + + const std::string file; +}; + +std::optional get_element_by_id( + const nlohmann::json &j, const std::string &id) +{ + if (!j.contains("elements")) + return {}; + + for (const nlohmann::json &e : j["elements"]) { + if (e["id"] == id) + return {e}; + + if (e["type"] == "namespace" || e["type"] == "folder") { + auto maybe_e = get_element_by_id(e, id); + if (maybe_e) + return maybe_e; + } + } + + return {}; +} + +std::optional get_element( + const nlohmann::json &j, const std::string &name) +{ + if (!j.contains("elements")) + return {}; + + for (const nlohmann::json &e : j["elements"]) { + if (e["display_name"] == name) + return {e}; + + if (e["type"] == "namespace" || e["type"] == "folder" || + e["type"] == "directory" || e["type"] == "module") { + auto maybe_e = get_element(e, name); + if (maybe_e) + return maybe_e; + } + } + + return {}; +} + +std::optional get_element( + const json_t &src, const std::string &name) +{ + return get_element(src.src, name); +} + +std::string expand_name(const nlohmann::json &j, const std::string &name) +{ + return name; +} + +template <> +json_t render_class_diagram( + std::shared_ptr c, + clanguml::class_diagram::model::diagram &d) +{ + return generate_class_json(c, d); +} + +template <> bool IsClass(json_t d, std::string name) +{ + auto e = get_element(d.src, expand_name(d.src, name)); + return e && e->at("type") == "class"; +} +} +} + + */ /// /// Class diagram tests /// @@ -360,6 +1044,9 @@ using namespace clanguml::test::matchers; #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" @@ -483,6 +1170,7 @@ using namespace clanguml::test::matchers; #include "t20052/test_case.h" #include "t20053/test_case.h" +*/ /// /// Package diagram tests /// @@ -506,21 +1194,65 @@ using namespace clanguml::test::matchers; /// /// Include diagram tests /// + #include "t40001/test_case.h" #include "t40002/test_case.h" #include "t40003/test_case.h" +/* + /// /// Other tests (e.g. configuration file) /// #include "t90000/test_case.h" #include "t90001/test_case.h" +*/ /// /// Main test function /// 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"); + + clih.handle_options(argvv.size(), argvv.data()); + + int res = context.run(); // run + + if (context.shouldExit()) // important - query flags (and --exit) rely on + // the user doing this + return res; // propagate the result of the tests + + int client_stuff_return_code = 0; + // your program - if the testing framework is integrated in your production + // code + + return res + client_stuff_return_code; // the result from doctest is + // propagated here as well + /* Catch::Session session; using namespace Catch::clara; @@ -547,4 +1279,5 @@ int main(int argc, char *argv[]) clih.handle_options(argvv.size(), argvv.data()); return session.run(); + */ } diff --git a/tests/test_cases.h b/tests/test_cases.h index b8e61102..0e84baa1 100644 --- a/tests/test_cases.h +++ b/tests/test_cases.h @@ -25,6 +25,7 @@ #include "class_diagram/visitor/translation_unit_visitor.h" #include "common/clang_utils.h" #include "common/compilation_database.h" +#include "common/generators/generators.h" #include "config/config.h" #include "include_diagram/generators/plantuml/include_diagram_generator.h" #include "include_diagram/visitor/translation_unit_visitor.h" @@ -34,10 +35,8 @@ #include "sequence_diagram/visitor/translation_unit_visitor.h" #include "util/util.h" -#define CATCH_CONFIG_RUNNER -#define CATCH_CONFIG_CONSOLE_WIDTH 512 - -#include "catch.h" +#define DOCTEST_CONFIG_IMPLEMENT +#include "doctest/doctest.h" #include #include @@ -47,28 +46,1802 @@ #include #include -using Catch::Matchers::Contains; -using Catch::Matchers::EndsWith; -using Catch::Matchers::Equals; -using Catch::Matchers::Matches; -using Catch::Matchers::StartsWith; -using Catch::Matchers::VectorContains; - using namespace clanguml::util; std::pair load_config(const std::string &test_name); -std::string generate_sequence_puml( - std::shared_ptr config, - clanguml::sequence_diagram::model::diagram &model); - -std::string generate_class_puml( - std::shared_ptr config, - clanguml::class_diagram::model::diagram &model); +// std::string generate_sequence_puml( +// std::shared_ptr config, +// clanguml::sequence_diagram::model::diagram &model); +// +// std::string generate_class_puml( +// std::shared_ptr config, +// clanguml::class_diagram::model::diagram &model); void save_puml(const std::string &path, const std::string &puml); +namespace clanguml::test { + +template constexpr bool has_type() noexcept +{ + return (std::is_same_v || ... || false); +} + +struct Public { }; + +struct Protected { }; + +struct Private { }; + +struct Abstract { }; + +struct Static { }; + +struct Const { }; + +struct Constexpr { }; + +struct Consteval { }; + +struct Coroutine { }; + +struct Noexcept { }; + +struct Default { }; + +struct Deleted { }; + +struct NamespacePackage { }; +struct ModulePackage { }; +struct DirectoryPackage { }; + +template std::string package_type_name(); + +template <> std::string package_type_name() +{ + return "namespace"; +} + +template <> std::string package_type_name() { return "module"; } + +template <> std::string package_type_name() +{ + return "directory"; +} + +template struct diagram_source_t { + diagram_source_t(clanguml::common::model::diagram_t dt, T &&s) + { + diagram_type = dt; + src = std::move(s); + } + + bool contains(std::string name) const; + + virtual std::string get_alias(std::string name) const + { + return "__INVALID_ALIAS__"; + } + + bool search(const std::string &pattern) const; + + std::string to_string() const; + + T src; + clanguml::common::model::diagram_t diagram_type; +}; + +struct plantuml_t : public diagram_source_t { + using diagram_source_t::diagram_source_t; + using source_type = std::string; + using generator_tag = clanguml::common::generators::plantuml_generator_tag; + + inline static const std::string diagram_type_name{"PlantUML"}; + + std::string get_alias(std::string name) const override + { + std::vector patterns; + + const std::string alias_regex("([A-Z]_[0-9]+)"); + + util::replace_all(name, "(", "\\("); + util::replace_all(name, ")", "\\)"); + util::replace_all(name, " ", "\\s"); + util::replace_all(name, "*", "\\*"); + util::replace_all(name, "[", "\\["); + util::replace_all(name, "]", "\\]"); + + patterns.push_back( + std::regex{"class\\s\"" + name + "\"\\sas\\s" + alias_regex}); + patterns.push_back( + std::regex{"abstract\\s\"" + name + "\"\\sas\\s" + alias_regex}); + patterns.push_back( + std::regex{"enum\\s\"" + name + "\"\\sas\\s" + alias_regex}); + patterns.push_back( + std::regex{"package\\s\"" + name + "\"\\sas\\s" + alias_regex}); + patterns.push_back( + std::regex{"package\\s\\[" + name + "\\]\\sas\\s" + alias_regex}); + patterns.push_back( + std::regex{"file\\s\"" + name + "\"\\sas\\s" + alias_regex}); + patterns.push_back( + std::regex{"folder\\s\"" + name + "\"\\sas\\s" + alias_regex}); + patterns.push_back( + std::regex{"participant\\s\"" + name + "\"\\sas\\s" + alias_regex}); + + std::smatch base_match; + + for (const auto &pattern : patterns) { + if (std::regex_search(src, base_match, pattern) && + base_match.size() == 2) { + std::ssub_match base_sub_match = base_match[1]; + std::string alias = base_sub_match.str(); + return trim(alias); + } + } + + return fmt::format("__INVALID__ALIAS__({})", name); + } +}; + +struct mermaid_t : public diagram_source_t { + using diagram_source_t::diagram_source_t; + using source_type = std::string; + using generator_tag = clanguml::common::generators::mermaid_generator_tag; + + inline static const std::string diagram_type_name{"MermaidJS"}; + + std::string get_alias(std::string name) const override + { + std::vector patterns; + + const std::string alias_regex("([A-Z]_[0-9]+)"); + + util::replace_all(name, "(", "("); + util::replace_all(name, ")", ")"); + util::replace_all(name, " ", "\\s"); + util::replace_all(name, "*", "\\*"); + util::replace_all(name, "[", "\\["); + util::replace_all(name, "]", "\\]"); + util::replace_all(name, "<", "<"); + util::replace_all(name, ">", ">"); + + patterns.push_back( + std::regex{"class\\s" + alias_regex + "\\[\"" + name + "\"\\]"}); + patterns.push_back( + std::regex{"subgraph\\s" + alias_regex + "\\[" + name + "\\]"}); + patterns.push_back( + std::regex{"\\s\\s" + alias_regex + "\\[" + name + "\\]"}); // file + + std::smatch base_match; + + for (const auto &pattern : patterns) { + if (std::regex_search(src, base_match, pattern) && + base_match.size() == 2) { + std::ssub_match base_sub_match = base_match[1]; + std::string alias = base_sub_match.str(); + return trim(alias); + } + } + + return fmt::format("__INVALID__ALIAS__({})", name); + } +}; + +struct json_t : public diagram_source_t { + using diagram_source_t::diagram_source_t; + using source_type = nlohmann::json; + using generator_tag = clanguml::common::generators::json_generator_tag; + + inline static const std::string diagram_type_name{"JSON"}; +}; + +std::optional get_element_by_id( + const nlohmann::json &j, const std::string &id) +{ + if (!j.contains("elements")) + return {}; + + for (const nlohmann::json &e : j["elements"]) { + if (e["id"] == id) + return {e}; + + if (e["type"] == "namespace" || e["type"] == "folder") { + auto maybe_e = get_element_by_id(e, id); + if (maybe_e) + return maybe_e; + } + } + + return {}; +} + +std::optional get_element( + const nlohmann::json &j, const std::string &name) +{ + if (!j.contains("elements")) + return {}; + + for (const nlohmann::json &e : j["elements"]) { + if (e["display_name"] == name) + return {e}; + + if (e["type"] == "namespace" || e["type"] == "folder" || + e["type"] == "directory" || e["type"] == "module") { + auto maybe_e = get_element(e, name); + if (maybe_e) + return maybe_e; + } + } + + return {}; +} + +std::optional get_element( + const json_t &src, const std::string &name) +{ + return get_element(src.src, name); +} + +std::optional get_participant( + const nlohmann::json &j, const std::string &name) +{ + if (!j.contains("participants")) + return {}; + + for (const nlohmann::json &e : j.at("participants")) { + if (e["display_name"] == name) + return {e}; + } + + return {}; +} + +auto get_relationship(const nlohmann::json &j, const nlohmann::json &from, + const nlohmann::json &to, const std::string &type, const std::string &label) +{ + return std::find_if(j["relationships"].begin(), j["relationships"].end(), + [&](const auto &it) { + auto match = (it["source"] == from) && (it["destination"] == to) && + (it["type"] == type); + + if (match && label.empty()) + return true; + + if (match && (label == it["label"])) + return true; + + return false; + }); +} + +auto get_relationship(const nlohmann::json &j, const std::string &from, + const std::string &to, const std::string &type, + const std::string &label = {}) +{ + auto source = get_element(j, from); + auto destination = get_element(j, to); + + if (!(source && destination)) + return j["relationships"].end(); + + return get_relationship( + j, source->at("id"), destination->at("id"), type, label); +} + +std::string expand_name(const nlohmann::json &j, const std::string &name) +{ + return name; +} + +template <> bool diagram_source_t::contains(std::string name) const +{ + return util::contains(src, name); +} + +template <> +bool diagram_source_t::search(const std::string &pattern) const +{ + std::regex pattern_regex{pattern}; + + std::smatch base_match; + return std::regex_search(src, base_match, pattern_regex); +} + +template <> +bool diagram_source_t::contains(std::string name) const +{ + return false; +} + +template <> std::string diagram_source_t::to_string() const +{ + return src; +} + +template <> std::string diagram_source_t::to_string() const +{ + return src.dump(2); +} + +/// +/// The following functions declarations define various checks on generated +/// diagrams. +/// They must be specialized for each diagram format (DiagramType) separately. +/// +/// @defgroup Test Cases diagram checks +/// @{ +/// + +// Check if generated diagram source starts with pattern +template +bool StartsWith(const DiagramType &d, std::string pattern); + +// Check if generated diagram source ends with pattern +template +bool EndsWith(const DiagramType &d, std::string pattern); + +template +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); + +// Check if generated diagram contains a specified class +template +bool IsClass(const DiagramType &d, std::string name); + +// Check if generated diagram contains a specified class template +template +bool IsClassTemplate(const DiagramType &d, std::string name); + +// Check if generated diagram contains a specified abstract class +template +bool IsAbstractClass(const DiagramType &d, std::string name); + +// Check if generated diagram contains a specified class +template +bool IsBaseClass(const DiagramType &d, std::string base, std::string subclass); + +template +bool IsInnerClass( + const DiagramType &d, std::string const &parent, std::string const &inner); + +template +bool IsMethod(const DiagramType &d, const std::string &cls, + const std::string &name, const std::string &type = "void", + const std::string ¶ms = ""); + +template +bool IsField(const DiagramType &d, std::string const &cls, + std::string const &name, std::string type = "void"); + +template +bool IsAssociation(const DiagramType &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = ""); + +template +bool IsComposition(const DiagramType &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = ""); + +template +bool IsAggregation(const DiagramType &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = ""); + +template +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 = ""); + +template +bool IsFriend( + const DiagramType &d, std::string const &from, std::string const &to); + +template +bool IsPackageDependency( + const DiagramType &d, std::string const &from, std::string const &to); + +template +bool IsIncludeDependency( + const DiagramType &d, std::string const &from, std::string const &to); + +template +bool IsConstraint(const DiagramType &d, std::string const &from, + std::string const &to, std::string label = {}, std::string style = ""); + +template +bool IsConceptRequirement( + const DiagramType &d, std::string const &cpt, std::string requirement); + +template +bool IsLayoutHint(const DiagramType &d, std::string const &from, + std::string const &hint, std::string const &to); + +template +bool HasComment(const DiagramType &d, std::string const &comment); + +template +bool HasNote(const DiagramType &d, std::string const &cls, + std::string const &position, std::string const ¬e = ""); + +template +bool HasPackageNote(const DiagramType &d, std::string const &cls, + std::string const &position, std::string const ¬e = ""); + +template +bool HasMessageComment( + const DiagramType &d, std::string const &alias, std::string const ¬e); + +template +bool HasMemberNote(const DiagramType &d, std::string const &cls, + std::string const &member, std::string const &position, + std::string const ¬e = ""); + +template +bool HasLink(const DiagramType &d, std::string const &alias, + std::string const &link, std::string const &tooltip); + +template +bool HasMemberLink(const DiagramType &d, std::string const &method, + std::string const &link, std::string const &tooltip); + +template +bool IsFolder(const DiagramType &d, std::string const &path); + +template +bool IsFile(const DiagramType &d, std::string const &str); + +template +bool IsSystemHeader(const DiagramType &d, std::string const &str); + +template +bool IsHeaderDependency(const DiagramType &d, std::string const &from, + std::string const &to, std::string style = ""); + +template +bool IsSystemHeaderDependency(const DiagramType &d, std::string const &from, + std::string const &to, std::string style = ""); + +template +bool IsNamespacePackage(const DiagramType &d, Args... args); + +template +bool IsDirectoryPackage(const DiagramType &d, Args... args); + +template +bool IsModulePackage(const DiagramType &d, Args... args); + +template +bool IsDeprecated(const DiagramType &d, std::string const &str); + +/// +/// @} +/// + +template <> bool StartsWith(const plantuml_t &d, std::string pattern) +{ + return util::starts_with(d.src, pattern); +} + +template <> bool EndsWith(const plantuml_t &d, std::string pattern) +{ + return util::ends_with(d.src, pattern); +} + +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) +{ + return d.contains(fmt::format("enum {}", d.get_alias(name))); +} + +template <> bool IsClass(const plantuml_t &d, std::string name) +{ + return d.contains(fmt::format("class {}", d.get_alias(name))); +} + +template <> bool IsClassTemplate(const plantuml_t &d, std::string name) +{ + return d.contains(fmt::format("class \"{}\"", name)); +} + +template <> bool IsAbstractClass(const plantuml_t &d, std::string name) +{ + return d.contains(fmt::format("abstract {}", d.get_alias(name))); +} + +template <> +bool IsBaseClass(const plantuml_t &d, std::string base, std::string subclass) +{ + return d.contains( + fmt::format("{} <|-- {}", d.get_alias(base), d.get_alias(subclass))); +} + +template <> +bool IsInnerClass( + const plantuml_t &d, std::string const &parent, std::string const &inner) +{ + return d.contains(d.get_alias(inner) + " --+ " + d.get_alias(parent)); +} + +template +bool IsMethod(const plantuml_t &d, std::string const &cls, + std::string const &name, std::string const &type = "void", + std::string const ¶ms = "") +{ + std::string pattern; + if constexpr (has_type()) + pattern += "{static} "; + + if constexpr (has_type()) + pattern += "{abstract} "; + + if constexpr (has_type()) + pattern = "+"; + else if constexpr (has_type()) + pattern = "#"; + else + pattern = "-"; + + pattern += name; + + pattern += "(" + params + ")"; + + if constexpr (has_type()) + pattern += " constexpr"; + + if constexpr (has_type()) + pattern += " consteval"; + + if constexpr (has_type()) + pattern += " const"; + + if constexpr (has_type()) + pattern += " = 0"; + + if constexpr (has_type()) + pattern += " = default"; + + if constexpr (has_type()) + pattern += " = deleted"; + + if constexpr (has_type()) + pattern += " [coroutine]"; + + pattern += " : " + type; + + return d.contains(pattern); +} + +template +bool IsField(const plantuml_t &d, std::string const &cls, + std::string const &name, std::string type) +{ + std::string pattern; + if constexpr (has_type()) + pattern += "{static} "; + + if constexpr (has_type()) + pattern = "+"; + else if constexpr (has_type()) + pattern = "#"; + else + pattern = "-"; + + pattern += name; + + return d.contains(pattern + " : " + type); +} + +template +bool IsAssociation(const plantuml_t &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = "") +{ + auto from_id = d.get_alias(from); + auto to_id = d.get_alias(to); + + std::string format_string = "{}"; + if (!multiplicity_source.empty()) + format_string += " \"" + multiplicity_source + "\""; + + format_string += fmt::format(" -{}->", style); + + if (!multiplicity_dest.empty()) + format_string += " \"" + multiplicity_dest + "\""; + + format_string += " {}"; + + if (!label.empty()) { + std::string label_prefix; + if constexpr (has_type()) + label_prefix = "+"; + else if constexpr (has_type()) + label_prefix = "#"; + else + label_prefix = "-"; + + format_string += " : {}{}"; + return d.contains(fmt::format( + fmt::runtime(format_string), from_id, to_id, label_prefix, label)); + } + + return d.contains(fmt::format(fmt::runtime(format_string), from_id, to_id)); +} + +template +bool IsComposition(const plantuml_t &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = "") +{ + std::string label_prefix; + if constexpr (has_type()) + label_prefix = "+"; + else if constexpr (has_type()) + label_prefix = "#"; + else + label_prefix = "-"; + + std::string format_string = "{}"; + if (!multiplicity_source.empty()) + format_string += " \"" + multiplicity_source + "\""; + + format_string += fmt::format(" *-{}-", style); + + if (!multiplicity_dest.empty()) + format_string += " \"" + multiplicity_dest + "\""; + + format_string += " {} : {}{}"; + + return d.contains(fmt::format(fmt::runtime(format_string), + d.get_alias(from), d.get_alias(to), label_prefix, label)); +} + +template +bool IsAggregation(const plantuml_t &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = "") +{ + std::string label_prefix; + if constexpr (has_type()) + label_prefix = "+"; + else if constexpr (has_type()) + label_prefix = "#"; + else + label_prefix = "-"; + + std::string format_string = "{}"; + if (!multiplicity_source.empty()) + format_string += " \"" + multiplicity_source + "\""; + + format_string += fmt::format(" o-{}-", style); + + if (!multiplicity_dest.empty()) + format_string += " \"" + multiplicity_dest + "\""; + + format_string += " {} : {}{}"; + + return d.contains(fmt::format(fmt::runtime(format_string), + d.get_alias(from), d.get_alias(to), label_prefix, label)); +} + +template <> +bool IsInstantiation(const plantuml_t &d, std::string const &from, + std::string const &to, std::string style) +{ + return d.contains( + fmt::format("{} .{}.|> {}", d.get_alias(to), style, d.get_alias(from))); +} + +template <> +bool IsDependency(const plantuml_t &d, std::string const &from, + std::string const &to, std::string style) +{ + return d.contains( + fmt::format("{} .{}.> {}", d.get_alias(from), style, d.get_alias(to))); +} + +template +bool IsFriend( + const plantuml_t &d, std::string const &from, std::string const &to) +{ + std::string pattern; + + if constexpr (has_type()) + pattern = "+"; + else if constexpr (has_type()) + pattern = "#"; + else + pattern = "-"; + + return d.contains(fmt::format("{} <.. {} : {}<>", d.get_alias(from), + d.get_alias(to), pattern)); +} + +template <> +bool IsPackageDependency( + const plantuml_t &d, std::string const &from, std::string const &to) +{ + return d.contains( + fmt::format("{} .{}.> {}", d.get_alias(from), "", d.get_alias(to))); +} + +template <> +bool IsIncludeDependency( + const plantuml_t &d, std::string const &from, std::string const &to) +{ + return d.contains( + fmt::format("{} .{}.> {}", d.get_alias(from), "", d.get_alias(to))); +} + +template <> +bool IsConstraint(const plantuml_t &d, std::string const &from, + std::string const &to, std::string label, std::string style) +{ + if (label.empty()) + 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), label)); +} + +template <> +bool IsConceptRequirement( + const plantuml_t &d, std::string const &cpt, std::string requirement) +{ + return d.contains(requirement); +} + +template <> +bool IsLayoutHint(const plantuml_t &d, std::string const &from, + std::string const &hint, std::string const &to) +{ + return d.contains(fmt::format( + "{} -[hidden]{}- {}", d.get_alias(from), hint, d.get_alias(to))); +} + +template <> bool HasComment(const plantuml_t &d, std::string const &comment) +{ + return d.contains(fmt::format("' {}", comment)); +} + +template <> +bool HasNote(const plantuml_t &d, std::string const &cls, + std::string const &position, std::string const ¬e) +{ + return d.contains(fmt::format("note {} of {}", position, d.get_alias(cls))); +} + +template <> +bool HasMessageComment(const plantuml_t &d, std::string const &participant, + std::string const ¬e) +{ + return d.contains(std::string("note over ") + d.get_alias(participant) + + "\\n" + note + "\\n" + "end note"); +} + +template <> +bool HasMemberNote(const plantuml_t &d, std::string const &cls, + std::string const &member, std::string const &position, + std::string const ¬e) +{ + return d.contains( + fmt::format("note {} of {}::{}", position, d.get_alias(cls), member)); +} + +template <> +bool HasPackageNote(const plantuml_t &d, std::string const &cls, + std::string const &position, std::string const ¬e) +{ + return d.contains(fmt::format("note {} of {}", position, d.get_alias(cls))); +} + +template <> +bool HasLink(const plantuml_t &d, std::string const &element, + std::string const &link, std::string const &tooltip) +{ + return d.contains( + fmt::format("{} [[{}{{{}}}]]", d.get_alias(element), link, tooltip)); +} + +template <> +bool HasMemberLink(const plantuml_t &d, std::string const &method, + std::string const &link, std::string const &tooltip) +{ + return d.contains(fmt::format("{} [[[{}{{{}}}]]]", method, link, tooltip)); +} + +template <> bool IsFolder(const plantuml_t &d, std::string const &path) +{ + return d.contains("folder \"" + util::split(path, "/").back() + "\""); +} + +template <> bool IsFile(const plantuml_t &d, std::string const &path) +{ + return d.contains("file \"" + util::split(path, "/").back() + "\""); +} + +template <> bool IsSystemHeader(const plantuml_t &d, std::string const &path) +{ + return d.contains("file \"" + path + "\""); +} + +template <> +bool IsHeaderDependency(const plantuml_t &d, std::string const &from, + std::string const &to, std::string style) +{ + assert(d.diagram_type == common::model::diagram_t::kInclude); + + return d.contains( + fmt::format("{} --> {}", d.get_alias(util::split(from, "/").back()), + d.get_alias(util::split(to, "/").back()))); +} + +template <> +bool IsSystemHeaderDependency(const plantuml_t &d, std::string const &from, + std::string const &to, std::string style) +{ + assert(d.diagram_type == common::model::diagram_t::kInclude); + + return d.contains( + fmt::format("{} ..> {}", d.get_alias(util::split(from, "/").back()), + d.get_alias(util::split(to, "/").back()))); +} + +template auto get_last(Args &&...args) +{ + return std::get(std::forward_as_tuple(args...)); +} + +template +bool IsNamespacePackage(const plantuml_t &d, Args... args) +{ + const auto &name = get_last(args...); + return d.contains("package [" + name + "]"); +} + +template +bool IsDirectoryPackage(const plantuml_t &d, Args... args) +{ + const auto &name = get_last(args...); + return d.contains("package [" + name + "]"); +} + +template +bool IsModulePackage(const plantuml_t &d, Args... args) +{ + const auto &name = get_last(args...); + return d.contains("package [" + name + "]"); +} + +template <> bool IsDeprecated(const plantuml_t &d, const std::string &name) +{ + return d.contains(d.get_alias(name) + " <> "); +} + +// +// MermaidJS test helpers +// + +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) +{ + return d.search(std::string("class ") + d.get_alias(name) + + " \\{\\n\\s+<>"); +} + +template <> bool IsClass(const mermaid_t &d, std::string name) +{ + return d.contains(fmt::format("class {}[\"{}\"]", d.get_alias(name), name)); +} + +template <> bool IsClassTemplate(const mermaid_t &d, std::string name) +{ + return d.contains(fmt::format("class {}", d.get_alias(name))); +} + +template <> bool IsAbstractClass(const mermaid_t &d, std::string 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) +{ + return d.contains( + fmt::format("{} <|-- {}", d.get_alias(base), d.get_alias(subclass))); +} + +template <> +bool IsInnerClass( + const mermaid_t &d, std::string const &parent, std::string const &inner) +{ + return d.contains(d.get_alias(parent) + " ()-- " + d.get_alias(inner)); +} + +template +bool IsMethod(const mermaid_t &d, std::string const &cls, + std::string const &name, std::string type = "void", + std::string const ¶ms = "") +{ + std::string pattern; + + if constexpr (has_type()) + pattern = "+"; + else if constexpr (has_type()) + pattern = "#"; + else + pattern = "-"; + + pattern += name; + + pattern += "(" + params + ")"; + + std::vector method_mods; + if constexpr (has_type()) + method_mods.push_back("default"); + if constexpr (has_type()) + method_mods.push_back("const"); + if constexpr (has_type()) + method_mods.push_back("constexpr"); + if constexpr (has_type()) + method_mods.push_back("consteval"); + if constexpr (has_type()) + method_mods.push_back("coroutine"); + + pattern += " : "; + + if (!method_mods.empty()) { + pattern += fmt::format("[{}] ", fmt::join(method_mods, ",")); + } + + util::replace_all(type, "<", "<"); + util::replace_all(type, ">", ">"); + util::replace_all(type, "(", "("); + util::replace_all(type, ")", ")"); + util::replace_all(type, "##", "::"); + util::replace_all(type, "{", "{"); + util::replace_all(type, "}", "}"); + + pattern += type; + + if constexpr (has_type()) + pattern += "*"; + + if constexpr (has_type()) + pattern += "$"; + + return d.contains(pattern); +} + +template +bool IsField(const mermaid_t &d, std::string const &cls, + std::string const &name, std::string type) +{ + std::string pattern; + if constexpr (has_type()) + pattern += "{static} "; + + if constexpr (has_type()) + pattern = "+"; + else if constexpr (has_type()) + pattern = "#"; + else + pattern = "-"; + + pattern += name; + + util::replace_all(type, "<", "<"); + util::replace_all(type, ">", ">"); + util::replace_all(type, "(", "("); + util::replace_all(type, ")", ")"); + util::replace_all(type, "##", "::"); + util::replace_all(type, "{", "{"); + util::replace_all(type, "}", "}"); + + return d.contains(pattern + " : " + type); +} + +template +bool IsAssociation(const mermaid_t &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = "") +{ + auto from_id = d.get_alias(from); + auto to_id = d.get_alias(to); + + std::string label_prefix; + if constexpr (has_type()) + label_prefix = "+"; + else if constexpr (has_type()) + label_prefix = "#"; + else + label_prefix = "-"; + + std::string format_string = "{}"; + if (!multiplicity_source.empty()) + format_string += " \"" + multiplicity_source + "\""; + + format_string += " -->"; + + if (!multiplicity_dest.empty()) + format_string += " \"" + multiplicity_dest + "\""; + + format_string += " {}"; + + if (!label.empty()) { + format_string += " : {}{}"; + return d.contains(fmt::format( + fmt::runtime(format_string), from_id, to_id, label_prefix, label)); + } + + return d.contains(fmt::format(fmt::runtime(format_string), from_id, to_id)); +} + +template +bool IsComposition(const mermaid_t &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = "") +{ + std::string label_prefix; + if constexpr (has_type()) + label_prefix = "+"; + else if constexpr (has_type()) + label_prefix = "#"; + else + label_prefix = "-"; + + std::string format_string = "{}"; + if (!multiplicity_source.empty()) + format_string += " \"" + multiplicity_source + "\""; + + format_string += fmt::format(" *-{}-", style); + + if (!multiplicity_dest.empty()) + format_string += " \"" + multiplicity_dest + "\""; + + format_string += " {} : {}{}"; + + return d.contains(fmt::format(fmt::runtime(format_string), + d.get_alias(from), d.get_alias(to), label_prefix, label)); +} + +template +bool IsAggregation(const mermaid_t &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = "") +{ + std::string label_prefix; + if constexpr (has_type()) + label_prefix = "+"; + else if constexpr (has_type()) + label_prefix = "#"; + else + label_prefix = "-"; + + std::string format_string = "{}"; + if (!multiplicity_source.empty()) + format_string += " \"" + multiplicity_source + "\""; + + format_string += " o--"; + + if (!multiplicity_dest.empty()) + format_string += " \"" + multiplicity_dest + "\""; + + format_string += " {} : {}{}"; + + return d.contains(fmt::format(fmt::runtime(format_string), + d.get_alias(from), d.get_alias(to), label_prefix, label)); +} + +template <> +bool IsInstantiation(const mermaid_t &d, std::string const &from, + std::string const &to, std::string style) +{ + return d.contains( + fmt::format("{} ..|> {}", d.get_alias(to), d.get_alias(from))); +} + +template <> +bool IsDependency(const mermaid_t &d, std::string const &from, + std::string const &to, std::string style) +{ + if (d.diagram_type == common::model::diagram_t::kClass) { + return d.contains( + fmt::format("{} ..> {}", d.get_alias(from), d.get_alias(to))); + } + + return d.contains( + fmt::format("{} -.-> {}", d.get_alias(from), d.get_alias(to))); +} + +template <> +bool IsHeaderDependency(const mermaid_t &d, std::string const &from, + std::string const &to, std::string style) +{ + assert(d.diagram_type == common::model::diagram_t::kInclude); + + return d.contains( + fmt::format("{} --> {}", d.get_alias(util::split(from, "/").back()), + d.get_alias(util::split(to, "/").back()))); +} + +template <> +bool IsSystemHeaderDependency(const mermaid_t &d, std::string const &from, + std::string const &to, std::string style) +{ + assert(d.diagram_type == common::model::diagram_t::kInclude); + + return d.contains( + fmt::format("{} -.-> {}", d.get_alias(util::split(from, "/").back()), + d.get_alias(util::split(to, "/").back()))); +} + +template +bool IsFriend( + const mermaid_t &d, std::string const &from, std::string const &to) +{ + std::string pattern; + + if constexpr (has_type()) + pattern = "+"; + else if constexpr (has_type()) + pattern = "#"; + else + pattern = "-"; + + return d.contains(fmt::format( + "{} <.. {} : {}[friend]", d.get_alias(from), d.get_alias(to), pattern)); +} + +template <> +bool IsPackageDependency( + const mermaid_t &d, std::string const &from, std::string const &to) +{ + return d.contains( + fmt::format("{} -.-> {}", d.get_alias(from), "", d.get_alias(to))); +} + +template <> +bool IsIncludeDependency( + const mermaid_t &d, std::string const &from, std::string const &to) +{ + return d.contains( + fmt::format("{} -.-> {}", d.get_alias(from), "", d.get_alias(to))); +} + +template <> +bool IsConstraint(const mermaid_t &d, std::string const &from, + std::string const &to, std::string label, std::string style) +{ + auto from_id = d.get_alias(from); + auto to_id = d.get_alias(to); + + if (label.empty()) + return d.contains(fmt::format("{} ..> {}", from_id, "", to_id)); + + util::replace_all(label, "<", "<"); + util::replace_all(label, ">", ">"); + util::replace_all(label, "(", "("); + util::replace_all(label, ")", ")"); + util::replace_all(label, "##", "::"); + util::replace_all(label, "{", "{"); + util::replace_all(label, "}", "}"); + + if (label.empty()) + return d.contains(fmt::format("{} ..> {}", from_id, to_id)); + + return d.contains(fmt::format("{} ..> {} : {}", from_id, to_id, label)); +} + +template <> +bool IsConceptRequirement( + const mermaid_t &d, std::string const &cpt, std::string requirement) +{ + util::replace_all(requirement, "<", "<"); + util::replace_all(requirement, ">", ">"); + util::replace_all(requirement, "(", "("); + util::replace_all(requirement, ")", ")"); + util::replace_all(requirement, "##", "::"); + util::replace_all(requirement, "{", "{"); + util::replace_all(requirement, "}", "}"); + + return d.contains(requirement); +} + +template <> +bool IsLayoutHint(const mermaid_t &d, std::string const &from, + std::string const &hint, std::string const &to) +{ + return true; +} + +template <> bool HasComment(const mermaid_t &d, std::string const &comment) +{ + return d.contains(fmt::format("%% {}", comment)); +} + +template <> +bool HasNote(const mermaid_t &d, std::string const &cls, + std::string const &position, std::string const ¬e) +{ + if (d.diagram_type == common::model::diagram_t::kPackage) { + return d.contains(fmt::format("-.- {}", d.get_alias(cls))); + } + + return d.contains(fmt::format("note for {}", d.get_alias(cls))); +} + +template <> +bool HasMessageComment( + const mermaid_t &d, std::string const &participant, std::string const ¬e) +{ + return d.contains( + std::string("note over ") + d.get_alias(participant) + ": " + note); +} + +template <> +bool HasMemberNote(const mermaid_t &d, std::string const &cls, + std::string const &member, std::string const &position, + std::string const ¬e) +{ + return d.contains( + fmt::format("note for {} \"{}\"", d.get_alias(cls), note)); +} + +template <> +bool HasPackageNote(const mermaid_t &d, std::string const &cls, + std::string const &position, std::string const ¬e) +{ + return d.contains(fmt::format("-.- {}", d.get_alias(cls))); +} + +template <> +bool HasLink(const mermaid_t &d, std::string const &element, + std::string const &link, std::string const &tooltip) +{ + return d.contains(fmt::format( + "click {} href \"{}\" \"{}\"", d.get_alias(element), link, tooltip)); +} + +template <> +bool HasMemberLink(const mermaid_t &d, std::string const &method, + std::string const &link, std::string const &tooltip) +{ + return true; +} + +template <> bool IsFolder(const mermaid_t &d, std::string const &path) +{ + return d.contains("subgraph " + d.get_alias(util::split(path, "/").back())); +} + +template <> bool IsFile(const mermaid_t &d, std::string const &path) +{ + return d.contains(d.get_alias(util::split(path, "/").back()) + "["); +} + +template <> bool IsSystemHeader(const mermaid_t &d, std::string const &path) +{ + return d.contains(d.get_alias(path) + "["); +} + +template +bool IsNamespacePackage(const mermaid_t &d, Args... args) +{ + const auto &name = get_last(args...); + return d.contains("subgraph " + d.get_alias(name)); +} + +template +bool IsDirectoryPackage(const mermaid_t &d, Args... args) +{ + const auto &name = get_last(args...); + return d.contains("subgraph " + d.get_alias(name)); +} + +template +bool IsModulePackage(const mermaid_t &d, Args... args) +{ + const auto &name = get_last(args...); + return d.contains("subgraph " + d.get_alias(name)); +} + +template <> bool IsDeprecated(const mermaid_t &d, const std::string &name) +{ + return d.contains(d.get_alias(name) + " <> "); +} + +// +// JSON test helpers +// +struct File { + explicit File(const std::string &f) + : file{f} + { + } + + const std::string file; +}; + +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) +{ + auto e = get_element(d.src, expand_name(d.src, name)); + return e && e->at("type") == "class" && e->at("is_abstract"); +} + +template <> bool IsEnum(const json_t &d, std::string name) +{ + auto e = get_element(d.src, expand_name(d.src, name)); + return e && e->at("type") == "enum"; +} + +template <> bool IsClass(const json_t &d, std::string name) +{ + auto e = get_element(d.src, expand_name(d.src, name)); + return e && e->at("type") == "class" && !e->at("is_abstract"); +} + +template <> bool IsClassTemplate(const json_t &d, std::string name) +{ + auto e = get_element(d.src, expand_name(d.src, name)); + return e && e->at("type") == "class"; +} + +template <> +bool IsBaseClass(const json_t &d, std::string base, std::string subclass) +{ + const auto &j = d.src; + auto base_el = get_element(j, expand_name(j, base)); + auto subclass_el = get_element(j, expand_name(j, subclass)); + + if (!base_el || !subclass_el) + return false; + + const nlohmann::json &bases = (*subclass_el)["bases"]; + + return std::find_if(bases.begin(), bases.end(), [&](const auto &it) { + return it["id"] == base_el.value()["id"]; + }) != bases.end(); +} + +template <> +bool IsInnerClass( + const json_t &d, std::string const &parent, std::string const &inner) +{ + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, inner), expand_name(j, parent), "containment"); + + return rel != j["relationships"].end(); +} + +template +bool IsMethod(const json_t &d, const std::string &cls, std::string const &name, + std::string type = "void", std::string const ¶ms = "") +{ + const auto &j = d.src; + auto sc = get_element(j, expand_name(j, cls)); + + if (!sc) + return false; + + const nlohmann::json &methods = (*sc)["methods"]; + + return std::find_if(methods.begin(), methods.end(), [&](const auto &it) { + return it["name"] == name; + }) != methods.end(); +} + +template +bool IsField(const json_t &d, std::string const &cls, std::string const &name, + std::string type) +{ + const auto &j = d.src; + + auto sc = get_element(j, expand_name(j, cls)); + + if (!sc) + return false; + + const nlohmann::json &members = (*sc)["members"]; + + return std::find_if(members.begin(), members.end(), [&](const auto &it) { + return it["name"] == name && it["type"] == type; + }) != members.end(); +} + +template +bool IsAssociation(const json_t &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = "") +{ + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, from), expand_name(j, to), "association", label); + + if (rel == j["relationships"].end()) + return false; + + if (!label.empty() && (label != rel->at("label"))) + return false; + + std::string access; + if constexpr (has_type()) + access = "public"; + else if constexpr (has_type()) + access = "protected"; + else + access = "private"; + + if (access != rel->at("access")) + return false; + + return true; +} + +template +bool IsComposition(const json_t &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = "") +{ + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, to), expand_name(j, from), "composition", label); + + if (rel == j["relationships"].end()) + return false; + + if (!label.empty() && label != rel->at("label")) + return false; + + std::string access; + if constexpr (has_type()) + access = "public"; + else if constexpr (has_type()) + access = "protected"; + else + access = "private"; + + if (access != rel->at("access")) + return false; + + return true; +} + +template +bool IsAggregation(const json_t &d, std::string const &from, + std::string const &to, std::string const &label = "", + std::string multiplicity_source = "", std::string multiplicity_dest = "", + std::string style = "") +{ + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, from), expand_name(j, to), "aggregation", label); + + if (rel == j["relationships"].end()) + return false; + + if (!label.empty() && label != rel->at("label")) + return false; + + std::string access; + if constexpr (has_type()) + access = "public"; + else if constexpr (has_type()) + access = "protected"; + else + access = "private"; + + if (access != rel->at("access")) + return false; + + return true; +} + +template <> +bool IsInstantiation(const json_t &d, std::string const &from, + std::string const &to, std::string style) +{ + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, to), expand_name(j, from), "instantiation"); + + if (rel == j["relationships"].end()) + return false; + + return true; +} + +template <> +bool IsDependency(const json_t &d, std::string const &from, + std::string const &to, std::string style) +{ + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, from), expand_name(j, to), "dependency"); + + if (rel == j["relationships"].end()) + return false; + + return true; +} + +template +bool IsFriend(const json_t &d, std::string const &from, std::string const &to) +{ + std::string access; + + if constexpr (has_type()) + access = "public"; + else if constexpr (has_type()) + access = "protected"; + else + access = "private"; + + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, from), expand_name(j, to), "friendship"); + + return rel != j["relationships"].end() && rel->at("access") == access; +} + +template <> +bool IsPackageDependency( + const json_t &d, std::string const &from, std::string const &to) +{ + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, from), expand_name(j, to), "dependency"); + + if (rel == j["relationships"].end()) + return false; + + return true; +} + +template <> +bool IsIncludeDependency( + const json_t &d, std::string const &from, std::string const &to) +{ + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, from), expand_name(j, to), "dependency"); + + if (rel == j["relationships"].end()) + return false; + + return true; +} + +template <> +bool IsConstraint(const json_t &d, std::string const &from, + std::string const &to, std::string label, std::string style) +{ + return false; +} + +template <> +bool IsConceptRequirement( + const json_t &d, std::string const &cpt, std::string requirement) +{ + return false; +} + +template <> +bool IsLayoutHint(const json_t &d, std::string const &from, + std::string const &hint, std::string const &to) +{ + return true; +} + +template <> bool HasComment(const json_t &d, std::string const &comment) +{ + // Comments are not included in JSON + return true; +} + +template <> +bool HasNote(const json_t &d, std::string const &cls, + std::string const &position, std::string const ¬e) +{ + const auto &j = d.src; + + auto sc = get_element(j, expand_name(j, cls)); + + if (!sc) + return false; + + std::string formatted = (*sc)["comment"]["formatted"]; + + return util::contains(formatted, note); +} + +template <> +bool HasPackageNote(const json_t &d, std::string const &cls, + std::string const &position, std::string const ¬e) +{ + return true; +} + +template <> +bool HasMessageComment( + const json_t &d, std::string const &alias, std::string const ¬e) +{ + return true; +} + +template <> +bool HasMemberNote(const json_t &d, std::string const &cls, + std::string const &member, std::string const &position, + std::string const ¬e) +{ + return true; +} + +template <> +bool HasLink(const json_t &d, std::string const &alias, std::string const &link, + std::string const &tooltip) +{ + return true; +} + +template <> +bool HasMemberLink(const json_t &d, std::string const &method, + std::string const &link, std::string const &tooltip) +{ + return true; +} + +template <> bool IsFolder(const json_t &d, std::string const &path) +{ + const auto &j = d.src; + + auto e = get_element(j, path); + return e && e->at("type") == "folder"; +} + +template <> bool IsFile(const json_t &d, std::string const &path) +{ + const auto &j = d.src; + + auto e = get_element(j, path); + return e && e->at("type") == "file"; +} + +template <> bool IsSystemHeader(const json_t &d, std::string const &path) +{ + const auto &j = d.src; + + auto e = get_element(j, path); + return e && e->at("type") == "file" && e->at("file_kind") == "header" && + e->at("is_system"); +} + +template <> +bool IsHeaderDependency(const json_t &d, std::string const &from, + std::string const &to, std::string style) +{ + assert(d.diagram_type == common::model::diagram_t::kInclude); + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, from), expand_name(j, to), "association"); + + if (rel == j["relationships"].end()) + return false; + + return true; +} + +template <> +bool IsSystemHeaderDependency(const json_t &d, std::string const &from, + std::string const &to, std::string style) +{ + assert(d.diagram_type == common::model::diagram_t::kInclude); + const auto &j = d.src; + + auto rel = get_relationship( + j, expand_name(j, from), expand_name(j, to), "dependency"); + + if (rel == j["relationships"].end()) + return false; + + return true; +} + +template +bool IsPackagePath( + const nlohmann::json &j, const std::string &head, Args... args) +{ + if constexpr (sizeof...(Args) == 0) { + auto e = get_element(j, expand_name(j, head)); + + return e && e->at("type") == package_type_name(); + } + else { + auto e = get_element(j, head); + if (!e.has_value()) + return false; + + return IsPackagePath(*e, args...); + } +} + +template +bool IsNamespacePackage(const json_t &d, Args... args) +{ + const auto &j = d.src; + + return IsPackagePath(j, std::forward(args)...); +} + +template +bool IsDirectoryPackage(const json_t &d, Args... args) +{ + const auto &j = d.src; + + return IsPackagePath(j, std::forward(args)...); +} + +template bool IsModulePackage(const json_t &d, Args... args) +{ + const auto &j = d.src; + + return IsPackagePath(j, std::forward(args)...); +} + +template <> bool IsDeprecated(const json_t &d, const std::string &name) +{ + const auto &j = d.src; + + auto e = get_element(j, expand_name(j, name)); + return e && e->at("is_deprecated") == true; +} +} + +/* namespace clanguml { namespace test { namespace matchers { @@ -78,6 +1851,13 @@ using Catch::Matchers::StdString::CasedString; using Catch::Matchers::StdString::ContainsMatcher; using Catch::Matchers::StdString::RegexMatcher; +using Catch::Matchers::Contains; +using Catch::Matchers::EndsWith; +using Catch::Matchers::Equals; +using Catch::Matchers::Matches; +using Catch::Matchers::StartsWith; +using Catch::Matchers::VectorContains; + struct JsonMatcherBase : Catch::MatcherBase { JsonMatcherBase( std::string const &operation, CasedString const &comparator); @@ -757,7 +2537,7 @@ ContainsMatcher IsConstraint(std::string const &from, std::string const &to, util::replace_all(label, "<", "<"); util::replace_all(label, ">", ">"); util::replace_all(label, "(", "("); - util::replace_all(label, ")", ")"); + util::replace_all(label, ")", ") util::replace_all(label, "##", "::"); util::replace_all(label, "{", "{"); util::replace_all(label, "}", "}"); @@ -1690,3 +3470,4 @@ bool HasMessageChain( } } } +*/ \ No newline at end of file diff --git a/tests/test_thread_pool_executor.cc b/tests/test_thread_pool_executor.cc index 369b70a6..0285e49d 100644 --- a/tests/test_thread_pool_executor.cc +++ b/tests/test_thread_pool_executor.cc @@ -15,13 +15,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#define CATCH_CONFIG_MAIN +#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN -#include "catch.h" +#include "doctest/doctest.h" #include "util/thread_pool_executor.h" -TEST_CASE("Test thread_pool_executor", "[unit-test]") +TEST_CASE("Test thread_pool_executor") { using clanguml::util::thread_pool_executor; diff --git a/tests/test_util.cc b/tests/test_util.cc index 0442e4c9..98145004 100644 --- a/tests/test_util.cc +++ b/tests/test_util.cc @@ -15,16 +15,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#define CATCH_CONFIG_MAIN +#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include "util/util.h" #include + #include -#include "catch.h" +#include "doctest/doctest.h" -TEST_CASE("Test split", "[unit-test]") +TEST_CASE("Test split") { using C = std::vector; using namespace clanguml::util; @@ -45,7 +46,7 @@ TEST_CASE("Test split", "[unit-test]") CHECK(split("std::vector::detail::", "::") == C{"std", "vector", "detail"}); } -TEST_CASE("Test abbreviate", "[unit-test]") +TEST_CASE("Test abbreviate") { using namespace clanguml::util; @@ -55,7 +56,7 @@ TEST_CASE("Test abbreviate", "[unit-test]") CHECK(abbreviate("abcdefg", 5) == "ab..."); } -TEST_CASE("Test starts_with", "[unit-test]") +TEST_CASE("Test starts_with") { using clanguml::util::starts_with; using std::filesystem::path; @@ -73,7 +74,7 @@ TEST_CASE("Test starts_with", "[unit-test]") CHECK_FALSE(starts_with(path{"c/file1.h"}, path{"c/file2.h"})); } -TEST_CASE("Test replace_all", "[unit-test]") +TEST_CASE("Test replace_all") { using namespace clanguml::util; @@ -95,7 +96,7 @@ TEST_CASE("Test replace_all", "[unit-test]") CHECK(text == orig); } -TEST_CASE("Test extract_template_parameter_index", "[unit-test]") +TEST_CASE("Test extract_template_parameter_index") { using namespace clanguml::common; @@ -124,7 +125,7 @@ TEST_CASE("Test extract_template_parameter_index", "[unit-test]") } } -TEST_CASE("Test parse_unexposed_template_params", "[unit-test]") +TEST_CASE("Test parse_unexposed_template_params") { using namespace clanguml::common; @@ -200,7 +201,7 @@ TEST_CASE("Test parse_unexposed_template_params", "[unit-test]") CHECK(declaration_template[2].type().value() == "Tail"); } -TEST_CASE("Test remove_prefix", "[unit-test]") +TEST_CASE("Test remove_prefix") { using namespace clanguml::util; @@ -224,7 +225,7 @@ TEST_CASE("Test remove_prefix", "[unit-test]") CHECK(collection.empty()); } -TEST_CASE("Test path_to_url", "[unit-test]") +TEST_CASE("Test path_to_url") { namespace fs = std::filesystem; using namespace clanguml::util; @@ -258,7 +259,7 @@ TEST_CASE("Test path_to_url", "[unit-test]") #endif } -TEST_CASE("Test ensure_path_is_absolute", "[unit-test]") +TEST_CASE("Test ensure_path_is_absolute") { using namespace clanguml::util; @@ -278,7 +279,7 @@ TEST_CASE("Test ensure_path_is_absolute", "[unit-test]") path{"/"}.make_preferred()); } -TEST_CASE("Test hash_seed", "[unit-test]") +TEST_CASE("Test hash_seed") { using namespace clanguml::util; @@ -287,7 +288,7 @@ TEST_CASE("Test hash_seed", "[unit-test]") CHECK(hash_seed(1) != hash_seed(2)); } -TEST_CASE("Test tokenize_unexposed_template_parameter", "[unit-test]") +TEST_CASE("Test tokenize_unexposed_template_parameter") { using namespace clanguml::common; @@ -398,7 +399,7 @@ TEST_CASE("Test tokenize_unexposed_template_parameter", "[unit-test]") } } -TEST_CASE("Test format_message_comment", "[unit-test]") +TEST_CASE("Test format_message_comment") { using namespace clanguml::util; @@ -419,7 +420,7 @@ TEST_CASE("Test format_message_comment", "[unit-test]") 15) == "This is a url:\nhttp://example.com/test/12345"); } -TEST_CASE("Test is_relative_to", "[unit-test]") +TEST_CASE("Test is_relative_to") { using std::filesystem::path; using namespace clanguml::util; @@ -432,7 +433,7 @@ TEST_CASE("Test is_relative_to", "[unit-test]") CHECK_FALSE(is_relative_to(child, base2)); } -TEST_CASE("Test parse_source_location", "[unit-test]") +TEST_CASE("Test parse_source_location") { using namespace clanguml::common;