From ed965c544e361bd8e94e582336ab5526592cf721 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Wed, 26 Jan 2022 00:30:46 +0100 Subject: [PATCH] Added namespace deprecated attribute test case --- .../plantuml/package_diagram_generator.cc | 6 +- src/package_diagram/model/package.cc | 4 ++ src/package_diagram/model/package.h | 6 ++ .../visitor/translation_unit_visitor.cc | 9 +++ tests/t30003/.clang-uml | 15 +++++ tests/t30003/t30003.cc | 32 +++++++++++ tests/t30003/test_case.h | 56 +++++++++++++++++++ tests/test_cases.cc | 1 + tests/test_cases.h | 7 +++ 9 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 tests/t30003/.clang-uml create mode 100644 tests/t30003/t30003.cc create mode 100644 tests/t30003/test_case.h diff --git a/src/package_diagram/generators/plantuml/package_diagram_generator.cc b/src/package_diagram/generators/plantuml/package_diagram_generator.cc index bd99e411..a4207a82 100644 --- a/src/package_diagram/generators/plantuml/package_diagram_generator.cc +++ b/src/package_diagram/generators/plantuml/package_diagram_generator.cc @@ -114,7 +114,11 @@ void generator::generate(const package &p, std::ostream &ostr) const { const auto uns = m_config.using_namespace; - ostr << "package [" << p.name() << "] as " << p.alias(); + ostr << "package [" << p.name() << "] "; + ostr << "as " << p.alias(); + + if (p.is_deprecated()) + ostr << " <>"; if (!p.style().empty()) ostr << " " << p.style(); diff --git a/src/package_diagram/model/package.cc b/src/package_diagram/model/package.cc index f10d90f6..aebeb79d 100644 --- a/src/package_diagram/model/package.cc +++ b/src/package_diagram/model/package.cc @@ -47,4 +47,8 @@ bool operator==(const package &l, const package &r) { return l.full_name(false) == r.full_name(false); } + +bool package::is_deprecated() const { return is_deprecated_; } + +void package::set_deprecated(bool deprecated) { is_deprecated_ = deprecated; } } \ No newline at end of file diff --git a/src/package_diagram/model/package.h b/src/package_diagram/model/package.h index 51acf379..c21288e9 100644 --- a/src/package_diagram/model/package.h +++ b/src/package_diagram/model/package.h @@ -118,5 +118,11 @@ public: std::string full_name(bool relative) const override; friend bool operator==(const package &l, const package &r); + + bool is_deprecated() const; + + void set_deprecated(bool deprecated); +private: + bool is_deprecated_{false}; }; } diff --git a/src/package_diagram/visitor/translation_unit_visitor.cc b/src/package_diagram/visitor/translation_unit_visitor.cc index ffda2392..8468685a 100644 --- a/src/package_diagram/visitor/translation_unit_visitor.cc +++ b/src/package_diagram/visitor/translation_unit_visitor.cc @@ -106,6 +106,15 @@ void translation_unit_visitor::operator()(const cppast::cpp_entity &file) p->set_name(e.name()); p->set_namespace(package_parent); + for (const auto &attr : + ns_declaration.attributes()) { + if (attr.kind() == + cppast::cpp_attribute_kind::deprecated) { + p->set_deprecated(true); + break; + } + } + ctx.diagram().add_package( package_parent, std::move(p)); ctx.set_current_package( diff --git a/tests/t30003/.clang-uml b/tests/t30003/.clang-uml new file mode 100644 index 00000000..74318921 --- /dev/null +++ b/tests/t30003/.clang-uml @@ -0,0 +1,15 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t30003_package: + type: package + glob: + - ../../tests/t30003/t30003.cc + include: + namespaces: + - clanguml::t30003 + using_namespace: + - clanguml::t30003 + plantuml: + before: + - "' t30003 test package diagram" \ No newline at end of file diff --git a/tests/t30003/t30003.cc b/tests/t30003/t30003.cc new file mode 100644 index 00000000..b83621a8 --- /dev/null +++ b/tests/t30003/t30003.cc @@ -0,0 +1,32 @@ +namespace clanguml { +namespace t30003 { + +namespace ns1 { +namespace ns2_v1_0_0 { +class A { +}; +} + +namespace [[deprecated]] ns2_v0_9_0 { +class A { +}; +} + +namespace { +class Anon final { +}; +} +} + +namespace [[deprecated]] ns3 { + +namespace ns1::ns2 { +class Anon : public t30003::ns1::ns2_v1_0_0::A { +}; +} + +class B : public ns1::ns2::Anon { +}; +} +} +} \ No newline at end of file diff --git a/tests/t30003/test_case.h b/tests/t30003/test_case.h new file mode 100644 index 00000000..15005b27 --- /dev/null +++ b/tests/t30003/test_case.h @@ -0,0 +1,56 @@ +/** + * tests/t30003/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("t30003", "[test-case][package]") +{ + auto [config, db] = load_config("t30003"); + + auto diagram = config.diagrams["t30003_package"]; + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t30003"})); + + REQUIRE(diagram->should_include("clanguml::t30003::A")); + REQUIRE(diagram->should_include("clanguml::t30003::C")); + REQUIRE(!diagram->should_include("std::vector")); + + REQUIRE(diagram->name == "t30003_package"); + + auto model = generate_package_diagram(db, diagram); + + REQUIRE(model.name() == "t30003_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("ns1")); + REQUIRE_THAT(puml, IsPackage("ns2")); + REQUIRE_THAT(puml, IsPackage("ns3")); + REQUIRE_THAT(puml, IsPackage("ns2_v1_0_0")); + REQUIRE_THAT(puml, IsPackage("ns2_v0_9_0")); + + REQUIRE_THAT(puml, IsDeprecated(_A("ns2_v0_9_0"))); + REQUIRE_THAT(puml, IsDeprecated(_A("ns3"))); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index f5b811d7..933f8b80 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -178,6 +178,7 @@ using namespace clanguml::test::matchers; // #include "t30001/test_case.h" #include "t30002/test_case.h" +#include "t30003/test_case.h" // // Other tests (e.g. configuration file) diff --git a/tests/test_cases.h b/tests/test_cases.h index 3fa34dd2..b905d485 100644 --- a/tests/test_cases.h +++ b/tests/test_cases.h @@ -421,6 +421,13 @@ ContainsMatcher IsPackage(std::string const &str, return ContainsMatcher( CasedString("package [" + str + "]", caseSensitivity)); } + +ContainsMatcher IsDeprecated(std::string const &str, + CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) +{ + return ContainsMatcher( + CasedString(str+" <> ", caseSensitivity)); +} } } }