From 5484a23647e049589fe351090c256ab4e8241014 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 25 Jul 2021 13:18:52 +0200 Subject: [PATCH] Added template proxy design pattern test case --- tests/t00025/.clanguml | 12 +++++++++ tests/t00025/t00024.cc | 39 ++++++++++++++++++++++++++++ tests/t00025/t00025.cc | 37 ++++++++++++++++++++++++++ tests/t00025/test_case.h | 56 ++++++++++++++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + tests/test_cases.yaml | 3 +++ 6 files changed, 148 insertions(+) create mode 100644 tests/t00025/.clanguml create mode 100644 tests/t00025/t00024.cc create mode 100644 tests/t00025/t00025.cc create mode 100644 tests/t00025/test_case.h diff --git a/tests/t00025/.clanguml b/tests/t00025/.clanguml new file mode 100644 index 00000000..4a32003c --- /dev/null +++ b/tests/t00025/.clanguml @@ -0,0 +1,12 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00025_class: + type: class + glob: + - ../../tests/t00025/t00025.cc + using_namespace: + - clanguml::t00025 + include: + namespaces: + - clanguml::t00025 diff --git a/tests/t00025/t00024.cc b/tests/t00025/t00024.cc new file mode 100644 index 00000000..ad0423d3 --- /dev/null +++ b/tests/t00025/t00024.cc @@ -0,0 +1,39 @@ +#include + +namespace clanguml { +namespace t00025 { + +class Target { +public: + virtual ~Target() = 0; + + virtual void m1() = 0; + virtual void m2() = 0; +}; + +class Target1 : public Target { +public: + void m1() override {} + void m2() override {} +}; + +class Target2 : public Target { +public: + void m1() override {} + void m2() override {} +}; + +class Proxy : public Target { +public: + Proxy(std::shared_ptr target) + : m_target{std::move(target)} + { + } + void m1() override { m_target->m1(); } + void m2() override { m_target->m2(); } + +private: + std::shared_ptr m_target; +}; +} +} diff --git a/tests/t00025/t00025.cc b/tests/t00025/t00025.cc new file mode 100644 index 00000000..a31a1837 --- /dev/null +++ b/tests/t00025/t00025.cc @@ -0,0 +1,37 @@ +#include + +namespace clanguml { +namespace t00025 { + +class Target1 { +public: + void m1() { } + void m2() { } +}; + +class Target2 { +public: + void m1() { } + void m2() { } +}; + +template class Proxy { +public: + Proxy(std::shared_ptr target) + : m_target {std::move(target)} + { + } + void m1() { m_target->m1(); } + void m2() { m_target->m2(); } + +private: + std::shared_ptr m_target; +}; + +class ProxyHolder { +public: + Proxy proxy1; + Proxy proxy2; +}; +} +} diff --git a/tests/t00025/test_case.h b/tests/t00025/test_case.h new file mode 100644 index 00000000..556ac90a --- /dev/null +++ b/tests/t00025/test_case.h @@ -0,0 +1,56 @@ +/** + * tests/t00025/test_case.cc + * + * Copyright (c) 2021 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("t00025", "[test-case][class]") +{ + auto [config, db] = load_config("t00025"); + + auto diagram = config.diagrams["t00025_class"]; + + REQUIRE(diagram->name == "t00025_class"); + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t00025"})); + + REQUIRE(diagram->exclude.namespaces.size() == 0); + + REQUIRE(diagram->should_include("clanguml::t00025::A")); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name == "t00025_class"); + + auto puml = generate_class_puml(diagram, model); + AliasMatcher _A(puml); + + REQUIRE_THAT(puml, StartsWith("@startuml")); + REQUIRE_THAT(puml, EndsWith("@enduml\n")); + REQUIRE_THAT(puml, IsClass(_A("Target1"))); + REQUIRE_THAT(puml, IsClass(_A("Target2"))); + REQUIRE_THAT(puml, IsClassTemplate("Proxy", "T")); + REQUIRE_THAT(puml, IsInstantiation(_A("Proxy"), _A("Proxy"))); + REQUIRE_THAT(puml, IsInstantiation(_A("Proxy"), _A("Proxy"))); + REQUIRE_THAT(puml, IsAggregation(_A("ProxyHolder"), _A("Proxy"), "+proxy1")); + REQUIRE_THAT(puml, IsAggregation(_A("ProxyHolder"), _A("Proxy"), "+proxy2")); + REQUIRE_THAT(puml, !IsAggregation(_A("ProxyHolder"), _A("Target1"), "+proxy1")); + REQUIRE_THAT(puml, !IsAggregation(_A("ProxyHolder"), _A("Target2"), "+proxy2")); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index be6f76f9..36c830a8 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -128,6 +128,7 @@ using namespace clanguml::test::matchers; #include "t00022/test_case.h" #include "t00023/test_case.h" #include "t00024/test_case.h" +#include "t00025/test_case.h" // // Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 6090f7d6..ab33058f 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -69,6 +69,9 @@ test_cases: - name: t00024 title: Proxy pattern description: + - name: t00025 + title: Template proxy pattern + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram