From 21cfe54dae0a4cce0b9ab691854f950eccd20f50 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Thu, 7 Oct 2021 21:02:12 +0200 Subject: [PATCH] Added template metaprogramming type trait test case --- tests/t00034/.clang-uml | 12 +++++++++ tests/t00034/t00034.cc | 51 ++++++++++++++++++++++++++++++++++++ tests/t00034/test_case.h | 56 ++++++++++++++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + 4 files changed, 120 insertions(+) create mode 100644 tests/t00034/.clang-uml create mode 100644 tests/t00034/t00034.cc create mode 100644 tests/t00034/test_case.h diff --git a/tests/t00034/.clang-uml b/tests/t00034/.clang-uml new file mode 100644 index 00000000..f3a75cbc --- /dev/null +++ b/tests/t00034/.clang-uml @@ -0,0 +1,12 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00034_class: + type: class + glob: + - ../../tests/t00034/t00034.cc + using_namespace: + - clanguml::t00034 + include: + namespaces: + - clanguml::t00034 diff --git a/tests/t00034/t00034.cc b/tests/t00034/t00034.cc new file mode 100644 index 00000000..c0890535 --- /dev/null +++ b/tests/t00034/t00034.cc @@ -0,0 +1,51 @@ +#include + +namespace clanguml { +// +// Based on https://github.com/facebook/folly/blob/master/folly/Unit.h +// +namespace t00034 { + +struct Void { + constexpr bool operator==(const Void & /* unused */) const { return true; } + constexpr bool operator!=(const Void & /* unused */) const { return false; } +}; + +constexpr Void void_t{}; + +template struct lift_void { + using type = T; +}; + +template <> struct lift_void { + using type = Void; +}; + +// +// TODO: This is a shortcoming of libclang which parses the type of lift_void_t +// alias as unexposed, i.e. no actual reference to T can be inferred without +// manually parsing the string 'typename lift_void::type' +// For now, this test validates that the visitor does not crash +// +template using lift_void_t = typename lift_void::type; + +template struct drop_void { + using type = T; +}; + +template <> struct drop_void { + using type = void; +}; + +template using drop_void_t = typename drop_void::type; + +struct A { +}; + +struct R { + lift_void_t *la; + lift_void_t *lv; +}; + +} // namespace t00034 +} // namespace clanguml diff --git a/tests/t00034/test_case.h b/tests/t00034/test_case.h new file mode 100644 index 00000000..7fdb8ae7 --- /dev/null +++ b/tests/t00034/test_case.h @@ -0,0 +1,56 @@ +/** + * tests/t00034/test_case.cc + * + * Copyright (c) 2021 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("t00034", "[test-case][class]") +{ + auto [config, db] = load_config("t00034"); + + auto diagram = config.diagrams["t00034_class"]; + + REQUIRE(diagram->name == "t00034_class"); + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t00034"})); + + REQUIRE(diagram->exclude.namespaces.size() == 0); + + REQUIRE(diagram->should_include("clanguml::t00034::A")); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name() == "t00034_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, IsClassTemplate("lift_void", "T")); + REQUIRE_THAT(puml, IsClassTemplate("drop_void", "T")); + REQUIRE_THAT(puml, IsClass(_A("Void"))); + REQUIRE_THAT(puml, IsClass(_A("A"))); + REQUIRE_THAT(puml, IsClass(_A("R"))); + + REQUIRE_THAT(puml, IsInstantiation(_A("lift_void"), _A("lift_void"))); + REQUIRE_THAT(puml, IsInstantiation(_A("drop_void"), _A("drop_void"))); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 678478e8..ab49b08b 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -139,6 +139,7 @@ using namespace clanguml::test::matchers; #include "t00031/test_case.h" #include "t00032/test_case.h" #include "t00033/test_case.h" +#include "t00034/test_case.h" // // Sequence diagram tests