Added sequence diagram JSON test matchers

This commit is contained in:
Bartek Kryza
2023-03-23 00:25:33 +01:00
parent 491fb2b443
commit 49a40723a7
33 changed files with 883 additions and 570 deletions

View File

@@ -95,14 +95,42 @@ void generator::generate_call(const message &m, nlohmann::json &parent) const
msg["name"] = message; msg["name"] = message;
msg["type"] = "message"; msg["type"] = "message";
msg["from"]["name"] = from.value().full_name(false); msg["from"]["activity_name"] = from.value().full_name(false);
msg["from"]["id"] = std::to_string(from.value().id()); msg["from"]["activity_id"] = std::to_string(from.value().id());
msg["to"]["activity_id"] = std::to_string(to.value().id()); msg["to"]["activity_id"] = std::to_string(to.value().id());
msg["to"]["activity_name"] = to.value().full_name(false); msg["to"]["activity_name"] = to.value().full_name(false);
if (from.value().type_name() == "method") {
const auto &class_participant =
m_model.get_participant<model::method>(from.value().id()).value();
msg["from"]["participant_id"] =
std::to_string(class_participant.class_id());
msg["from"]["participant_name"] =
m_model.get_participant<model::class_>(class_participant.class_id())
.value()
.full_name(false);
}
else if (from.value().type_name() == "function" ||
from.value().type_name() == "function_template") {
if (m_config.combine_free_functions_into_file_participants()) {
const auto &file_participant =
m_model.get_participant<model::function>(from.value().id())
.value();
msg["from"]["participant_id"] =
std::to_string(common::to_id(file_participant.file()));
msg["from"]["participant_name"] = file_participant.file_relative();
}
else {
msg["from"]["participant_id"] = std::to_string(from.value().id());
msg["from"]["participant_name"] = from.value().full_name(false);
}
}
if (to.value().type_name() == "method") { if (to.value().type_name() == "method") {
const auto &class_participant = const auto &class_participant =
m_model.get_participant<model::method>(to.value().id()).value(); m_model.get_participant<model::method>(to.value().id()).value();
msg["to"]["participant_id"] = msg["to"]["participant_id"] =
std::to_string(class_participant.class_id()); std::to_string(class_participant.class_id());
msg["to"]["participant_name"] = msg["to"]["participant_name"] =
@@ -110,14 +138,21 @@ void generator::generate_call(const message &m, nlohmann::json &parent) const
.value() .value()
.full_name(false); .full_name(false);
} }
else if (to.value().type_name() == "function" && else if (to.value().type_name() == "function" ||
m_config.combine_free_functions_into_file_participants()) { to.value().type_name() == "function_template") {
if (m_config.combine_free_functions_into_file_participants()) {
const auto &file_participant = const auto &file_participant =
m_model.get_participant<model::function>(to.value().id()).value(); m_model.get_participant<model::function>(to.value().id())
.value();
msg["to"]["participant_id"] = msg["to"]["participant_id"] =
std::to_string(common::to_id(file_participant.file())); std::to_string(common::to_id(file_participant.file()));
msg["to"]["participant_name"] = file_participant.file_relative(); msg["to"]["participant_name"] = file_participant.file_relative();
} }
else {
msg["to"]["participant_id"] = std::to_string(to.value().id());
msg["to"]["participant_name"] = to.value().full_name(false);
}
}
msg["source_location"] = msg["source_location"] =
dynamic_cast<const clanguml::common::model::source_location &>(m); dynamic_cast<const clanguml::common::model::source_location &>(m);

View File

