From 1a9b338ff03d8cc758a75bec0fca605a6fe69cee Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 6 Mar 2022 19:26:33 +0100 Subject: [PATCH] Added unexposed nested template test case --- tests/t00038/.clang-uml | 13 +++++++ tests/t00038/t00038.cc | 41 +++++++++++++++++++++ tests/t00038/test_case.h | 78 ++++++++++++++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + 4 files changed, 133 insertions(+) create mode 100644 tests/t00038/.clang-uml create mode 100644 tests/t00038/t00038.cc create mode 100644 tests/t00038/test_case.h diff --git a/tests/t00038/.clang-uml b/tests/t00038/.clang-uml new file mode 100644 index 00000000..29318d35 --- /dev/null +++ b/tests/t00038/.clang-uml @@ -0,0 +1,13 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00038_class: + type: class + generate_packages: true + glob: + - ../../tests/t00038/t00038.cc + using_namespace: + - clanguml::t00038 + include: + namespaces: + - clanguml::t00038 \ No newline at end of file diff --git a/tests/t00038/t00038.cc b/tests/t00038/t00038.cc new file mode 100644 index 00000000..531a44fe --- /dev/null +++ b/tests/t00038/t00038.cc @@ -0,0 +1,41 @@ +#include +#include +#include +#include + +namespace clanguml { +namespace t00038 { + +enum class property_t { property_a, property_b, property_c }; + +struct A { +}; +struct B { +}; +struct C { +}; + +struct key_t { + std::string key; +}; + +template struct map; + +template <> +struct map> : A { +}; + +template <> +struct map< + std::vector>> + : B { +}; + +template <> +struct map>>> + : C { +}; + +} // namespace t00038 +} // namespace clanguml diff --git a/tests/t00038/test_case.h b/tests/t00038/test_case.h new file mode 100644 index 00000000..6f429bbb --- /dev/null +++ b/tests/t00038/test_case.h @@ -0,0 +1,78 @@ +/** + * tests/t00038/test_case.cc + * + * Copyright (c) 2021-2022 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("t00038", "[test-case][class]") +{ + auto [config, db] = load_config("t00038"); + + auto diagram = config.diagrams["t00038_class"]; + + REQUIRE(diagram->name == "t00038_class"); + REQUIRE(diagram->generate_packages() == true); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name() == "t00038_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("A"))); + REQUIRE_THAT(puml, IsClass(_A("B"))); + REQUIRE_THAT(puml, IsClass(_A("C"))); + REQUIRE_THAT(puml, IsClass(_A("key_t"))); + REQUIRE_THAT(puml, IsClassTemplate("map", "T")); + REQUIRE_THAT(puml, + IsClassTemplate("map", + "std::integral_constant")); + REQUIRE_THAT(puml, + IsClassTemplate("map", + "std::vector>")); + REQUIRE_THAT(puml, + IsClassTemplate("map", + "std::map>>")); + + REQUIRE_THAT(puml, IsEnum(_A("property_t"))); + + REQUIRE_THAT(puml, + IsInstantiation(_A("map"), + _A("map>>>"))); + + // TODO: Add parsing of unexposed template arguments to infer + // additional relationships + /* + REQUIRE_THAT(puml, + IsDependency(_A("map>"), + _A("property_t"))); + + REQUIRE_THAT(puml, + IsDependency(_A("map>>>"), + _A("key_t"))); + */ + + save_puml( + "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 2257c8c1..f6e3a939 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -180,6 +180,7 @@ using namespace clanguml::test::matchers; #include "t00035/test_case.h" #include "t00036/test_case.h" #include "t00037/test_case.h" +#include "t00038/test_case.h" // // Sequence diagram tests