From 87d381f52a67d8ef2de119e3f5a211d44c7f52ff Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 18 Jun 2022 17:53:42 +0200 Subject: [PATCH] Added root namespace test case --- tests/t00045/.clang-uml | 10 +++++++ tests/t00045/t00045.cc | 31 ++++++++++++++++++++ tests/t00045/test_case.h | 63 ++++++++++++++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + tests/test_cases.yaml | 3 ++ tests/test_util.cc | 5 ++++ 6 files changed, 113 insertions(+) create mode 100644 tests/t00045/.clang-uml create mode 100644 tests/t00045/t00045.cc create mode 100644 tests/t00045/test_case.h diff --git a/tests/t00045/.clang-uml b/tests/t00045/.clang-uml new file mode 100644 index 00000000..84b35cfc --- /dev/null +++ b/tests/t00045/.clang-uml @@ -0,0 +1,10 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00045_class: + type: class + glob: + - ../../tests/t00045/t00045.cc + exclude: + namespaces: + - std \ No newline at end of file diff --git a/tests/t00045/t00045.cc b/tests/t00045/t00045.cc new file mode 100644 index 00000000..aa3ed0ac --- /dev/null +++ b/tests/t00045/t00045.cc @@ -0,0 +1,31 @@ +class A { }; + +class AA { }; + +namespace ns1 { + +class A { }; + +namespace ns2 { + +class A { }; + +class B : public A { }; + +class C : public ns1::A { }; + +class D : public ns1::ns2::A { }; + +class E : public ::A { }; + +class R { +public: + A *a; + ns1::A *ns1_a; + ns1::ns2::A *ns1_ns2_a; + ::A *root_a; + + void foo(::AA &aa) { (void)aa; } +}; +} +} diff --git a/tests/t00045/test_case.h b/tests/t00045/test_case.h new file mode 100644 index 00000000..e7087fb9 --- /dev/null +++ b/tests/t00045/test_case.h @@ -0,0 +1,63 @@ +/** + * tests/t00045/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("t00045", "[test-case][class]") +{ + auto [config, db] = load_config("t00045"); + + auto diagram = config.diagrams["t00045_class"]; + + REQUIRE(diagram->name == "t00045_class"); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model->name() == "t00045_class"); + REQUIRE(model->should_include("clanguml::t00045::ns1::ns2::A")); + + 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("ns1::A"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::A"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::B"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::C"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::D"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::E"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::R"))); + + REQUIRE_THAT(puml, IsBaseClass(_A("ns1::ns2::A"), _A("ns1::ns2::B"))); + REQUIRE_THAT(puml, IsBaseClass(_A("ns1::A"), _A("ns1::ns2::C"))); + REQUIRE_THAT(puml, IsBaseClass(_A("ns1::ns2::A"), _A("ns1::ns2::D"))); + REQUIRE_THAT(puml, IsBaseClass(_A("A"), _A("ns1::ns2::E"))); + + REQUIRE_THAT( + puml, IsAssociation(_A("ns1::ns2::R"), _A("ns1::ns2::A"), "+a")); + REQUIRE_THAT( + puml, IsAssociation(_A("ns1::ns2::R"), _A("ns1::A"), "+ns1_a")); + REQUIRE_THAT(puml, + IsAssociation(_A("ns1::ns2::R"), _A("ns1::ns2::A"), "+ns1_ns2_a")); + REQUIRE_THAT(puml, IsAssociation(_A("ns1::ns2::R"), _A("A"), "+root_a")); + + REQUIRE_THAT(puml, IsDependency(_A("ns1::ns2::R"), _A("AA"))); + + save_puml( + "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 6abba504..29905b03 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -226,6 +226,7 @@ using namespace clanguml::test::matchers; #include "t00042/test_case.h" #include "t00043/test_case.h" #include "t00044/test_case.h" +#include "t00045/test_case.h" // // Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 883cc402..23a7d068 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -129,6 +129,9 @@ test_cases: - name: t00044 title: Test case for inner type aliases with parent class template args description: + - name: t00045 + title: Test case for root namespace handling + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram test case diff --git a/tests/test_util.cc b/tests/test_util.cc index 01bede11..b5862d9e 100644 --- a/tests/test_util.cc +++ b/tests/test_util.cc @@ -33,6 +33,11 @@ TEST_CASE("Test split", "[unit-test]") CHECK(split("", " ") == C{""}); CHECK(split("ABCD", " ") == C{"ABCD"}); + CHECK(split("::A", "::") == C{"A"}); + CHECK(split("::", "::") == C{}); + CHECK(split("A::", "::") == C{"A"}); + CHECK(split(":1", ":") == C{"1"}); + CHECK(split(":1", ":", false) == C{"", "1"}); CHECK(split("std::vector::detail", "::") == C{"std", "vector", "detail"});