Added initial unexposed template parameter deduction test case

This commit is contained in:
Bartek Kryza
2023-04-23 19:29:30 +02:00
parent 0aa4eb732d
commit 192e1993e8
3 changed files with 160 additions and 0 deletions

12
tests/t00062/.clang-uml Normal file
View File

@@ -0,0 +1,12 @@
compilation_database_dir: ..
output_directory: puml
diagrams:
t00062_class:
type: class
glob:
- ../../tests/t00062/t00062.cc
include:
namespaces:
- clanguml::t00062
using_namespace:
- clanguml::t00062

62
tests/t00062/t00062.cc Normal file
View File

@@ -0,0 +1,62 @@
#include <vector>
namespace clanguml {
namespace t00062 {
template <typename T> struct A;
template <typename U> struct A<U &> {
U &u;
};
template <typename U> struct A<U &&> {
U &&u;
};
template <typename U> struct A<U const &> {
U const &u;
};
template <typename M, typename C> struct A<M C::*> {
C &c;
M C::*m;
};
template <typename M, typename C> struct A<M C::* &&> {
C &&c;
M C::*m;
};
template <typename M, typename C, typename Arg> struct A<M (C::*)(Arg)> {
C &c;
M C::*m;
};
template <typename C> struct A<int (C::*)(bool)> {
C &c;
};
template <typename M, typename C, typename Arg> struct A<M (C::*)(Arg) &&> {
C &&c;
M C::*m;
};
template <typename C> struct A<float (C::*)(int) &&> {
C &&c;
float C::*mf;
};
template <typename M, typename C, typename Arg1, typename Arg2, typename Arg3>
struct A<M (C::*)(Arg1, Arg2, Arg3)> {
C &c;
M C::*m;
};
template <int N> struct A<char[N]> {
char n[N];
};
template <> struct A<char[1000]> {
std::vector<char> n;
};
}
}

86
tests/t00062/test_case.h Normal file
View File

@@ -0,0 +1,86 @@
/**
* tests/t00062/test_case.h
*
* Copyright (c) 2021-2023 Bartek Kryza <bkryza@gmail.com>
*
* 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("t00062", "[test-case][class]")
{
auto [config, db] = load_config("t00062");
auto diagram = config.diagrams["t00062_class"];
REQUIRE(diagram->name == "t00062_class");
auto model = generate_class_diagram(*db, diagram);
REQUIRE(model->name() == "t00062_class");
{
auto puml = generate_class_puml(diagram, *model);
AliasMatcher _A(puml);
REQUIRE_THAT(puml, StartsWith("@startuml"));
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
// Check if all classes exist
REQUIRE_THAT(puml, IsClass(_A("AAA")));
// Check if class templates exist
//REQUIRE_THAT(puml, IsClassTemplate("A", "T,P,CMP,int N"));
// Check concepts
//REQUIRE_THAT(puml, IsConcept(_A("AConcept<T>")));
//REQUIRE_THAT(puml,
// IsConceptRequirement(
// _A("AConcept<T,P>"), "sizeof (T) > sizeof (P)"));
// Check if all enums exist
//REQUIRE_THAT(puml, IsEnum(_A("Lights")));
// Check if all inner classes exist
//REQUIRE_THAT(puml, IsInnerClass(_A("A"), _A("AA")));
// Check if all inheritance relationships exist
//REQUIRE_THAT(puml, IsBaseClass(_A("Base"), _A("Child")));
// Check if all methods exist
//REQUIRE_THAT(puml, (IsMethod<Public, Const>("foo")));
// Check if all fields exist
//REQUIRE_THAT(puml, (IsField<Private>("private_member", "int")));
// Check if all relationships exist
//REQUIRE_THAT(puml, IsAssociation(_A("D"), _A("A"), "-as"));
//REQUIRE_THAT(puml, IsDependency(_A("R"), _A("B")));
//REQUIRE_THAT(puml, IsAggregation(_A("R"), _A("D"), "-ag"));
//REQUIRE_THAT(puml, IsComposition(_A("R"), _A("D"), "-ac"));
//REQUIRE_THAT(puml, IsInstantiation(_A("ABCD::F<T>"), _A("F<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);
}
}