Added constexpr if sequence diagram test case

This commit is contained in:
Bartek Kryza
2022-11-27 15:23:32 +01:00
parent b36355352d
commit df0163cdbf
6 changed files with 128 additions and 20 deletions

14
tests/t20008/.clang-uml Normal file
View File

@@ -0,0 +1,14 @@
compilation_database_dir: ..
output_directory: puml
diagrams:
t20008_sequence:
type: sequence
glob:
- ../../tests/t20008/t20008.cc
include:
namespaces:
- clanguml::t20008
using_namespace:
- clanguml::t20008
start_from:
- function: "clanguml::t20008::tmain()"

43
tests/t20008/t20008.cc Normal file
View File

@@ -0,0 +1,43 @@
#include <type_traits>
#include <string>
namespace clanguml {
namespace t20008
{
template <typename T> struct A {
void a1(T arg) { }
void a2(T arg) { }
void a3(T arg) { }
};
template <typename T> struct B {
A<T> a;
void b(T arg) {
if constexpr (std::is_integral_v<T>) {
a.a1(arg);
}
else if constexpr(std::is_pointer_v<T>) {
a.a2(arg);
}
else {
a.a3(arg);
}
}
};
void tmain() {
using namespace std::string_literals;
B<int> bint;
B<const char*> bcharp;
B<std::string> bstring;
bint.b(1);
bcharp.b("1");
bstring.b("1"s);
}
}
}

53
tests/t20008/test_case.h Normal file
View File

@@ -0,0 +1,53 @@
/**
* tests/t20008/test_case.h
*
* Copyright (c) 2021-2022 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("t20008", "[test-case][sequence]")
{
auto [config, db] = load_config("t20008");
auto diagram = config.diagrams["t20008_sequence"];
REQUIRE(diagram->name == "t20008_sequence");
auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20008_sequence");
auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml);
REQUIRE_THAT(puml, StartsWith("@startuml"));
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
// Check if all calls exist
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b"));
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a1"));
REQUIRE_THAT(puml, !HasCall(_A("B<int>"), _A("A<int>"), "a2"));
REQUIRE_THAT(puml, !HasCall(_A("B<int>"), _A("A<int>"), "a3"));
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<const char *>"), "b"));
REQUIRE_THAT(
puml, HasCall(_A("B<const char *>"), _A("A<const char *>"), "a2"));
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b"));
REQUIRE_THAT(
puml, HasCall(_A("B<std::string>"), _A("A<std::string>"), "a3"));
save_puml(
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
}

View File

@@ -254,6 +254,7 @@ using namespace clanguml::test::matchers;
#include "t20005/test_case.h" #include "t20005/test_case.h"
#include "t20006/test_case.h" #include "t20006/test_case.h"
#include "t20007/test_case.h" #include "t20007/test_case.h"
#include "t20008/test_case.h"
/// ///
/// Package diagram tests /// Package diagram tests

View File

@@ -79,26 +79,19 @@ template <typename T, typename... Ts> constexpr bool has_type() noexcept
return (std::is_same_v<T, Ts> || ... || false); return (std::is_same_v<T, Ts> || ... || false);
} }
struct Public { struct Public { };
};
struct Protected { struct Protected { };
};
struct Private { struct Private { };
};
struct Abstract { struct Abstract { };
};
struct Static { struct Static { };
};
struct Const { struct Const { };
};
struct Default { struct Default { };
};
struct HasCallWithResultMatcher : ContainsMatcher { struct HasCallWithResultMatcher : ContainsMatcher {
HasCallWithResultMatcher( HasCallWithResultMatcher(
@@ -158,6 +151,8 @@ struct AliasMatcher {
util::replace_all(name, "(", "\\("); util::replace_all(name, "(", "\\(");
util::replace_all(name, ")", "\\)"); util::replace_all(name, ")", "\\)");
util::replace_all(name, " ", "\\s");
util::replace_all(name, "*", "\\*");
patterns.push_back( patterns.push_back(
std::regex{"class\\s\"" + name + "\"\\sas\\s" + alias_regex}); std::regex{"class\\s\"" + name + "\"\\sas\\s" + alias_regex});
@@ -180,12 +175,11 @@ struct AliasMatcher {
for (const auto &line : puml) { for (const auto &line : puml) {
for (const auto &pattern : patterns) { for (const auto &pattern : patterns) {
if (std::regex_search(line, base_match, pattern)) { if (std::regex_search(line, base_match, pattern) &&
if (base_match.size() == 2) { base_match.size() == 2) {
std::ssub_match base_sub_match = base_match[1]; std::ssub_match base_sub_match = base_match[1];
std::string alias = base_sub_match.str(); std::string alias = base_sub_match.str();
return trim(alias); return trim(alias);
}
} }
} }
} }

View File

@@ -169,6 +169,9 @@ test_cases:
- name: t20007 - name: t20007
title: Class template variadic argument list sequence diagram title: Class template variadic argument list sequence diagram
description: description:
- name: t20008
title: Constexpr if sequence diagram test case
description:
Package diagrams: Package diagrams:
- name: t30001 - name: t30001
title: Basic package diagram test case title: Basic package diagram test case