From 0973289eb7e2042e327757a315e73fd184bdb795 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Wed, 31 May 2023 22:47:02 +0200 Subject: [PATCH] Added test case for unsorted and ungrouped class members and methods --- tests/t00066/.clang-uml | 14 +++++++ tests/t00066/t00066.cc | 68 ++++++++++++++++++++++++++++++++ tests/t00066/test_case.h | 83 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 tests/t00066/.clang-uml create mode 100644 tests/t00066/t00066.cc create mode 100644 tests/t00066/test_case.h diff --git a/tests/t00066/.clang-uml b/tests/t00066/.clang-uml new file mode 100644 index 00000000..f2066018 --- /dev/null +++ b/tests/t00066/.clang-uml @@ -0,0 +1,14 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00066_class: + type: class + glob: + - ../../tests/t00066/t00066.cc + include: + namespaces: + - clanguml::t00066 + member_order: as_is + group_methods: false + using_namespace: + - clanguml::t00066 \ No newline at end of file diff --git a/tests/t00066/t00066.cc b/tests/t00066/t00066.cc new file mode 100644 index 00000000..ae1052b8 --- /dev/null +++ b/tests/t00066/t00066.cc @@ -0,0 +1,68 @@ +#include +#include + +namespace clanguml { +namespace t00066 { + +class A { +public: + A() = default; + A(int i) + : private_member{i} + { + } + A(A &&) = default; + A(const A &) = delete; + virtual ~A() = default; + + void basic_method() { } + static int static_method() { return 0; } + void const_method() const { } + auto auto_method() { return 1; } + + A &operator++() + { + private_member++; + return *this; + } + + A &operator=(A &&other) noexcept { return *this; } + A &operator=(A &other) noexcept { return *this; } + + std::size_t size() const { return private_member; } + + auto double_int(const int i) { return 2 * i; } + auto sum(const double a, const double b) { return a_ + b_ + c_; } + + auto default_int(int i = 12) { return i + 10; } + std::string default_string(int i, std::string s = "abc") + { + return s + std::to_string(i); + } + + static A create_from_int(int i) { return A(i); } + + int public_member; + static int static_int; + static const int static_const_int = 1; + static const auto auto_member{10UL}; + +protected: + void protected_method() { } + + int protected_member; + + std::function compare = [this](const int v) { + return private_member > v; + }; + +private: + void private_method() { } + + int private_member; + int a_, b_, c_; +}; + +int A::static_int = 1; +} // namespace t00003 +} // namespace clanguml diff --git a/tests/t00066/test_case.h b/tests/t00066/test_case.h new file mode 100644 index 00000000..3619b55c --- /dev/null +++ b/tests/t00066/test_case.h @@ -0,0 +1,83 @@ +/** + * tests/t00066/test_case.h + * + * Copyright (c) 2021-2023 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("t00066", "[test-case][class]") +{ + auto [config, db] = load_config("t00066"); + + auto diagram = config.diagrams["t00066_class"]; + + REQUIRE(diagram->name == "t00066_class"); + + auto model = generate_class_diagram(*db, diagram); + + REQUIRE(model->name() == "t00066_class"); + + { + 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, !IsDependency(_A("A"), _A("A"))); + + REQUIRE_THAT(puml, (IsMethod("A"))); + REQUIRE_THAT(puml, (IsMethod("A", "void", "A &&"))); + REQUIRE_THAT( + puml, (IsMethod("A", "void", "const A &"))); + + REQUIRE_THAT(puml, (IsMethod("~A"))); + + REQUIRE_THAT(puml, (IsMethod("basic_method"))); + REQUIRE_THAT(puml, (IsMethod("static_method", "int"))); + REQUIRE_THAT(puml, (IsMethod("const_method"))); + REQUIRE_THAT( + puml, (IsMethod("default_int", "int", "int i = 12"))); + REQUIRE_THAT(puml, + (IsMethod("default_string", "std::string", + "int i, std::string s = \"abc\""))); + + REQUIRE_THAT(puml, (IsMethod("size", "std::size_t"))); + + REQUIRE_THAT(puml, (IsMethod("protected_method"))); + REQUIRE_THAT(puml, (IsMethod("private_method"))); + REQUIRE_THAT(puml, (IsField("public_member", "int"))); + REQUIRE_THAT(puml, (IsField("protected_member", "int"))); + REQUIRE_THAT(puml, (IsField("private_member", "int"))); + REQUIRE_THAT(puml, + (IsField("auto_member", "const unsigned long"))); + + REQUIRE_THAT(puml, (IsField("a_", "int"))); + REQUIRE_THAT(puml, (IsField("b_", "int"))); + REQUIRE_THAT(puml, (IsField("c_", "int"))); + + save_puml( + config.output_directory() + "/" + diagram->name + ".puml", puml); + } + + { + auto j = generate_class_json(diagram, *model); + + using namespace json; + + save_json(config.output_directory() + "/" + diagram->name + ".json", j); + } +} \ No newline at end of file