From a80bf658351648ede236c26383ae986fd3ed3dfe Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 24 Jul 2021 20:14:02 +0200 Subject: [PATCH] Added pimpl unit test case --- tests/t00018/.clanguml | 13 ++++++ tests/t00018/t00018.cc | 22 ++++++++++ tests/t00018/t00018.h | 32 +++++++++++++++ tests/t00018/t00018_impl.cc | 26 ++++++++++++ tests/t00018/t00018_impl.h | 19 +++++++++ tests/t00018/test_case.h | 80 +++++++++++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + tests/test_cases.yaml | 3 ++ 8 files changed, 196 insertions(+) create mode 100644 tests/t00018/.clanguml create mode 100644 tests/t00018/t00018.cc create mode 100644 tests/t00018/t00018.h create mode 100644 tests/t00018/t00018_impl.cc create mode 100644 tests/t00018/t00018_impl.h create mode 100644 tests/t00018/test_case.h diff --git a/tests/t00018/.clanguml b/tests/t00018/.clanguml new file mode 100644 index 00000000..e3692346 --- /dev/null +++ b/tests/t00018/.clanguml @@ -0,0 +1,13 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00018_class: + type: class + glob: + - ../../tests/t00018/**.h + - ../../tests/t00018/**.cc + using_namespace: + - clanguml::t00018 + include: + namespaces: + - clanguml::t00018 diff --git a/tests/t00018/t00018.cc b/tests/t00018/t00018.cc new file mode 100644 index 00000000..59c31634 --- /dev/null +++ b/tests/t00018/t00018.cc @@ -0,0 +1,22 @@ +#include "t00018.h" +#include "t00018_impl.h" + +namespace clanguml { +namespace t00018 { + +void widget::draw() const { pImpl->draw(*this); } + +void widget::draw() { pImpl->draw(*this); } + +widget::widget(int n) + : pImpl{std::make_unique(n)} +{ +} + +widget::widget(widget &&) = default; + +widget::~widget() = default; + +widget &widget::operator=(widget &&) = default; +} +} diff --git a/tests/t00018/t00018.h b/tests/t00018/t00018.h new file mode 100644 index 00000000..ca993d08 --- /dev/null +++ b/tests/t00018/t00018.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include + +namespace clanguml { +namespace t00018 { + +namespace impl { +class widget; +} + +// Pimpl example based on https://en.cppreference.com/w/cpp/language/pimpl +class widget { + std::unique_ptr pImpl; + +public: + void draw() const; + void draw(); + bool shown() const { return true; } + widget(int); + ~widget(); + + widget(widget &&); + + widget(const widget &) = delete; + widget &operator=(widget &&); + widget &operator=(const widget &) = delete; +}; +} +} diff --git a/tests/t00018/t00018_impl.cc b/tests/t00018/t00018_impl.cc new file mode 100644 index 00000000..8bcaef8a --- /dev/null +++ b/tests/t00018/t00018_impl.cc @@ -0,0 +1,26 @@ +#include "t00018_impl.h" +#include "t00018.h" + +namespace clanguml { +namespace t00018 { +namespace impl { + +widget::widget(int n) + : n(n) +{ +} + +void widget::draw(const clanguml::t00018::widget &w) const +{ + if (w.shown()) + std::cout << "drawing a const widget " << n << '\n'; +} + +void widget::draw(const clanguml::t00018::widget &w) +{ + if (w.shown()) + std::cout << "drawing a non-const widget " << n << '\n'; +} +} +} +} diff --git a/tests/t00018/t00018_impl.h b/tests/t00018/t00018_impl.h new file mode 100644 index 00000000..acc414a7 --- /dev/null +++ b/tests/t00018/t00018_impl.h @@ -0,0 +1,19 @@ +#pragma once + +#include "t00018.h" + +namespace clanguml { +namespace t00018 { +namespace impl { + +class widget { + int n; + +public: + void draw(const clanguml::t00018::widget &w) const; + void draw(const clanguml::t00018::widget &w); + widget(int n); +}; +} +} +} diff --git a/tests/t00018/test_case.h b/tests/t00018/test_case.h new file mode 100644 index 00000000..323913d2 --- /dev/null +++ b/tests/t00018/test_case.h @@ -0,0 +1,80 @@ +/** + * tests/t00018/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("t00018", "[test-case][class]") +{ + auto [config, db] = load_config("t00018"); + + auto diagram = config.diagrams["t00018_class"]; + + REQUIRE(diagram->name == "t00018_class"); + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t00018"})); + + REQUIRE(diagram->exclude.namespaces.size() == 0); + + REQUIRE(diagram->should_include("clanguml::t00018::widget")); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name == "t00018_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("widget"))); + /* + 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_THAT(puml, (IsField("some_int", "int"))); + REQUIRE_THAT(puml, (IsField("some_int_pointer", "int*"))); + REQUIRE_THAT(puml, (IsField("some_int_pointer_pointer", "int**"))); + + // Relationship members should not be rendered as part of this testcase + REQUIRE_THAT(puml, !(IsField("a", _A("A")))); + REQUIRE_THAT(puml, !(IsField("b", _A("B")))); + + 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); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 5cd129e8..270a7944 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -121,6 +121,7 @@ using namespace clanguml::test::matchers; #include "t00015/test_case.h" #include "t00016/test_case.h" #include "t00017/test_case.h" +#include "t00018/test_case.h" // // Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index f077977b..4eceeaf3 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -48,6 +48,9 @@ test_cases: - name: t00017 title: Test include relations also as members flag description: + - name: t00018 + title: Pimpl pattern + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram