diff --git a/tests/t20040/t20040.cc b/tests/t20040/t20040.cc index 58d452aef..cffd74f19 100644 --- a/tests/t20040/t20040.cc +++ b/tests/t20040/t20040.cc @@ -23,10 +23,6 @@ void tmain() print(1, 3.14, "test"s); doublePrint("test"s, 2024 / 2); - - // TODO: Add separate test case for variadic class template sequence diagram - - // TODO: Add overload pattern test case } } } \ No newline at end of file diff --git a/tests/t20042/.clang-uml b/tests/t20042/.clang-uml new file mode 100644 index 000000000..a278f5809 --- /dev/null +++ b/tests/t20042/.clang-uml @@ -0,0 +1,11 @@ +diagrams: + t20042_sequence: + type: sequence + glob: + - t20042.cc + include: + namespaces: + - clanguml::t20042 + using_namespace: clanguml::t20042 + from: + - function: "clanguml::t20042::tmain()" \ No newline at end of file diff --git a/tests/t20042/t20042.cc b/tests/t20042/t20042.cc new file mode 100644 index 000000000..57dca400a --- /dev/null +++ b/tests/t20042/t20042.cc @@ -0,0 +1,30 @@ +namespace clanguml { +namespace t20042 { +struct A { }; +struct AHandler { + void handle(A &a) const { } + void operator()(A &a) const { handle(a); } +}; + +struct B { }; +struct BHandler { + void handle(B &b) const { } + void operator()(B &b) const { handle(b); } +}; + +template struct Overload : public Bases... { + using Bases::operator()...; +}; +template Overload(Bases...) -> Overload; + +void tmain() +{ + Overload dispatch; + A a; + B b; + + dispatch(a); + dispatch(b); +} +} +} \ No newline at end of file diff --git a/tests/t20042/test_case.h b/tests/t20042/test_case.h new file mode 100644 index 000000000..3e2276d8a --- /dev/null +++ b/tests/t20042/test_case.h @@ -0,0 +1,75 @@ +/** + * tests/t20042/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("t20042", "[test-case][sequence]") +{ + auto [config, db] = load_config("t20042"); + + auto diagram = config.diagrams["t20042_sequence"]; + + REQUIRE(diagram->name == "t20042_sequence"); + + auto model = generate_sequence_diagram(*db, diagram); + + REQUIRE(model->name() == "t20042_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("AHandler"), "operator()(A &) const")); + REQUIRE_THAT( + src, HasCall(_A("AHandler"), _A("AHandler"), "handle(A &) const")); + REQUIRE_THAT(src, + HasCall(_A("tmain()"), _A("BHandler"), "operator()(B &) const")); + REQUIRE_THAT( + src, HasCall(_A("BHandler"), _A("BHandler"), "handle(B &) const")); + + save_puml(config.output_directory(), diagram->name + ".puml", src); + } + + { + auto j = generate_sequence_json(diagram, *model); + + using namespace json; + + 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("AHandler"), "operator()(A &) const")); + REQUIRE_THAT( + src, HasCall(_A("AHandler"), _A("AHandler"), "handle(A &) const")); + REQUIRE_THAT(src, + HasCall(_A("tmain()"), _A("BHandler"), "operator()(B &) const")); + REQUIRE_THAT( + src, HasCall(_A("BHandler"), _A("BHandler"), "handle(B &) const")); + + 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 b851f1fb9..1afcb86de 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -463,6 +463,7 @@ using namespace clanguml::test::matchers; #include "t20039/test_case.h" #include "t20040/test_case.h" #include "t20041/test_case.h" +#include "t20042/test_case.h" /// /// Package diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index ce5f9ceca..a2cde08f2 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -337,6 +337,9 @@ test_cases: - name: t20041 title: Test case for recursive variadic template class call description: + - name: t20042 + title: Test case for template overload pattern + description: Package diagrams: - name: t30001 title: Basic package diagram test case