@@ -69,8 +69,10 @@ void generator::generate_call(const message &m, std::ostream &ostr) const
render_mode = model::function::message_render_mode::no_arguments; render_mode = model::function::message_render_mode::no_arguments;
if (to.value().type_name() == "method") { if (to.value().type_name() == "method") {
message = dynamic_cast<const model::function &>(to.value()) const auto &f = dynamic_cast<const model::method &>(to.value());
.message_name(render_mode); const std::string_view style = f.is_static() ? "__" : "";
message =
fmt::format("{}{}{}", style, f.message_name(render_mode), style);
} }
else if (m_config.combine_free_functions_into_file_participants()) { else if (m_config.combine_free_functions_into_file_participants()) {
if (to.value().type_name() == "function") { if (to.value().type_name() == "function") {

View File

@@ -185,7 +185,7 @@ std::string method::message_name(message_render_mode mode) const
{ {
constexpr auto kAbbreviatedMethodArgumentsLength{15}; constexpr auto kAbbreviatedMethodArgumentsLength{15};
const std::string style = is_static() ? "__" : ""; const std::string style = "";
if (mode == message_render_mode::no_arguments) { if (mode == message_render_mode::no_arguments) {
return fmt::format("{}{}(){}{}", style, method_name(), return fmt::format("{}{}(){}{}", style, method_name(),

View File

@@ -31,7 +31,7 @@ TEST_CASE("t20001", "[test-case][sequence]")
REQUIRE(model->should_include("clanguml::t20001::A")); REQUIRE(model->should_include("clanguml::t20001::A"));
REQUIRE(!model->should_include("clanguml::t20001::detail::C")); REQUIRE(!model->should_include("clanguml::t20001::detail::C"));
REQUIRE(!model->should_include("std::vector")); REQUIRE(!model->should_include("std::vector"));
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -46,21 +46,28 @@ TEST_CASE("t20001", "[test-case][sequence]")
REQUIRE_THAT(puml, HasComment("t20001 test diagram of type sequence")); REQUIRE_THAT(puml, HasComment("t20001 test diagram of type sequence"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
REQUIRE(j["participants"][0]["name"] == "clanguml::t20001::tmain()"); using namespace json;
REQUIRE(j["participants"][1]["name"] == "clanguml::t20001::A");
REQUIRE(j["participants"][2]["name"] == "clanguml::t20001::B");
auto &messages = j["sequences"][0]["messages"]; REQUIRE(IsFunctionParticipant(j, "tmain()"));
REQUIRE(messages[0]["name"] == "add(int,int)"); REQUIRE(IsClassParticipant(j, "A"));
REQUIRE(messages[1]["name"] == "wrap_add3(int,int,int)"); REQUIRE(IsClassParticipant(j, "B"));
REQUIRE(messages[2]["name"] == "add3(int,int,int)");
REQUIRE(messages[3]["name"] == "add(int,int)"); std::vector<int> messages = {
REQUIRE(messages[4]["name"] == "__log_result(int)__"); FindMessage(j, "tmain()", "A", "add(int,int)"),
REQUIRE(messages[5]["name"] == "__log_result(int)__"); FindMessage(j, "tmain()", "B", "wrap_add3(int,int,int)"),
FindMessage(j, "B", "A", "add3(int,int,int)"),
FindMessage(j, "A", "A", "add(int,int)"),
FindMessage(j, "A", "A", "log_result(int)"),
FindMessage(j, "B", "A", "log_result(int)")};
REQUIRE(std::is_sorted(messages.begin(), messages.end()));
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -28,6 +28,7 @@ TEST_CASE("t20002", "[test-case][sequence]")
REQUIRE(model->name() == "t20002_sequence"); REQUIRE(model->name() == "t20002_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -38,11 +39,26 @@ TEST_CASE("t20002", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("m2()"), _A("m3()"), "")); REQUIRE_THAT(puml, HasCall(_A("m2()"), _A("m3()"), ""));
REQUIRE_THAT(puml, HasCall(_A("m3()"), _A("m4()"), "")); REQUIRE_THAT(puml, HasCall(_A("m3()"), _A("m4()"), ""));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
REQUIRE(IsFunctionParticipant(j, "m1()"));
REQUIRE(IsFunctionParticipant(j, "m2()"));
REQUIRE(IsFunctionParticipant(j, "m3()"));
REQUIRE(IsFunctionParticipant(j, "m4()"));
std::vector<int> messages = {FindMessage(j, "m1()", "m2()", ""),
FindMessage(j, "m2()", "m3()", ""),
FindMessage(j, "m3()", "m4()", "")};
REQUIRE(std::is_sorted(messages.begin(), messages.end()));
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20003", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20003_sequence"); REQUIRE(model->name() == "t20003_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -38,11 +38,21 @@ TEST_CASE("t20003", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("m2<T>(T)"), _A("m3<T>(T)"), "")); REQUIRE_THAT(puml, HasCall(_A("m2<T>(T)"), _A("m3<T>(T)"), ""));
REQUIRE_THAT(puml, HasCall(_A("m3<T>(T)"), _A("m4<T>(T)"), "")); REQUIRE_THAT(puml, HasCall(_A("m3<T>(T)"), _A("m4<T>(T)"), ""));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
std::vector<int> messages = {FindMessage(j, "m1<T>(T)", "m2<T>(T)", ""),
FindMessage(j, "m2<T>(T)", "m3<T>(T)", ""),
FindMessage(j, "m3<T>(T)", "m4<T>(T)", "")};
REQUIRE(std::is_sorted(messages.begin(), messages.end()));
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20004", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20004_sequence"); REQUIRE(model->name() == "t20004_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -44,8 +44,8 @@ TEST_CASE("t20004", "[test-case][sequence]")
HasCall(_A("m1<unsigned long>(unsigned long)"), HasCall(_A("m1<unsigned long>(unsigned long)"),
_A("m4<unsigned long>(unsigned long)"), "")); _A("m4<unsigned long>(unsigned long)"), ""));
REQUIRE_THAT( REQUIRE_THAT(puml,
puml, HasCall(_A("main()"), _A("m1<std::string>(std::string)"), "")); HasCall(_A("main()"), _A("m1<std::string>(std::string)"), ""));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("m1<std::string>(std::string)"), HasCall(_A("m1<std::string>(std::string)"),
_A("m2<std::string>(std::string)"), "")); _A("m2<std::string>(std::string)"), ""));
@@ -56,11 +56,30 @@ TEST_CASE("t20004", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("m3<int>(int)"), _A("m4<int>(int)"), "")); REQUIRE_THAT(puml, HasCall(_A("m3<int>(int)"), _A("m4<int>(int)"), ""));
REQUIRE_THAT(puml, EndsWith("@enduml\n")); REQUIRE_THAT(puml, EndsWith("@enduml\n"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
std::vector<int> messages = {
FindMessage(j, "main()", "m1<float>(float)", ""),
FindMessage(j, "main()", "m1<unsigned long>(unsigned long)", ""),
FindMessage(j, "m1<unsigned long>(unsigned long)",
"m4<unsigned long>(unsigned long)", ""),
FindMessage(j, "main()", "m1<std::string>(std::string)", ""),
FindMessage(j, "m1<std::string>(std::string)",
"m2<std::string>(std::string)", ""),
FindMessage(j, "main()", "m1<int>(int)", ""),
FindMessage(j, "m1<int>(int)", "m2<int>(int)", ""),
FindMessage(j, "m2<int>(int)", "m3<int>(int)", ""),
FindMessage(j, "m3<int>(int)", "m4<int>(int)", "")};
REQUIRE(std::is_sorted(messages.begin(), messages.end()));
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -28,6 +28,7 @@ TEST_CASE("t20005", "[test-case][sequence]")
REQUIRE(model->name() == "t20005_sequence"); REQUIRE(model->name() == "t20005_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -39,11 +40,16 @@ TEST_CASE("t20005", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("C<T>"), _A("B<T>"), "b(T)")); REQUIRE_THAT(puml, HasCall(_A("C<T>"), _A("B<T>"), "b(T)"));
REQUIRE_THAT(puml, HasCall(_A("B<T>"), _A("A<T>"), "a(T)")); REQUIRE_THAT(puml, HasCall(_A("B<T>"), _A("A<T>"), "a(T)"));
REQUIRE_THAT(puml, HasExitpoint(_A("C<T>"))); REQUIRE_THAT(puml, HasExitpoint(_A("C<T>")));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml);
save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20006", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20006_sequence"); REQUIRE(model->name() == "t20006_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -38,42 +38,51 @@ TEST_CASE("t20006", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)"));
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a1(int)")); REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a1(int)"));
REQUIRE_THAT(
puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("B<std::string>"), _A("A<std::string>"), "a2(std::string)")); HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)"));
REQUIRE_THAT(puml,
HasCall(
_A("B<std::string>"), _A("A<std::string>"), "a2(std::string)"));
REQUIRE_THAT( REQUIRE_THAT(
puml, HasCall(_A("tmain()"), _A("BB<int,int>"), "bb1(int,int)")); puml, HasCall(_A("tmain()"), _A("BB<int,int>"), "bb1(int,int)"));
REQUIRE_THAT(puml, HasCall(_A("BB<int,int>"), _A("AA<int>"), "aa1(int)")); REQUIRE_THAT(
puml, HasCall(_A("BB<int,int>"), _A("AA<int>"), "aa1(int)"));
REQUIRE_THAT( REQUIRE_THAT(
puml, HasCall(_A("tmain()"), _A("BB<int,int>"), "bb2(int,int)")); puml, HasCall(_A("tmain()"), _A("BB<int,int>"), "bb2(int,int)"));
REQUIRE_THAT(puml, HasCall(_A("BB<int,int>"), _A("AA<int>"), "aa2(int)")); REQUIRE_THAT(
puml, HasCall(_A("BB<int,int>"), _A("AA<int>"), "aa2(int)"));
REQUIRE_THAT(puml,
HasCall(_A("tmain()"), _A("BB<int,std::string>"),
"bb1(int,std::string)"));
REQUIRE_THAT(puml,
HasCall(_A("BB<int,std::string>"), _A("AA<int>"), "aa2(int)"));
REQUIRE_THAT(puml,
HasCall(_A("tmain()"), _A("BB<int,std::string>"),
"bb2(int,std::string)"));
REQUIRE_THAT(puml,
HasCall(_A("BB<int,std::string>"), _A("AA<int>"), "aa1(int)"));
REQUIRE_THAT(puml,
HasCall(_A("tmain()"), _A("BB<int,float>"), "bb1(int,float)"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall( HasCall(
_A("tmain()"), _A("BB<int,std::string>"), "bb1(int,std::string)")); _A("BB<int,float>"), _A("BB<int,float>"), "bb2(int,float)"));
REQUIRE_THAT( REQUIRE_THAT(
puml, HasCall(_A("BB<int,std::string>"), _A("AA<int>"), "aa2(int)")); puml, HasCall(_A("BB<int,float>"), _A("AA<int>"), "aa2(int)"));
REQUIRE_THAT(puml, save_puml(
HasCall( config.output_directory() + "/" + diagram->name + ".puml", puml);
_A("tmain()"), _A("BB<int,std::string>"), "bb2(int,std::string)")); }
REQUIRE_THAT(
puml, HasCall(_A("BB<int,std::string>"), _A("AA<int>"), "aa1(int)"));
REQUIRE_THAT(
puml, HasCall(_A("tmain()"), _A("BB<int,float>"), "bb1(int,float)"));
REQUIRE_THAT(puml,
HasCall(_A("BB<int,float>"), _A("BB<int,float>"), "bb2(int,float)"));
REQUIRE_THAT(puml, HasCall(_A("BB<int,float>"), _A("AA<int>"), "aa2(int)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml);
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20007", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20007_sequence"); REQUIRE(model->name() == "t20007_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -41,14 +41,19 @@ TEST_CASE("t20007", "[test-case][sequence]")
HasCall(_A("tmain()"), _A("Adder<int,float,double>"), HasCall(_A("tmain()"), _A("Adder<int,float,double>"),
"add(int &&,float &&,double &&)")); "add(int &&,float &&,double &&)"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("tmain()"), _A("Adder<std::string,std::string,std::string>"), HasCall(_A("tmain()"),
_A("Adder<std::string,std::string,std::string>"),
"add(std::string &&,std::string &&,std::string &&)")); "add(std::string &&,std::string &&,std::string &&)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20008", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20008_sequence"); REQUIRE(model->name() == "t20008_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -37,25 +37,31 @@ TEST_CASE("t20008", "[test-case][sequence]")
// Check if all calls exist // Check if all calls exist
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)"));
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a1(int)")); REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a1(int)"));
// REQUIRE_THAT(puml, !HasCall(_A("B<int>"), _A("A<int>"), "a2(int)")); // REQUIRE_THAT(puml, !HasCall(_A("B<int>"), _A("A<int>"),
// REQUIRE_THAT(puml, !HasCall(_A("B<int>"), _A("A<int>"), "a3(int)")); // "a2(int)")); REQUIRE_THAT(puml, !HasCall(_A("B<int>"),
// _A("A<int>"), "a3(int)"));
REQUIRE_THAT( REQUIRE_THAT(puml,
puml, HasCall(_A("tmain()"), _A("B<const char *>"), "b(const char *)")); HasCall(_A("tmain()"), _A("B<const char *>"), "b(const char *)"));
REQUIRE_THAT(puml,
HasCall(_A("B<const char *>"), _A("A<const char *>"),
"a2(const char *)"));
REQUIRE_THAT(puml,
HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall( HasCall(
_A("B<const char *>"), _A("A<const char *>"), "a2(const char *)")); _A("B<std::string>"), _A("A<std::string>"), "a3(std::string)"));
REQUIRE_THAT( save_puml(
puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)")); config.output_directory() + "/" + diagram->name + ".puml", puml);
REQUIRE_THAT(puml, }
HasCall(_A("B<std::string>"), _A("A<std::string>"), "a3(std::string)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml);
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20009", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20009_sequence"); REQUIRE(model->name() == "t20009_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -35,21 +35,26 @@ TEST_CASE("t20009", "[test-case][sequence]")
REQUIRE_THAT(puml, EndsWith("@enduml\n")); REQUIRE_THAT(puml, EndsWith("@enduml\n"));
// Check if all calls exist // Check if all calls exist
REQUIRE_THAT(
puml, HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("B<std::string>"), _A("A<std::string>"), "a(std::string)")); HasCall(_A("tmain()"), _A("B<std::string>"), "b(std::string)"));
REQUIRE_THAT(puml,
HasCall(
_A("B<std::string>"), _A("A<std::string>"), "a(std::string)"));
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b(int)"));
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a(int)")); REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A<int>"), "a(int)"));
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<float>"), "b(float)")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<float>"), "b(float)"));
REQUIRE_THAT(puml, HasCall(_A("B<float>"), _A("A<float>"), "a(float)")); REQUIRE_THAT(puml, HasCall(_A("B<float>"), _A("A<float>"), "a(float)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20010", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20010_sequence"); REQUIRE(model->name() == "t20010_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -47,11 +47,15 @@ TEST_CASE("t20010", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b4()")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<int>"), "b4()"));
REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a4()")); REQUIRE_THAT(puml, HasCall(_A("B<int>"), _A("A"), "a4()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20011", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20011_sequence"); REQUIRE(model->name() == "t20011_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -43,11 +43,25 @@ TEST_CASE("t20011", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "d(int)")); REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "d(int)"));
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "b(int)")); REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "b(int)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
REQUIRE(IsFunctionParticipant(j, "tmain()"));
REQUIRE(IsClassParticipant(j, "A"));
std::vector<int> messages = {FindMessage(j, "tmain()", "A", "a(int)"),
FindMessage(j, "A", "A", "a(int)"),
FindMessage(j, "tmain()", "A", "b(int)"),
FindMessage(j, "A", "A", "c(int)")};
REQUIRE(std::is_sorted(messages.begin(), messages.end()));
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20012", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20012_sequence"); REQUIRE(model->name() == "t20012_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -76,11 +76,15 @@ TEST_CASE("t20012", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("D"), "add5(int)")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("D"), "add5(int)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20013", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20013_sequence"); REQUIRE(model->name() == "t20013_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -35,21 +35,27 @@ TEST_CASE("t20013", "[test-case][sequence]")
REQUIRE_THAT(puml, EndsWith("@enduml\n")); REQUIRE_THAT(puml, EndsWith("@enduml\n"));
// Check if all calls exist // Check if all calls exist
REQUIRE_THAT(puml, HasCall(_A("tmain(int,char **)"), _A("B"), "b(int)")); REQUIRE_THAT(
puml, HasCall(_A("tmain(int,char **)"), _A("B"), "b(int)"));
REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "a1(int)")); REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "a1(int)"));
REQUIRE_THAT(puml, HasCall(_A("tmain(int,char **)"), _A("B"), "b(double)")); REQUIRE_THAT(
puml, HasCall(_A("tmain(int,char **)"), _A("B"), "b(double)"));
REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "a2(double)")); REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "a2(double)"));
REQUIRE_THAT( REQUIRE_THAT(puml,
puml, HasCall(_A("tmain(int,char **)"), _A("B"), "b(const char *)")); HasCall(_A("tmain(int,char **)"), _A("B"), "b(const char *)"));
REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "a3(const char *)")); REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "a3(const char *)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20014", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20014_sequence"); REQUIRE(model->name() == "t20014_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -41,14 +41,19 @@ TEST_CASE("t20014", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B"), "b2(int,int)")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B"), "b2(int,int)"));
REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "a2(int,int)")); REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "a2(int,int)"));
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("C<B,int>"), "c1(int,int)")); REQUIRE_THAT(
puml, HasCall(_A("tmain()"), _A("C<B,int>"), "c1(int,int)"));
REQUIRE_THAT(puml, HasCall(_A("C<B,int>"), _A("B"), "b1(int,int)")); REQUIRE_THAT(puml, HasCall(_A("C<B,int>"), _A("B"), "b1(int,int)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20015", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20015_sequence"); REQUIRE(model->name() == "t20015_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -36,8 +36,8 @@ TEST_CASE("t20015", "[test-case][sequence]")
// Check if all calls exist // Check if all calls exist
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall( HasCall(_A("tmain()"), _A("B"),
_A("tmain()"), _A("B"), "setup_a(std::shared_ptr<detail::A> &)")); "setup_a(std::shared_ptr<detail::A> &)"));
REQUIRE_THAT(puml, !HasCall(_A("B"), _A("detail::A"), "set_x(int)")); REQUIRE_THAT(puml, !HasCall(_A("B"), _A("detail::A"), "set_x(int)"));
REQUIRE_THAT(puml, !HasCall(_A("B"), _A("detail::A"), "set_y(int)")); REQUIRE_THAT(puml, !HasCall(_A("B"), _A("detail::A"), "set_y(int)"));
REQUIRE_THAT(puml, !HasCall(_A("B"), _A("detail::A"), "set_z(int)")); REQUIRE_THAT(puml, !HasCall(_A("B"), _A("detail::A"), "set_z(int)"));
@@ -46,11 +46,15 @@ TEST_CASE("t20015", "[test-case][sequence]")
REQUIRE_THAT(puml, !HasCall(_A("B"), _A("B"), "set_y(int)")); REQUIRE_THAT(puml, !HasCall(_A("B"), _A("B"), "set_y(int)"));
REQUIRE_THAT(puml, !HasCall(_A("B"), _A("B"), "set_z(int)")); REQUIRE_THAT(puml, !HasCall(_A("B"), _A("B"), "set_z(int)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20016", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20016_sequence"); REQUIRE(model->name() == "t20016_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -41,11 +41,15 @@ TEST_CASE("t20016", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<long>"), "b2(long)")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("B<long>"), "b2(long)"));
REQUIRE_THAT(puml, HasCall(_A("B<long>"), _A("A"), "a2(const long &)")); REQUIRE_THAT(puml, HasCall(_A("B<long>"), _A("A"), "a2(const long &)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20017", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20017_sequence"); REQUIRE(model->name() == "t20017_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -45,14 +45,19 @@ TEST_CASE("t20017", "[test-case][sequence]")
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("t20017.cc"), _A("include/t20017_b.h"), "b1(int,int)")); HasCall(_A("t20017.cc"), _A("include/t20017_b.h"), "b1(int,int)"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("t20017.cc"), _A("include/t20017_b.h"), "b2<int>(int,int)")); HasCall(
_A("t20017.cc"), _A("include/t20017_b.h"), "b2<int>(int,int)"));
REQUIRE_THAT(puml, HasExitpoint(_A("t20017.cc"))); REQUIRE_THAT(puml, HasExitpoint(_A("t20017.cc")));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -28,6 +28,7 @@ TEST_CASE("t20018", "[test-case][sequence]")
REQUIRE(model->name() == "t20018_sequence"); REQUIRE(model->name() == "t20018_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -36,7 +37,8 @@ TEST_CASE("t20018", "[test-case][sequence]")
// Check if all calls exist // Check if all calls exist
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("tmain()"), _A("Answer<Factorial<5>,120>"), "__print()__")); HasCall(
_A("tmain()"), _A("Answer<Factorial<5>,120>"), "__print()__"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("Answer<Factorial<5>,120>"), _A("Factorial<5>"), HasCall(_A("Answer<Factorial<5>,120>"), _A("Factorial<5>"),
"__print(int)__")); "__print(int)__"));
@@ -51,11 +53,15 @@ TEST_CASE("t20018", "[test-case][sequence]")
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("Factorial<1>"), _A("Factorial<0>"), "__print(int)__")); HasCall(_A("Factorial<1>"), _A("Factorial<0>"), "__print(int)__"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -28,6 +28,7 @@ TEST_CASE("t20019", "[test-case][sequence]")
REQUIRE(model->name() == "t20019_sequence"); REQUIRE(model->name() == "t20019_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -40,11 +41,15 @@ TEST_CASE("t20019", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("Base<D2>"), "name()")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("Base<D2>"), "name()"));
REQUIRE_THAT(puml, HasCall(_A("Base<D2>"), _A("D2"), "impl()")); REQUIRE_THAT(puml, HasCall(_A("Base<D2>"), _A("D2"), "impl()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20020", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20020_sequence"); REQUIRE(model->name() == "t20020_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -50,11 +50,15 @@ TEST_CASE("t20020", "[test-case][sequence]")
REQUIRE_THAT( REQUIRE_THAT(
puml, HasCallInControlCondition(_A("tmain()"), _A("C"), "c3(int)")); puml, HasCallInControlCondition(_A("tmain()"), _A("C"), "c3(int)"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20021", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20021_sequence"); REQUIRE(model->name() == "t20021_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -50,18 +50,23 @@ TEST_CASE("t20021", "[test-case][sequence]")
// TODO: Why is this not working? // TODO: Why is this not working?
// REQUIRE_THAT( // REQUIRE_THAT(
// puml, HasCallInControlCondition(_A("tmain()"), _A("C"), "c3()")); // puml, HasCallInControlCondition(_A("tmain()"), _A("C"),
// "c3()"));
REQUIRE_THAT( REQUIRE_THAT(
puml, HasCallInControlCondition(_A("tmain()"), _A("C"), "c4()")); puml, HasCallInControlCondition(_A("tmain()"), _A("C"), "c4()"));
REQUIRE_THAT(puml, HasCall(_A("C"), _A("C"), "c5()")); REQUIRE_THAT(puml, HasCall(_A("C"), _A("C"), "c5()"));
REQUIRE_THAT( REQUIRE_THAT(puml,
puml, HasCallInControlCondition(_A("tmain()"), _A("C"), "contents()")); HasCallInControlCondition(_A("tmain()"), _A("C"), "contents()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20022", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20022_sequence"); REQUIRE(model->name() == "t20022_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -38,11 +38,15 @@ TEST_CASE("t20022", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "a()")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "a()"));
REQUIRE_THAT(puml, HasCall(_A("A"), _A("B"), "b()")); REQUIRE_THAT(puml, HasCall(_A("A"), _A("B"), "b()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20023", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20023_sequence"); REQUIRE(model->name() == "t20023_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -41,11 +41,15 @@ TEST_CASE("t20023", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "a3()")); REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "a3()"));
REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "a4()")); REQUIRE_THAT(puml, HasCall(_A("A"), _A("A"), "a4()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20024", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20024_sequence"); REQUIRE(model->name() == "t20024_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -46,11 +46,15 @@ TEST_CASE("t20024", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("B"), _A("B"), "orange()")); REQUIRE_THAT(puml, HasCall(_A("B"), _A("B"), "orange()"));
REQUIRE_THAT(puml, HasCall(_A("B"), _A("B"), "green()")); REQUIRE_THAT(puml, HasCall(_A("B"), _A("B"), "green()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20025", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20025_sequence"); REQUIRE(model->name() == "t20025_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -41,11 +41,15 @@ TEST_CASE("t20025", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("add(int,int)"), "")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("add(int,int)"), ""));
REQUIRE_THAT(puml, !HasCall(_A("tmain()"), _A("add2(int,int)"), "")); REQUIRE_THAT(puml, !HasCall(_A("tmain()"), _A("add2(int,int)"), ""));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20026", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20026_sequence"); REQUIRE(model->name() == "t20026_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -37,11 +37,15 @@ TEST_CASE("t20026", "[test-case][sequence]")
// Check if all calls exist // Check if all calls exist
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "a()")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "a()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20027", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20027_sequence"); REQUIRE(model->name() == "t20027_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -39,11 +39,15 @@ TEST_CASE("t20027", "[test-case][sequence]")
REQUIRE_THAT(puml, !HasCall(_A("A"), _A("A"), "aa()")); REQUIRE_THAT(puml, !HasCall(_A("A"), _A("A"), "aa()"));
REQUIRE_THAT(puml, !HasCall(_A("A"), _A("A"), "aaa()")); REQUIRE_THAT(puml, !HasCall(_A("A"), _A("A"), "aaa()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20028", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20028_sequence"); REQUIRE(model->name() == "t20028_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -41,11 +41,15 @@ TEST_CASE("t20028", "[test-case][sequence]")
REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "d()")); REQUIRE_THAT(puml, HasCall(_A("tmain()"), _A("A"), "d()"));
REQUIRE_THAT(puml, !HasCall(_A("tmain()"), _A("B"), "e()")); REQUIRE_THAT(puml, !HasCall(_A("tmain()"), _A("B"), "e()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
// REQUIRE(j == nlohmann::json::parse(expected_json)); using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -27,7 +27,7 @@ TEST_CASE("t20029", "[test-case][sequence]")
auto model = generate_sequence_diagram(*db, diagram); auto model = generate_sequence_diagram(*db, diagram);
REQUIRE(model->name() == "t20029_sequence"); REQUIRE(model->name() == "t20029_sequence");
{
auto puml = generate_sequence_puml(diagram, *model); auto puml = generate_sequence_puml(diagram, *model);
AliasMatcher _A(puml); AliasMatcher _A(puml);
@@ -39,11 +39,13 @@ TEST_CASE("t20029", "[test-case][sequence]")
puml, HasCall(_A("tmain()"), _A("ConnectionPool"), "connect()")); puml, HasCall(_A("tmain()"), _A("ConnectionPool"), "connect()"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCallInControlCondition(_A("tmain()"), HasCallInControlCondition(_A("tmain()"),
_A("Encoder<Retrier<ConnectionPool>>"), "send(std::string &&)")); _A("Encoder<Retrier<ConnectionPool>>"),
"send(std::string &&)"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("Encoder<Retrier<ConnectionPool>>"), HasCall(_A("Encoder<Retrier<ConnectionPool>>"),
_A("Encoder<Retrier<ConnectionPool>>"), "encode(std::string &&)")); _A("Encoder<Retrier<ConnectionPool>>"),
"encode(std::string &&)"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
HasCall(_A("Encoder<Retrier<ConnectionPool>>"), HasCall(_A("Encoder<Retrier<ConnectionPool>>"),
@@ -54,11 +56,18 @@ TEST_CASE("t20029", "[test-case][sequence]")
_A("ConnectionPool"), "send(const std::string &)")); _A("ConnectionPool"), "send(const std::string &)"));
REQUIRE_THAT(puml, REQUIRE_THAT(puml,
!HasCall(_A("ConnectionPool"), _A("ConnectionPool"), "connect_impl()")); !HasCall(
_A("ConnectionPool"), _A("ConnectionPool"), "connect_impl()"));
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); save_puml(
config.output_directory() + "/" + diagram->name + ".puml", puml);
}
{
auto j = generate_sequence_json(diagram, *model); auto j = generate_sequence_json(diagram, *model);
using namespace json;
save_json(config.output_directory() + "/" + diagram->name + ".json", j); save_json(config.output_directory() + "/" + diagram->name + ".json", j);
} }
}

