From 7708ed253536af440a326bf5330675714e0d3374 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Wed, 1 Mar 2023 19:28:42 +0100 Subject: [PATCH] Added non-virtual polymorphism abstract factory test case based on concepts --- tests/CMakeLists.txt | 2 +- tests/t00059/.clang-uml | 12 ++++++ tests/t00059/t00059.cc | 56 ++++++++++++++++++++++++++ tests/t00059/test_case.h | 87 ++++++++++++++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + tests/test_cases.yaml | 3 ++ 6 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 tests/t00059/.clang-uml create mode 100644 tests/t00059/t00059.cc create mode 100644 tests/t00059/test_case.h diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 821a3622..b55b4306 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -3,7 +3,7 @@ file(GLOB_RECURSE TEST_CASE_SOURCES t*/*.cc t*/*.c t*/src/*.c) file(GLOB_RECURSE TEST_CASE_CONFIGS t*/.clang-uml) file(GLOB_RECURSE TEST_CONFIG_YMLS test_config_data/*.yml) -set(TEST_CASES_REQUIRING_CXX20 t00056 t00058) +set(TEST_CASES_REQUIRING_CXX20 t00056 t00058 t00059) set(CLANG_UML_TEST_LIBRARIES clang-umllib diff --git a/tests/t00059/.clang-uml b/tests/t00059/.clang-uml new file mode 100644 index 00000000..94adde8e --- /dev/null +++ b/tests/t00059/.clang-uml @@ -0,0 +1,12 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00059_class: + type: class + glob: + - ../../tests/t00059/t00059.cc + include: + namespaces: + - clanguml::t00059 + using_namespace: + - clanguml::t00059 \ No newline at end of file diff --git a/tests/t00059/t00059.cc b/tests/t00059/t00059.cc new file mode 100644 index 00000000..314f1111 --- /dev/null +++ b/tests/t00059/t00059.cc @@ -0,0 +1,56 @@ +#include + +namespace clanguml { +namespace t00059 { + +template +concept fruit_c = requires(T t) { + T{}; + t.get_name(); + }; + +template +concept apple_c = fruit_c && requires(T t) { t.get_sweetness(); }; + +template +concept orange_c = fruit_c && requires(T t) { t.get_bitterness(); }; + +class gala_apple { +public: + auto get_name() const -> std::string { return "gala"; } + auto get_sweetness() const -> float { return 0.8; } +}; + +class empire_apple { +public: + auto get_name() const -> std::string { return "empire"; } + auto get_sweetness() const -> float { return 0.6; } +}; + +class lima_orange { +public: + auto get_name() const -> std::string { return "lima"; } + auto get_bitterness() const -> float { return 0.8; } +}; + +class valencia_orange { +public: + auto get_name() const -> std::string { return "valencia"; } + auto get_bitterness() const -> float { return 0.6; } +}; + +template class fruit_factory { +public: + auto create_apple() const -> TA { return TA{}; } + auto create_orange() const -> TO { return TO{}; } +}; + +using fruit_factory_1 = fruit_factory; +using fruit_factory_2 = fruit_factory; + +struct R { + fruit_factory_1 factory_1; + fruit_factory_2 factory_2; +}; +} +} \ No newline at end of file diff --git a/tests/t00059/test_case.h b/tests/t00059/test_case.h new file mode 100644 index 00000000..56426b3f --- /dev/null +++ b/tests/t00059/test_case.h @@ -0,0 +1,87 @@ +/** + * tests/t00059/test_case.h + * + * Copyright (c) 2021-2023 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("t00059", "[test-case][class]") +{ + auto [config, db] = load_config("t00059"); + + auto diagram = config.diagrams["t00059_class"]; + + REQUIRE(diagram->name == "t00059_class"); + + auto model = generate_class_diagram(*db, diagram); + + REQUIRE(model->name() == "t00059_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, IsConcept(_A("fruit_c"))); + REQUIRE_THAT(puml, IsConcept(_A("apple_c"))); + REQUIRE_THAT(puml, IsConcept(_A("orange_c"))); + + REQUIRE_THAT(puml, IsConstraint(_A("apple_c"), _A("fruit_c"), "T")); + REQUIRE_THAT(puml, IsConstraint(_A("orange_c"), _A("fruit_c"), "T")); + + REQUIRE_THAT( + puml, IsConceptRequirement(_A("apple_c"), "t.get_sweetness()")); + REQUIRE_THAT( + puml, IsConceptRequirement(_A("apple_c"), "t.get_bitterness()")); + + REQUIRE_THAT(puml, IsClass(_A("gala_apple"))); + REQUIRE_THAT(puml, IsClass(_A("empire_apple"))); + REQUIRE_THAT(puml, IsClass(_A("valencia_orange"))); + REQUIRE_THAT(puml, IsClass(_A("lima_orange"))); + REQUIRE_THAT(puml, IsClass(_A("R"))); + + REQUIRE_THAT( + puml, IsClassTemplate("fruit_factory", "apple_c TA,orange_c TO")); + + REQUIRE_THAT(puml, + IsDependency( + _A("fruit_factory"), _A("gala_apple"))); + REQUIRE_THAT(puml, + IsDependency(_A("fruit_factory"), + _A("valencia_orange"))); + + REQUIRE_THAT(puml, + IsDependency( + _A("fruit_factory"), _A("empire_apple"))); + REQUIRE_THAT(puml, + IsDependency( + _A("fruit_factory"), _A("lima_orange"))); + + REQUIRE_THAT(puml, + IsAggregation(_A("R"), _A("fruit_factory"), + "+factory_1")); + REQUIRE_THAT(puml, + IsAggregation(_A("R"), _A("fruit_factory"), + "+factory_2")); + + REQUIRE_THAT(puml, + IsInstantiation(_A("fruit_factory"), + _A("fruit_factory"))); + REQUIRE_THAT(puml, + IsInstantiation(_A("fruit_factory"), + _A("fruit_factory"))); + + save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); +} \ No newline at end of file diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 06cc0c11..fa277f29 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -261,6 +261,7 @@ using namespace clanguml::test::matchers; #include "t00057/test_case.h" #if defined(ENABLE_CXX_STD_20_TEST_CASES) #include "t00058/test_case.h" +#include "t00059/test_case.h" #endif /// /// Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 0c912406..6466cf82 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -171,6 +171,9 @@ test_cases: - name: t00058 title: Test case for concepts with variadic parameters and type aliases description: + - name: t00059 + title: Non-virtual abstract factory pattern using concepts test case + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram test case