From d305902e3c2ee940f2e92d286f9c838c548d3856 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Tue, 13 Feb 2024 00:05:07 +0100 Subject: [PATCH] Added variable template base class overload pattern class diagram test case --- tests/t00073/.clang-uml | 9 ++++ tests/t00073/t00073.cc | 24 ++++++++++ tests/t00073/test_case.h | 96 ++++++++++++++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + tests/test_cases.yaml | 3 ++ 5 files changed, 133 insertions(+) create mode 100644 tests/t00073/.clang-uml create mode 100644 tests/t00073/t00073.cc create mode 100644 tests/t00073/test_case.h diff --git a/tests/t00073/.clang-uml b/tests/t00073/.clang-uml new file mode 100644 index 00000000..2e0a42d9 --- /dev/null +++ b/tests/t00073/.clang-uml @@ -0,0 +1,9 @@ +diagrams: + t00073_class: + type: class + glob: + - t00073.cc + include: + namespaces: + - clanguml::t00073 + using_namespace: clanguml::t00073 \ No newline at end of file diff --git a/tests/t00073/t00073.cc b/tests/t00073/t00073.cc new file mode 100644 index 00000000..f16faad0 --- /dev/null +++ b/tests/t00073/t00073.cc @@ -0,0 +1,24 @@ +namespace clanguml { +namespace t00073 { +struct A { }; +struct AHandler { + void handle(A &a) const { } + void operator()(A &a) const { handle(a); } +}; + +struct B { }; +struct BHandler { + void handle(B &b) const { } + void operator()(B &b) const { handle(b); } +}; + +template struct Overload : public Bases... { + using Bases::operator()...; +}; +template Overload(Bases...) -> Overload; + +struct R { + Overload dispatch; +}; +} +} \ No newline at end of file diff --git a/tests/t00073/test_case.h b/tests/t00073/test_case.h new file mode 100644 index 00000000..68af72fd --- /dev/null +++ b/tests/t00073/test_case.h @@ -0,0 +1,96 @@ +/** + * tests/t00073/test_case.h + * + * Copyright (c) 2021-2024 Bartek Kryza + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +TEST_CASE("t00073", "[test-case][class]") +{ + auto [config, db] = load_config("t00073"); + + auto diagram = config.diagrams["t00073_class"]; + + REQUIRE(diagram->name == "t00073_class"); + + auto model = generate_class_diagram(*db, diagram); + + REQUIRE(model->name() == "t00073_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("AHandler"))); + REQUIRE_THAT(src, IsClass(_A("BHandler"))); + REQUIRE_THAT(src, IsClassTemplate("Overload", "Bases...")); + REQUIRE_THAT(src, IsClassTemplate("Overload", "AHandler,BHandler")); + + REQUIRE_THAT(src, IsDependency(_A("AHandler"), _A("A"))); + REQUIRE_THAT(src, IsDependency(_A("BHandler"), _A("B"))); + REQUIRE_THAT(src, + IsInstantiation( + _A("Overload"), _A("Overload"))); + REQUIRE_THAT(src, + IsAggregation( + _A("R"), _A("Overload"), "+dispatch")); + + save_puml(config.output_directory(), diagram->name + ".puml", src); + } + + { + auto j = generate_class_json(diagram, *model); + + using namespace json; + + REQUIRE(IsClassTemplate(j, "Overload")); + REQUIRE(IsClass(j, "A")); + REQUIRE(IsClass(j, "B")); + REQUIRE(IsClass(j, "AHandler")); + REQUIRE(IsClass(j, "BHandler")); + REQUIRE(IsClass(j, "Overload")); + + save_json(config.output_directory(), diagram->name + ".json", j); + } + + { + auto src = generate_class_mermaid(diagram, *model); + + mermaid::AliasMatcher _A(src); + using mermaid::IsClass; + + REQUIRE_THAT(src, IsClass(_A("A"))); + REQUIRE_THAT(src, IsClass(_A("B"))); + REQUIRE_THAT(src, IsClass(_A("AHandler"))); + REQUIRE_THAT(src, IsClass(_A("BHandler"))); + REQUIRE_THAT(src, IsClass(_A("Overload"))); + REQUIRE_THAT(src, IsClass(_A("Overload"))); + + REQUIRE_THAT(src, IsDependency(_A("AHandler"), _A("A"))); + REQUIRE_THAT(src, IsDependency(_A("BHandler"), _A("B"))); + REQUIRE_THAT(src, + IsInstantiation( + _A("Overload"), _A("Overload"))); + REQUIRE_THAT(src, + IsAggregation( + _A("R"), _A("Overload"), "+dispatch")); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", src); + } +} \ No newline at end of file diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 1afcb86d..931c71ce 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -414,6 +414,7 @@ using namespace clanguml::test::matchers; #include "t00071/test_case.h" #include "t00072/test_case.h" #endif +#include "t00073/test_case.h" /// /// Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index a2cde08f..f4471719 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -213,6 +213,9 @@ test_cases: - name: t00072 title: Class diagram with C++20 module partitions generated as packages description: + - name: t00073 + title: Class diagram for template overload pattern + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram test case