View File

@@ -631,6 +631,20 @@ std::optional<nlohmann::json> get_element(
return {}; return {};
} }
std::optional<nlohmann::json> get_participant(
const nlohmann::json &j, const std::string &name)
{
if (!j.contains("participants"))
return {};
for (const nlohmann::json &e : j["participants"]) {
if (e["name"] == name)
return {e};
}
return {};
}
auto get_relationship(const nlohmann::json &j, const nlohmann::json &from, auto get_relationship(const nlohmann::json &j, const nlohmann::json &from,
const nlohmann::json &to, const std::string &type) const nlohmann::json &to, const std::string &type)
{ {
@@ -825,6 +839,82 @@ bool IsInnerClass(
return rel != j["relationships"].end(); return rel != j["relationships"].end();
} }
bool IsParticipant(
const nlohmann::json &j, const std::string &name, const std::string &type)
{
auto p = get_participant(j, expand_name(j, name));
return p && (p->at("type") == type);
}
bool IsFunctionParticipant(const nlohmann::json &j, const std::string &name)
{
return IsParticipant(j, name, "function");
}
bool IsClassParticipant(const nlohmann::json &j, const std::string &name)
{
return IsParticipant(j, name, "class");
}
bool IsFileParticipant(const nlohmann::json &j, const std::string &name)
{
return IsParticipant(j, name, "file");
}
namespace detail {
int find_message_nested(const nlohmann::json &j, const std::string &from,
const std::string &to, const std::string &msg, const nlohmann::json &from_p,
const nlohmann::json &to_p, int &count)
{
const auto &messages = j["messages"];
int res{-1};
for (const auto &m : messages) {
if (m.contains("branches")) {
for (const auto &b : m["branches"]) {
auto nested_res =
find_message_nested(b, from, to, msg, from_p, to_p, count);
if (nested_res >= 0)
return nested_res;
}
}
else {
if ((m["from"]["participant_id"] == from_p["id"]) &&
(m["to"]["participant_id"] == to_p["id"]) && (m["name"] == msg))
return count;
count++;
}
}
return res;
}
} // namespace detail
int FindMessage(const nlohmann::json &j, const std::string &from,
const std::string &to, const std::string &msg)
{
auto from_p = get_participant(j, expand_name(j, from));
auto to_p = get_participant(j, expand_name(j, to));
// TODO: support diagrams with multiple sequences...
const auto &sequence_0 = j["sequences"][0];
int count{0};
auto res = detail::find_message_nested(
sequence_0, from, to, msg, *from_p, *to_p, count);
if (res >= 0)
return res;
throw std::runtime_error(
fmt::format("No such message {} {} {}", from, to, msg));
}
} // namespace json } // namespace json
} }
} }