From 3af55f1e78c31756db6b206017f831f375d74d5c Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 11 Feb 2024 23:52:32 +0100 Subject: [PATCH] Added variadic class template recursive call sequence diagram --- tests/t20039/test_case.h | 13 +++++- tests/t20040/test_case.h | 31 +++++++++++++- tests/t20041/.clang-uml | 11 +++++ tests/t20041/t20041.cc | 31 ++++++++++++++ tests/t20041/test_case.h | 89 ++++++++++++++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + tests/test_cases.yaml | 6 +++ 7 files changed, 178 insertions(+), 4 deletions(-) create mode 100644 tests/t20041/.clang-uml create mode 100644 tests/t20041/t20041.cc create mode 100644 tests/t20041/test_case.h diff --git a/tests/t20039/test_case.h b/tests/t20039/test_case.h index b6f1d976..316d20e0 100644 --- a/tests/t20039/test_case.h +++ b/tests/t20039/test_case.h @@ -59,8 +59,17 @@ TEST_CASE("t20039", "[test-case][sequence]") { auto src = generate_sequence_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsClass; + mermaid::SequenceDiagramAliasMatcher _A(src); + using mermaid::HasCall; + + REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("R"), "run()")); + REQUIRE_THAT(src, HasCall(_A("R"), _A("A"), "a(int)")); + REQUIRE_THAT(src, HasCall(_A("R"), _A("A"), "a(int_vec_t)")); + REQUIRE_THAT( + src, HasCall(_A("R"), _A("A"), "a(string_vec_t)")); + REQUIRE_THAT(src, HasCall(_A("R"), _A("A"), "a(int_map_t)")); + REQUIRE_THAT( + src, HasCall(_A("R"), _A("A"), "a(string_map_t)")); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); } diff --git a/tests/t20040/test_case.h b/tests/t20040/test_case.h index ffb4998b..9ff98228 100644 --- a/tests/t20040/test_case.h +++ b/tests/t20040/test_case.h @@ -40,6 +40,17 @@ TEST_CASE("t20040", "[test-case][sequence]") _A("print(int,double,std::string)"), "")); + REQUIRE_THAT(src, + HasCall(_A("print(int,double,std::string)"), + _A("print(double,std::string)"), "")); + + REQUIRE_THAT(src, + HasCall(_A("print(double,std::string)"), + _A("print(std::string)"), "")); + + REQUIRE_THAT(src, + HasCall(_A("print(std::string)"), _A("print()"), "")); + save_puml(config.output_directory(), diagram->name + ".puml", src); } @@ -54,8 +65,24 @@ TEST_CASE("t20040", "[test-case][sequence]") { auto src = generate_sequence_mermaid(diagram, *model); - mermaid::AliasMatcher _A(src); - using mermaid::IsClass; + mermaid::SequenceDiagramAliasMatcher _A(src); + using mermaid::HasCall; + + REQUIRE_THAT(src, + HasCall(_A("tmain()"), + _A("print(int,double,std::string)"), + "")); + + REQUIRE_THAT(src, + HasCall(_A("print(int,double,std::string)"), + _A("print(double,std::string)"), "")); + + REQUIRE_THAT(src, + HasCall(_A("print(double,std::string)"), + _A("print(std::string)"), "")); + + REQUIRE_THAT(src, + HasCall(_A("print(std::string)"), _A("print()"), "")); save_mermaid(config.output_directory(), diagram->name + ".mmd", src); } diff --git a/tests/t20041/.clang-uml b/tests/t20041/.clang-uml new file mode 100644 index 00000000..f711b899 --- /dev/null +++ b/tests/t20041/.clang-uml @@ -0,0 +1,11 @@ +diagrams: + t20041_sequence: + type: sequence + glob: + - t20041.cc + include: + namespaces: + - clanguml::t20041 + using_namespace: clanguml::t20041 + from: + - function: "clanguml::t20041::tmain()" \ No newline at end of file diff --git a/tests/t20041/t20041.cc b/tests/t20041/t20041.cc new file mode 100644 index 00000000..03dffe9f --- /dev/null +++ b/tests/t20041/t20041.cc @@ -0,0 +1,31 @@ +#include +#include + +namespace clanguml { +namespace t20041 { + +template struct A; + +template struct A { + void print(First first, Rest... rest) + { + std::cout << first << std::endl; + + A a; + a.print(rest...); + } +}; + +template <> struct A<> { + void print() { } +}; + +void tmain() +{ + using namespace std::literals::string_literals; + + A a; + a.print(1, 3.14, "test"s); +} +} +} \ No newline at end of file diff --git a/tests/t20041/test_case.h b/tests/t20041/test_case.h new file mode 100644 index 00000000..c3198068 --- /dev/null +++ b/tests/t20041/test_case.h @@ -0,0 +1,89 @@ +/** + * tests/t20041/test_case.h + * + * Copyright (c) 2021-2024 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("t20041", "[test-case][sequence]") +{ + auto [config, db] = load_config("t20041"); + + auto diagram = config.diagrams["t20041_sequence"]; + + REQUIRE(diagram->name == "t20041_sequence"); + + auto model = generate_sequence_diagram(*db, diagram); + + REQUIRE(model->name() == "t20041_sequence"); + + { + auto src = generate_sequence_puml(diagram, *model); + AliasMatcher _A(src); + + REQUIRE_THAT(src, StartsWith("@startuml")); + REQUIRE_THAT(src, EndsWith("@enduml\n")); + + REQUIRE_THAT(src, + HasCall(_A("tmain()"), _A("A"), + "print(int,double,std::string)")); + REQUIRE_THAT(src, + HasCall(_A("A"), + _A("A"), "print(double,std::string)")); + REQUIRE_THAT(src, + HasCall(_A("A"), _A("A"), + "print(std::string)")); + REQUIRE_THAT(src, HasCall(_A("A"), _A("A"), "print()")); + + save_puml(config.output_directory(), diagram->name + ".puml", src); + } + + { + auto j = generate_sequence_json(diagram, *model); + + using namespace json; + + std::vector messages = { + FindMessage(j, "tmain()", "A", + "print(int,double,std::string)"), + FindMessage(j, "A", "A", + "print(double,std::string)"), + FindMessage(j, "A", "A", + "print(std::string)"), + FindMessage(j, "A", "A", "print()")}; + + REQUIRE(std::is_sorted(messages.begin(), messages.end())); + + save_json(config.output_directory(), diagram->name + ".json", j); + } + + { + auto src = generate_sequence_mermaid(diagram, *model); + + mermaid::SequenceDiagramAliasMatcher _A(src); + using mermaid::HasCall; + + REQUIRE_THAT(src, + HasCall(_A("tmain()"), _A("A"), + "print(int,double,std::string)")); + REQUIRE_THAT(src, + HasCall(_A("A"), + _A("A"), "print(double,std::string)")); + REQUIRE_THAT(src, + HasCall(_A("A"), _A("A"), + "print(std::string)")); + + save_mermaid(config.output_directory(), diagram->name + ".mmd", src); + } +} \ No newline at end of file diff --git a/tests/test_cases.cc b/tests/test_cases.cc index d74a9283..b851f1fb 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -462,6 +462,7 @@ using namespace clanguml::test::matchers; #include "t20038/test_case.h" #include "t20039/test_case.h" #include "t20040/test_case.h" +#include "t20041/test_case.h" /// /// Package diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 5bc0fba0..ce5f9cec 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -331,6 +331,12 @@ test_cases: - name: t20039 title: Test case for type aliases config option in sequence diagrams description: + - name: t20040 + title: Test case for recursive variadic template function call + description: + - name: t20041 + title: Test case for recursive variadic template class call + description: Package diagrams: - name: t30001 title: Basic package diagram test case