diff --git a/tests/t00033/.clang-uml b/tests/t00033/.clang-uml new file mode 100644 index 00000000..5b474474 --- /dev/null +++ b/tests/t00033/.clang-uml @@ -0,0 +1,12 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00033_class: + type: class + glob: + - ../../tests/t00033/t00033.cc + using_namespace: + - clanguml::t00033 + include: + namespaces: + - clanguml::t00033 diff --git a/tests/t00033/t00033.cc b/tests/t00033/t00033.cc new file mode 100644 index 00000000..80453c92 --- /dev/null +++ b/tests/t00033/t00033.cc @@ -0,0 +1,28 @@ +#include +#include + +namespace clanguml { +namespace t00033 { + +template struct A { + T aaa; +}; + +template struct B { + T bbb; +}; + +template struct C { + T ccc; +}; + +struct D { + int ddd; +}; + +struct R { + A>> abc; +}; + +} // namespace t00033 +} // namespace clanguml diff --git a/tests/t00033/test_case.h b/tests/t00033/test_case.h new file mode 100644 index 00000000..a1f3bbec --- /dev/null +++ b/tests/t00033/test_case.h @@ -0,0 +1,61 @@ +/** + * tests/t00033/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("t00033", "[test-case][class]") +{ + auto [config, db] = load_config("t00033"); + + auto diagram = config.diagrams["t00033_class"]; + + REQUIRE(diagram->name == "t00033_class"); + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t00033"})); + + REQUIRE(diagram->exclude.namespaces.size() == 0); + + REQUIRE(diagram->should_include("clanguml::t00033::A")); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name == "t00033_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, IsClassTemplate("A", "T")); + REQUIRE_THAT(puml, IsClassTemplate("B", "T")); + REQUIRE_THAT(puml, IsClassTemplate("C", "T")); + REQUIRE_THAT(puml, IsClass(_A("D"))); + REQUIRE_THAT(puml, IsClass(_A("R"))); + + REQUIRE_THAT(puml, IsDependency(_A("A>>"), _A("B>"))); + REQUIRE_THAT(puml, IsDependency(_A("B>"), _A("C"))); + REQUIRE_THAT(puml, IsDependency(_A("C"), _A("D"))); + + REQUIRE_THAT(puml, IsInstantiation(_A("C"), _A("C"))); + REQUIRE_THAT(puml, IsInstantiation(_A("B"), _A("B>"))); + REQUIRE_THAT(puml, IsInstantiation(_A("A"), _A("A>>"))); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index d410f137..bde5c0c8 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -136,6 +136,7 @@ using namespace clanguml::test::matchers; #include "t00030/test_case.h" #include "t00031/test_case.h" #include "t00032/test_case.h" +#include "t00033/test_case.h" // // Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 160c327b..823ba7e8 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -93,6 +93,9 @@ test_cases: - name: t00032 title: Class template with template base classes test case description: + - name: t00033 + title: Nested template instantiation dependency test case + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram