diff --git a/docs/test_cases.md b/docs/test_cases.md index 963737db..9761b821 100644 --- a/docs/test_cases.md +++ b/docs/test_cases.md @@ -20,6 +20,7 @@ * [t00019](./test_cases/t00019.md) - Layercake pattern * [t00020](./test_cases/t00020.md) - Abstract factory pattern * [t00021](./test_cases/t00021.md) - Visitor pattern + * [t00022](./test_cases/t00022.md) - Template method pattern ## Sequence diagrams * [t20001](./test_cases/t20001.md) - Basic sequence diagram ## Configuration diagrams diff --git a/docs/test_cases/t00021.md b/docs/test_cases/t00021.md index 2218a661..32390628 100644 --- a/docs/test_cases/t00021.md +++ b/docs/test_cases/t00021.md @@ -35,20 +35,20 @@ public: class Visitor1 : public Visitor { public: - void visit_A(const A &item) const override { } - void visit_B(const B &item) const override { } + void visit_A(const A &item) const override {} + void visit_B(const B &item) const override {} }; class Visitor2 : public Visitor { public: - void visit_A(const A &item) const override { } - void visit_B(const B &item) const override { } + void visit_A(const A &item) const override {} + void visit_B(const B &item) const override {} }; class Visitor3 : public Visitor { public: - void visit_A(const A &item) const override { } - void visit_B(const B &item) const override { } + void visit_A(const A &item) const override {} + void visit_B(const B &item) const override {} }; class Item { @@ -59,12 +59,12 @@ public: class A : public Item { public: - void accept(const Visitor &visitor) const override { } + void accept(const Visitor &visitor) const override {} }; class B : public Item { public: - void accept(const Visitor &visitor) const override { } + void accept(const Visitor &visitor) const override {} }; } } diff --git a/docs/test_cases/t00022.md b/docs/test_cases/t00022.md new file mode 100644 index 00000000..04c950ce --- /dev/null +++ b/docs/test_cases/t00022.md @@ -0,0 +1,56 @@ +# t00022 - Template method pattern +## Config +```yaml +compilation_database_dir: .. +output_directory: puml +diagrams: + t00022_class: + type: class + glob: + - ../../tests/t00022/t00022.cc + using_namespace: + - clanguml::t00022 + include: + namespaces: + - clanguml::t00022 + +``` +## Source code +File t00022.cc +```cpp +#include + +namespace clanguml { +namespace t00022 { + +class A { +public: + void template_method() + { + method1(); + method2(); + } + +protected: + virtual void method1() = 0; + virtual void method2() = 0; +}; + +class A1 : public A { +protected: + void method1() override { } + void method2() override { } +}; + +class A2 : public A { +protected: + void method1() override { } + void method2() override { } +}; + +} +} + +``` +## Generated UML diagrams +![t00022_class](./t00022_class.png "Template method pattern") diff --git a/docs/test_cases/t00022_class.png b/docs/test_cases/t00022_class.png new file mode 100644 index 00000000..abf6c9d6 Binary files /dev/null and b/docs/test_cases/t00022_class.png differ diff --git a/tests/t00022/.clanguml b/tests/t00022/.clanguml new file mode 100644 index 00000000..6cebb830 --- /dev/null +++ b/tests/t00022/.clanguml @@ -0,0 +1,12 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00022_class: + type: class + glob: + - ../../tests/t00022/t00022.cc + using_namespace: + - clanguml::t00022 + include: + namespaces: + - clanguml::t00022 diff --git a/tests/t00022/t00022.cc b/tests/t00022/t00022.cc new file mode 100644 index 00000000..2e26ace2 --- /dev/null +++ b/tests/t00022/t00022.cc @@ -0,0 +1,31 @@ +#include + +namespace clanguml { +namespace t00022 { + +class A { +public: + void template_method() + { + method1(); + method2(); + } + +protected: + virtual void method1() = 0; + virtual void method2() = 0; +}; + +class A1 : public A { +protected: + void method1() override {} + void method2() override {} +}; + +class A2 : public A { +protected: + void method1() override {} + void method2() override {} +}; +} +} diff --git a/tests/t00022/test_case.h b/tests/t00022/test_case.h new file mode 100644 index 00000000..9b69fb25 --- /dev/null +++ b/tests/t00022/test_case.h @@ -0,0 +1,50 @@ +/** + * tests/t00022/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("t00022", "[test-case][class]") +{ + auto [config, db] = load_config("t00022"); + + auto diagram = config.diagrams["t00022_class"]; + + REQUIRE(diagram->name == "t00022_class"); + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t00022"})); + + REQUIRE(diagram->exclude.namespaces.size() == 0); + + REQUIRE(diagram->should_include("clanguml::t00022::A")); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name == "t00022_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("A"))); + REQUIRE_THAT(puml, IsClass(_A("A1"))); + REQUIRE_THAT(puml, IsClass(_A("A2"))); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index c7c7ad47..d12c2b02 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -125,6 +125,7 @@ using namespace clanguml::test::matchers; #include "t00019/test_case.h" #include "t00020/test_case.h" #include "t00021/test_case.h" +#include "t00022/test_case.h" // // Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 4deb7fa9..388c1bea 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -60,6 +60,9 @@ test_cases: - name: t00021 title: Visitor pattern description: + - name: t00022 + title: Template method pattern + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram