From b06335f2f827497e9548cadabc651dce3bb5e11a Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 25 Jul 2021 10:54:57 +0200 Subject: [PATCH] Added abstract factory pattern --- docs/test_cases.md | 1 + docs/test_cases/t00019.md | 2 +- tests/t00020/.clanguml | 18 ++++++++++ tests/t00020/t00020.cc | 70 +++++++++++++++++++++++++++++++++++++++ tests/t00020/test_case.h | 56 +++++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + tests/test_cases.yaml | 3 ++ 7 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 tests/t00020/.clanguml create mode 100644 tests/t00020/t00020.cc create mode 100644 tests/t00020/test_case.h diff --git a/docs/test_cases.md b/docs/test_cases.md index 95b075df..04a004cc 100644 --- a/docs/test_cases.md +++ b/docs/test_cases.md @@ -18,6 +18,7 @@ * [t00017](./test_cases/t00017.md) - Test include relations also as members flag * [t00018](./test_cases/t00018.md) - Pimpl pattern * [t00019](./test_cases/t00019.md) - Layercake pattern + * [t00020](./test_cases/t00020.md) - Abstract factory pattern ## Sequence diagrams * [t20001](./test_cases/t20001.md) - Basic sequence diagram ## Configuration diagrams diff --git a/docs/test_cases/t00019.md b/docs/test_cases/t00019.md index 2fe6f35b..5d835bfc 100644 --- a/docs/test_cases/t00019.md +++ b/docs/test_cases/t00019.md @@ -73,8 +73,8 @@ File t00019_layer1.h ```cpp #pragma once -#include #include +#include namespace clanguml { namespace t00019 { diff --git a/tests/t00020/.clanguml b/tests/t00020/.clanguml new file mode 100644 index 00000000..fcd04dcd --- /dev/null +++ b/tests/t00020/.clanguml @@ -0,0 +1,18 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00020_class: + type: class + glob: + - ../../tests/t00020/t00020.cc + using_namespace: + - clanguml::t00020 + include: + namespaces: + - clanguml::t00020 + plantuml: + after: + - '@A(ProductA1) <.. @A(Factory1)' + - '@A(ProductB1) <.. @A(Factory1)' + - '@A(ProductA2) <.. @A(Factory2)' + - '@A(ProductB2) <.. @A(Factory2)' diff --git a/tests/t00020/t00020.cc b/tests/t00020/t00020.cc new file mode 100644 index 00000000..b8cd07e9 --- /dev/null +++ b/tests/t00020/t00020.cc @@ -0,0 +1,70 @@ +#include + +namespace clanguml { +namespace t00020 { + +class ProductA { +public: + virtual ~ProductA() = default; + virtual bool sell(int price) const = 0; +}; + +class ProductA1 : public ProductA { +public: + bool sell(int price) const override { return price > 1000; } +}; + +class ProductA2 : public ProductA { +public: + bool sell(int price) const override { return price > 2000; } +}; + +class ProductB { +public: + virtual ~ProductB() = default; + virtual bool buy(int price) const = 0; +}; + +class ProductB1 : public ProductB { +public: + bool buy(int price) const override { return price < 1000; } +}; + +class ProductB2 : public ProductB { +public: + bool buy(int price) const override { return price < 2000; } +}; + +class AbstractFactory { +public: + virtual std::unique_ptr make_a() const = 0; + virtual std::unique_ptr make_b() const = 0; +}; + +class Factory1 : public AbstractFactory { +public: + std::unique_ptr make_a() const override + { + return std::make_unique(); + } + + std::unique_ptr make_b() const override + { + return std::make_unique(); + } +}; + +class Factory2 : public AbstractFactory { +public: + std::unique_ptr make_a() const override + { + return std::make_unique(); + } + + std::unique_ptr make_b() const override + { + return std::make_unique(); + } +}; +} +} diff --git a/tests/t00020/test_case.h b/tests/t00020/test_case.h new file mode 100644 index 00000000..6512f0e1 --- /dev/null +++ b/tests/t00020/test_case.h @@ -0,0 +1,56 @@ +/** + * tests/t00020/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("t00020", "[test-case][class]") +{ + auto [config, db] = load_config("t00020"); + + auto diagram = config.diagrams["t00020_class"]; + + REQUIRE(diagram->name == "t00020_class"); + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t00020"})); + + REQUIRE(diagram->exclude.namespaces.size() == 0); + + REQUIRE(diagram->should_include("clanguml::t00020::ProductA")); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name == "t00020_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, IsAbstractClass(_A("ProductA"))); + REQUIRE_THAT(puml, IsAbstractClass(_A("ProductB"))); + REQUIRE_THAT(puml, IsClass(_A("ProductA1"))); + REQUIRE_THAT(puml, IsClass(_A("ProductA2"))); + REQUIRE_THAT(puml, IsClass(_A("ProductB1"))); + REQUIRE_THAT(puml, IsClass(_A("ProductB2"))); + REQUIRE_THAT(puml, IsAbstractClass(_A("AbstractFactory"))); + REQUIRE_THAT(puml, IsClass(_A("Factory1"))); + REQUIRE_THAT(puml, IsClass(_A("Factory2"))); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 18ad5356..ed18e6a8 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -123,6 +123,7 @@ using namespace clanguml::test::matchers; #include "t00017/test_case.h" #include "t00018/test_case.h" #include "t00019/test_case.h" +#include "t00020/test_case.h" // // Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 35bc6e59..80411e8f 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -54,6 +54,9 @@ test_cases: - name: t00019 title: Layercake pattern description: + - name: t00020 + title: Abstract factory pattern + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram