diff --git a/src/common/model/decorated_element.cc b/src/common/model/decorated_element.cc index 146f6db3..b828fec1 100644 --- a/src/common/model/decorated_element.cc +++ b/src/common/model/decorated_element.cc @@ -80,4 +80,11 @@ void decorated_element::add_decorators( decorators_.push_back(d); } } + +void decorated_element::append(const decorated_element &de) +{ + for (auto d : de.decorators()) { + decorators_.push_back(d); + } +} } diff --git a/src/common/model/decorated_element.h b/src/common/model/decorated_element.h index 4ac1293f..fad15119 100644 --- a/src/common/model/decorated_element.h +++ b/src/common/model/decorated_element.h @@ -43,6 +43,8 @@ public: void add_decorators( const std::vector> &decorators); + void append(const decorated_element &de); + private: std::vector> decorators_; }; diff --git a/src/common/model/element.cc b/src/common/model/element.cc index a211bb19..b5c7fe25 100644 --- a/src/common/model/element.cc +++ b/src/common/model/element.cc @@ -64,4 +64,6 @@ const std::vector &element::relationships() const { return relationships_; } + +void element::append(const element &e) { decorated_element::append(e); } } diff --git a/src/common/model/element.h b/src/common/model/element.h index 9ca695a6..1fad1f0f 100644 --- a/src/common/model/element.h +++ b/src/common/model/element.h @@ -52,6 +52,8 @@ public: void add_relationship(relationship &&cr); + void append(const element &e); + protected: const uint64_t m_id{0}; diff --git a/src/package_diagram/model/package.h b/src/package_diagram/model/package.h index 50bc54ab..451827a4 100644 --- a/src/package_diagram/model/package.h +++ b/src/package_diagram/model/package.h @@ -37,8 +37,15 @@ class package_trait { public: void add_package(std::unique_ptr p) { - if (!util::contains(packages_, p.get())) + auto it = std::find_if(packages_.begin(), packages_.end(), + [&p](const auto &e) { return *e == *p; }); + + if (it != packages_.end()) { + (*it)->append(*p); + } + else { packages_.emplace_back(std::move(p)); + } } void add_package(std::vector path, std::unique_ptr p) diff --git a/tests/t30004/t30004.cc b/tests/t30004/t30004.cc index ea7ea6ce..611103f4 100644 --- a/tests/t30004/t30004.cc +++ b/tests/t30004/t30004.cc @@ -26,6 +26,10 @@ namespace DDD { /// \uml{note[top] We skipped DDD.} namespace EEE { } + +/// \uml{note[top] Another CCC note.} +namespace CCC { +} } } } \ No newline at end of file diff --git a/tests/t30006/.clang-uml b/tests/t30006/.clang-uml new file mode 100644 index 00000000..7899d3cc --- /dev/null +++ b/tests/t30006/.clang-uml @@ -0,0 +1,15 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t30006_package: + type: package + glob: + - ../../tests/t30006/t30006.cc + include: + namespaces: + - clanguml::t30006 + using_namespace: + - clanguml::t30006 + plantuml: + before: + - "' t30006 test package diagram" \ No newline at end of file diff --git a/tests/t30006/t30006.cc b/tests/t30006/t30006.cc new file mode 100644 index 00000000..d9778875 --- /dev/null +++ b/tests/t30006/t30006.cc @@ -0,0 +1,29 @@ +namespace clanguml { +namespace t30006 { + +namespace B { +struct BB { +}; +} + +/// \uml{note[top] Top A note.} +namespace A { +struct A1 { + B::BB *b; +}; +} + +namespace C { +struct CC { +}; +} + +/// \uml{note[bottom] Bottom A note.} +namespace A { +struct A2 { + C::CC *c; +}; +} + +} +} \ No newline at end of file diff --git a/tests/t30006/test_case.h b/tests/t30006/test_case.h new file mode 100644 index 00000000..c837c9c6 --- /dev/null +++ b/tests/t30006/test_case.h @@ -0,0 +1,54 @@ +/** + * tests/t30006/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("t30006", "[test-case][package]") +{ + auto [config, db] = load_config("t30006"); + + auto diagram = config.diagrams["t30006_package"]; + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t30006"})); + + REQUIRE(diagram->should_include("clanguml::t30006::A")); + REQUIRE(diagram->should_include("clanguml::t30006::C")); + REQUIRE(!diagram->should_include("std::vector")); + + REQUIRE(diagram->name == "t30006_package"); + + auto model = generate_package_diagram(db, diagram); + + REQUIRE(model.name() == "t30006_package"); + + auto puml = generate_package_puml(diagram, model); + AliasMatcher _A(puml); + + REQUIRE_THAT(puml, StartsWith("@startuml")); + REQUIRE_THAT(puml, EndsWith("@enduml\n")); + + REQUIRE_THAT(puml, IsPackage("A")); + REQUIRE_THAT(puml, IsPackage("B")); + REQUIRE_THAT(puml, IsPackage("C")); + + REQUIRE_THAT(puml, IsDependency(_A("A"), _A("B"))); + REQUIRE_THAT(puml, IsDependency(_A("A"), _A("C"))); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 652a6af4..53010601 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -181,6 +181,7 @@ using namespace clanguml::test::matchers; #include "t30003/test_case.h" #include "t30004/test_case.h" #include "t30005/test_case.h" +#include "t30006/test_case.h" // // Other tests (e.g. configuration file)