diff --git a/tests/t20017/test_case.h b/tests/t20017/test_case.h index 9ae03f82..30cc8778 100644 --- a/tests/t20017/test_case.h +++ b/tests/t20017/test_case.h @@ -27,93 +27,13 @@ TEST_CASE("t20017") REQUIRE(MessageOrder(src, { // - // {Entrypoint{}, "t20017.cc", "tmain()"}, // - {"t20017.cc", "include/t20017_a.h", "a3(int,int)"}, // + {Entrypoint{}, "t20017.cc", "tmain()"}, // + {"t20017.cc", "include/t20017_a.h", "a3(int,int)"}, // {"t20017.cc", "include/t20017_b.h", "b1(int,int)"}, // - /* {"t20017.cc", "include/t20017_a.h", "a2(int,int)"}, // + {"t20017.cc", "include/t20017_a.h", "a2(int,int)"}, // {"t20017.cc", "include/t20017_a.h", "a1(int,int)"}, // {"t20017.cc", "include/t20017_b.h", "b2(int,int)"}, // - {Exitpoint{}, "t20017.cc"}, //*/ + {Exitpoint{}, "t20017.cc"}, // })); }); - /* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - // Check if all calls exist - REQUIRE_THAT(src, HasEntrypoint(_A("t20017.cc"), "tmain()")); - REQUIRE_THAT(src, - HasCall(_A("t20017.cc"), _A("include/t20017_a.h"), "a1(int,int)")); - REQUIRE_THAT(src, - HasCall(_A("t20017.cc"), _A("include/t20017_a.h"), "a2(int,int)")); - REQUIRE_THAT(src, - HasCall(_A("t20017.cc"), _A("include/t20017_a.h"), "a3(int,int)")); - REQUIRE_THAT(src, - HasCall(_A("t20017.cc"), _A("include/t20017_b.h"), "b1(int,int)")); - REQUIRE_THAT(src, - HasCall( - _A("t20017.cc"), _A("include/t20017_b.h"), "b2(int,int)")); - REQUIRE_THAT(src, HasExitpoint(_A("t20017.cc"))); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - const auto &t20017_cc = get_participant(j, "t20017.cc"); - - CHECK(t20017_cc.has_value()); - - CHECK(t20017_cc.value()["type"] == "file"); - CHECK(t20017_cc.value()["name"] == "t20017.cc"); - CHECK(t20017_cc.value()["display_name"] == "t20017.cc"); - - std::vector messages = { - FindMessage(j, File("t20017.cc"), File("include/t20017_a.h"), - "a3(int,int)"), - FindMessage(j, File("t20017.cc"), File("include/t20017_b.h"), - "b1(int,int)"), - FindMessage(j, File("t20017.cc"), File("include/t20017_a.h"), - "a2(int,int)"), - FindMessage(j, File("t20017.cc"), File("include/t20017_a.h"), - "a1(int,int)"), - FindMessage(j, File("t20017.cc"), File("include/t20017_b.h"), - "b2(int,int)")}; - - REQUIRE(std::is_sorted(messages.begin(), messages.end())); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - using mermaid::HasEntrypoint; - using mermaid::HasExitpoint; - - REQUIRE_THAT(src, HasEntrypoint(_A("t20017.cc"), "tmain()")); - REQUIRE_THAT(src, - HasCall(_A("t20017.cc"), _A("include/t20017_a.h"), "a1(int,int)")); - REQUIRE_THAT(src, - HasCall(_A("t20017.cc"), _A("include/t20017_a.h"), "a2(int,int)")); - REQUIRE_THAT(src, - HasCall(_A("t20017.cc"), _A("include/t20017_a.h"), "a3(int,int)")); - REQUIRE_THAT(src, - HasCall(_A("t20017.cc"), _A("include/t20017_b.h"), "b1(int,int)")); - REQUIRE_THAT(src, - HasCall( - _A("t20017.cc"), _A("include/t20017_b.h"), "b2(int,int)")); - REQUIRE_THAT(src, HasExitpoint(_A("t20017.cc"))); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - }*/ } \ No newline at end of file diff --git a/tests/t20023/test_case.h b/tests/t20023/test_case.h index a7cf3371..dec644c4 100644 --- a/tests/t20023/test_case.h +++ b/tests/t20023/test_case.h @@ -32,7 +32,6 @@ TEST_CASE("t20023") {"A", "A", "a2()"}, // {"A", "A", "a3()"}, // {"A", "A", "a4()"}, // - })); }); } \ No newline at end of file diff --git a/tests/t20030/test_case.h b/tests/t20030/test_case.h index c2b8fefb..88327c5d 100644 --- a/tests/t20030/test_case.h +++ b/tests/t20030/test_case.h @@ -26,83 +26,27 @@ TEST_CASE("t20030") CHECK_SEQUENCE_DIAGRAM(config, diagram, *model, [](const auto &src) { REQUIRE(MessageOrder(src, { + // + // "clanguml::t20030::tmain(int)" // {"tmain(int)", "magic()", ""}, // {"tmain(int)", "A", "A(int)"}, // {"tmain(int)", "A", "operator+=(int)"}, // {"A", "A", "add(int)"}, // - {"tmain(bool,int)", "A", "A()"}, // - // {"A", "A", "create()"}, // - // {"tmain(bool,int)", "A", "A()"}, // - // {"A", "A", "create()"}, // - // {"tmain(bool,int)", "A", "operator+=(int)"}, - // // - // {"A", "A", "add(int)"}, // - // {"tmain(bool,int)", "A", "operator=(const A - // &)"}, // - // {"A", "A", "set(int)"}, // - // {"tmain(bool,int)", "A", "value() const"} // + + // + // "clanguml::t20030::tmain(bool,int)" + // + {"tmain(bool,int)", "A", "A()"}, // + {"A", "A", "create()"}, // + {"tmain(bool,int)", "A", "A()"}, // + {"A", "A", "create()"}, // + {"tmain(bool,int)", "A", "operator+=(int)"}, // + // + {"A", "A", "add(int)"}, // + {"tmain(bool,int)", "A", "operator=(const A &)"}, // + {"A", "A", "set(int)"}, // + {"tmain(bool,int)", "A", "value() const"} // })); }); - /* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - // Check if all calls exist - REQUIRE_THAT(src, HasCall(_A("tmain(int)"), _A("magic()"), "")); - - REQUIRE_THAT(src, HasCall(_A("A"), _A("A"), "create()")); - REQUIRE_THAT( - src, HasCall(_A("tmain(int)"), _A("A"), "operator+=(int)")); - REQUIRE_THAT(src, HasCall(_A("A"), _A("A"), "add(int)")); - - REQUIRE_THAT(src, HasCall(_A("tmain(bool,int)"), _A("A"), "A()")); - REQUIRE_THAT( - src, HasCall(_A("tmain(bool,int)"), _A("A"), - "operator+=(int)")); REQUIRE_THAT(src, HasCall(_A("A"), _A("A"), - "add(int)")); REQUIRE_THAT(src, HasCall(_A("tmain(bool,int)"), _A("A"), - "operator=(const A &)")); REQUIRE_THAT(src, HasCall(_A("A"), _A("A"), - "set(int)")); REQUIRE_THAT(src, HasCall(_A("tmain(bool,int)"), _A("A"), - "value()")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - - REQUIRE_THAT(src, HasCall(_A("tmain(int)"), _A("magic()"), "")); - - REQUIRE_THAT(src, HasCall(_A("A"), _A("A"), "create()")); - REQUIRE_THAT( - src, HasCall(_A("tmain(int)"), _A("A"), "operator+=(int)")); - REQUIRE_THAT(src, HasCall(_A("A"), _A("A"), "add(int)")); - - REQUIRE_THAT(src, HasCall(_A("tmain(bool,int)"), _A("A"), "A()")); - REQUIRE_THAT( - src, HasCall(_A("tmain(bool,int)"), _A("A"), - "operator+=(int)")); REQUIRE_THAT(src, HasCall(_A("A"), _A("A"), - "add(int)")); REQUIRE_THAT(src, HasCall(_A("tmain(bool,int)"), _A("A"), - "operator=(const A &)")); REQUIRE_THAT(src, HasCall(_A("A"), _A("A"), - "set(int)")); REQUIRE_THAT(src, HasCall(_A("tmain(bool,int)"), _A("A"), - "value()")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", - src); - }*/ } \ No newline at end of file diff --git a/tests/t20031/test_case.h b/tests/t20031/test_case.h index 4fd9c885..12232577 100644 --- a/tests/t20031/test_case.h +++ b/tests/t20031/test_case.h @@ -31,73 +31,16 @@ TEST_CASE("t20031") {"tmain(bool,int)", "execute(std::function)", ""}, // {"tmain(bool,int)", "A", "value() const"} // })); + REQUIRE(!HasMessage(src, {"A", "A", "create()"})); + REQUIRE(!HasMessage(src, {"tmain(int)", "A", "operator+=(int)"})); + REQUIRE(!HasMessage(src, {"tmain(bool,int)", "A", "A()"})); + REQUIRE(!HasMessage(src, {"tmain(bool,int)", "A", "operator+=(int)"})); + REQUIRE(!HasMessage(src, {"A", "A", "add(int)"})); + REQUIRE( + !HasMessage(src, {"tmain(bool,int)", "A", "operator=(const A &)"})); + REQUIRE(!HasMessage(src, {"A", "A", "set(int)"})); + REQUIRE(!HasMessage(src, + {"tmain(bool,int)::(lambda ../../tests/t20031/t20031.cc:47:26)", + "zero()", ""})); }); -/* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, HasCall(_A("tmain(int)"), _A("magic()"), "")); - - REQUIRE_THAT(src, !HasCall(_A("A"), _A("A"), "create()")); - REQUIRE_THAT( - src, !HasCall(_A("tmain(int)"), _A("A"), "operator+=(int)")); - REQUIRE_THAT(src, !HasCall(_A("A"), _A("A"), "add(int)")); - - REQUIRE_THAT(src, !HasCall(_A("tmain(bool,int)"), _A("A"), "A()")); - REQUIRE_THAT( - src, !HasCall(_A("tmain(bool,int)"), _A("A"), "operator+=(int)")); - REQUIRE_THAT(src, !HasCall(_A("A"), _A("A"), "add(int)")); - REQUIRE_THAT(src, - !HasCall(_A("tmain(bool,int)"), _A("A"), "operator=(const A &)")); - REQUIRE_THAT(src, !HasCall(_A("A"), _A("A"), "set(int)")); - REQUIRE_THAT(src, HasCall(_A("tmain(bool,int)"), _A("A"), "value()")); - REQUIRE_THAT(src, - !HasCall(_A("tmain(bool,int)::(lambda " - "../../tests/t20031/t20031.cc:47:26)"), - _A("zero()"), "")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - - REQUIRE_THAT(src, HasCall(_A("tmain(int)"), _A("magic()"), "")); - - REQUIRE_THAT(src, !HasCall(_A("A"), _A("A"), "create()")); - REQUIRE_THAT( - src, !HasCall(_A("tmain(int)"), _A("A"), "operator+=(int)")); - REQUIRE_THAT(src, !HasCall(_A("A"), _A("A"), "add(int)")); - - REQUIRE_THAT(src, !HasCall(_A("tmain(bool,int)"), _A("A"), "A()")); - REQUIRE_THAT( - src, !HasCall(_A("tmain(bool,int)"), _A("A"), "operator+=(int)")); - REQUIRE_THAT(src, !HasCall(_A("A"), _A("A"), "add(int)")); - REQUIRE_THAT(src, - !HasCall(_A("tmain(bool,int)"), _A("A"), "operator=(const A &)")); - REQUIRE_THAT(src, !HasCall(_A("A"), _A("A"), "set(int)")); - REQUIRE_THAT(src, HasCall(_A("tmain(bool,int)"), _A("A"), "value()")); - REQUIRE_THAT(src, - !HasCall(_A("tmain(bool,int)::(lambda " - "../../tests/t20031/t20031.cc:47:26)"), - _A("zero()"), "")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - } -*/ - } \ No newline at end of file +} \ No newline at end of file diff --git a/tests/t20032/test_case.h b/tests/t20032/test_case.h index 5a52d3ea..88ec1dd3 100644 --- a/tests/t20032/test_case.h +++ b/tests/t20032/test_case.h @@ -37,83 +37,10 @@ TEST_CASE("t20032") {"A", "B", "double", Response{}}, // {"B", "tmain(int,char **)", "double", Response{}}, // - {"tmain(int,char **)", "B", "b(const char *)"}, // - {"B", "A", "a3(const char *)"}, // - {"A", "B", "const char *", Response{}}, // + {"tmain(int,char **)", "B", "b(const char *)"}, // + {"B", "A", "a3(const char *)"}, // + {"A", "B", "const char *", Response{}}, // {"B", "tmain(int,char **)", "const char *", Response{}} // })); }); - /* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - // Check if all calls exist - REQUIRE_THAT(src, HasCall(_A("tmain(int,char **)"), _A("B"), "b(int)")); - REQUIRE_THAT( - src, HasResponse(_A("tmain(int,char **)"), _A("B"), "int")); - - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a1(int)")); - REQUIRE_THAT(src, HasResponse(_A("B"), _A("A"), "int")); - - REQUIRE_THAT( - src, HasCall(_A("tmain(int,char **)"), _A("B"), "b(double)")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2(double)")); - REQUIRE_THAT(src, HasResponse(_A("B"), _A("A"), "double")); - - REQUIRE_THAT( - src, HasCall(_A("tmain(int,char **)"), _A("B"), "b(const char *)")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a3(const char *)")); - REQUIRE_THAT(src, HasResponse(_A("B"), _A("A"), "const char *")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - std::vector messages = { - FindMessage(j, "tmain(int,char **)", "B", "b(int)", "int"), - FindMessage(j, "B", "A", "a1(int)", "int"), - FindMessage(j, "tmain(int,char **)", "B", "b(double)"), - FindMessage(j, "B", "A", "a2(double)"), - FindMessage(j, "tmain(int,char **)", "B", "b(const char *)"), - FindMessage(j, "B", "A", "a3(const char *)")}; - - REQUIRE(std::is_sorted(messages.begin(), messages.end())); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - using mermaid::HasResponse; - - REQUIRE_THAT(src, HasCall(_A("tmain(int,char **)"), _A("B"), "b(int)")); - REQUIRE_THAT( - src, HasResponse(_A("tmain(int,char **)"), _A("B"), "int")); - - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a1(int)")); - REQUIRE_THAT(src, HasResponse(_A("B"), _A("A"), "int")); - - REQUIRE_THAT( - src, HasCall(_A("tmain(int,char **)"), _A("B"), "b(double)")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2(double)")); - REQUIRE_THAT(src, HasResponse(_A("B"), _A("A"), "double")); - - REQUIRE_THAT( - src, HasCall(_A("tmain(int,char **)"), _A("B"), "b(const char *)")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a3(const char *)")); - REQUIRE_THAT(src, HasResponse(_A("B"), _A("A"), "const char *")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - }*/ } \ No newline at end of file diff --git a/tests/t20033/test_case.h b/tests/t20033/test_case.h index 172f9076..83a483bc 100644 --- a/tests/t20033/test_case.h +++ b/tests/t20033/test_case.h @@ -52,50 +52,4 @@ TEST_CASE("t20033") {"tmain()", "A", "a4()"} // })); }); - /* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - // Check if all calls exist - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("A"), "a1()")); - REQUIRE_THAT( - src, HasCallInControlCondition(_A("tmain()"), _A("A"), "a2()")); - REQUIRE_THAT( - src, HasCallInControlCondition(_A("tmain()"), _A("A"), "a3()")); - REQUIRE_THAT( - src, HasCallInControlCondition(_A("tmain()"), _A("A"), "a4()")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - using mermaid::HasCallInControlCondition; - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("A"), "a1()")); - REQUIRE_THAT( - src, HasCallInControlCondition(_A("tmain()"), _A("A"), "a2()")); - REQUIRE_THAT( - src, HasCallInControlCondition(_A("tmain()"), _A("A"), "a3()")); - REQUIRE_THAT( - src, HasCallInControlCondition(_A("tmain()"), _A("A"), "a4()")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", - src); - }*/ } \ No newline at end of file diff --git a/tests/t20034/test_case.h b/tests/t20034/test_case.h index 49af0319..45d8ff59 100644 --- a/tests/t20034/test_case.h +++ b/tests/t20034/test_case.h @@ -68,75 +68,7 @@ TEST_CASE("t20034") {"C", "C", "c2()"}, // {"C", "B", "b2()"}, // {"B", "A", "a2()"} // - } // + } // })); }); - /* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - // Check if all calls exist - REQUIRE_THAT(src, HasCall(_A("D"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("D"), _A("C"), "c3()")); - REQUIRE_THAT(src, HasCall(_A("C"), _A("C"), "c2()")); - REQUIRE_THAT(src, HasCall(_A("C"), _A("B"), "b2()")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("D"), _A("C"), "c4()")); - - REQUIRE_THAT(src, !HasCall(_A("C"), _A("B"), "b3()")); - - save_puml(config.output_directory(), diagram->name + - ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - REQUIRE(HasMessageChain(j, - {{"d2()", "c3()", "void"}, {"c3()", "c2()", "void"}, - {"c2()", "b2()", "void"}, {"b2()", "a2()", - "void"}})); REQUIRE(HasMessageChain(j, - {{"d2()", "c4()", "void"}, {"c4()", "b4()", "void"}, - {"b4()", "b2()", "void"}, {"b2()", "a2()", - "void"}})); REQUIRE(HasMessageChain(j, {{"d2()", "a2()", - "void"}})); REQUIRE(HasMessageChain(j, - {{"d2()", "c1()", "void"}, {"c1()", "b1()", "void"}, - {"b1()", "a2()", "void"}})); - REQUIRE(HasMessageChain(j, - {{"d2()", "c2()", "void"}, {"c2()", "b2()", "void"}, - {"b2()", "a2()", "void"}})); - - save_json(config.output_directory(), diagram->name + - ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - - REQUIRE_THAT(src, HasCall(_A("D"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("D"), _A("C"), "c3()")); - REQUIRE_THAT(src, HasCall(_A("C"), _A("C"), "c2()")); - REQUIRE_THAT(src, HasCall(_A("C"), _A("B"), "b2()")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("D"), _A("C"), "c4()")); - - REQUIRE_THAT(src, !HasCall(_A("C"), _A("B"), "b3()")); - - save_mermaid(config.output_directory(), diagram->name + - ".mmd", src); - } - */ } \ No newline at end of file diff --git a/tests/t20035/test_case.h b/tests/t20035/test_case.h index d04ce96c..0549da2a 100644 --- a/tests/t20035/test_case.h +++ b/tests/t20035/test_case.h @@ -32,46 +32,4 @@ TEST_CASE("t20035") {"b1(int)", "c(int)", ""} // }})); }); - /* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, HasCall(_A("tmain(int,char **)"), _A("a(int)"), - "")); REQUIRE_THAT(src, HasCall(_A("a(int)"), _A("b1(int)"), "")); - REQUIRE_THAT(src, HasCall(_A("b1(int)"), _A("c(int)"), "")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - REQUIRE(HasMessageChain(j, - {{"tmain(int,char **)", "a(int)", "int"}, - {"a(int)", "b1(int)", "int"}, {"b1(int)", "c(int)", - "int"}})); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - - REQUIRE_THAT(src, HasCall(_A("tmain(int,char **)"), _A("a(int)"), - "")); REQUIRE_THAT(src, HasCall(_A("a(int)"), _A("b1(int)"), "")); - REQUIRE_THAT(src, HasCall(_A("b1(int)"), _A("c(int)"), "")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", - src); - } - */ } \ No newline at end of file diff --git a/tests/t20036/test_case.h b/tests/t20036/test_case.h index 27819a5a..a96a06f9 100644 --- a/tests/t20036/test_case.h +++ b/tests/t20036/test_case.h @@ -67,68 +67,4 @@ TEST_CASE("t20036") }, // })); }); - /* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, HasCall(_A("C"), _A("C"), "c2()")); - REQUIRE_THAT(src, HasCall(_A("C"), _A("B"), "b2()")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("C"), _A("B"), "b2()")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("D"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("C"), _A("B"), "b1()")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2()")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - REQUIRE(HasMessageChain(j, - {{"c3()", "c2()", "void"}, {"c2()", "b2()", "void"}, - {"b2()", "a2()", "void"}})); - REQUIRE(HasMessageChain( - j, {{"c4()", "b2()", "void"}, {"b2()", "a2()", "void"}})); - REQUIRE(HasMessageChain(j, {{"d3()", "a2()", "void"}})); - REQUIRE(HasMessageChain(j, - {{"d1()", "c2()", "void"}, {"c2()", "b2()", "void"}, - {"b2()", "a2()", "void"}})); - REQUIRE(HasMessageChain( - j, {{"c1()", "b1()", "void"}, {"b1()", "a2()", "void"}})); - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - - REQUIRE_THAT(src, HasCall(_A("C"), _A("C"), "c2()")); - REQUIRE_THAT(src, HasCall(_A("C"), _A("B"), "b2()")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("C"), _A("B"), "b2()")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("D"), _A("A"), "a2()")); - - REQUIRE_THAT(src, HasCall(_A("C"), _A("B"), "b1()")); - REQUIRE_THAT(src, HasCall(_A("B"), _A("A"), "a2()")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", - src); - }*/ } \ No newline at end of file diff --git a/tests/t20038/test_case.h b/tests/t20038/test_case.h index d5e9336c..33e01e7e 100644 --- a/tests/t20038/test_case.h +++ b/tests/t20038/test_case.h @@ -53,107 +53,4 @@ TEST_CASE("t20038") {"B", "A", "aaa()"}, // })); }); - /* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("B"), "b()")); - - REQUIRE_THAT(src, !HasCall(_A("tmain()"), _A("B"), "bb()")); - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("B"), "bbb()")); - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("B"), "bbbb()")); - - REQUIRE_THAT(src, - HasMessageComment(_A("tmain()"), - "This comment should be rendered only\\n" - "once")); - - REQUIRE_THAT(src, - HasCall(_A("tmain()"), _A("add_impl(double,double)"), - "")); - - REQUIRE_THAT( - src, HasMessageComment(_A("tmain()"), "What is 2 \\+ 2\\?")); - - REQUIRE_THAT(src, - !HasMessageComment( - _A("tmain()"), "This is specific for some_other_diagram")); - - REQUIRE_THAT( - src, HasMessageComment(_A("tmain()"), "Calling - B::bbbbb\\(\\)")); - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("B"), "bbbbb()")); - - REQUIRE_THAT(src, - HasMessageComment(_A("tmain()"), "This is a conditional - operator")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - using mermaid::HasCallInControlCondition; - using mermaid::HasMessageComment; - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("B"), "b()")); - - REQUIRE_THAT(src, !HasCall(_A("tmain()"), _A("B"), "bb()")); - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("B"), "bbb()")); - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("B"), "bbbb()")); - - REQUIRE_THAT(src, - HasMessageComment(_A("tmain()"), - "This comment should be rendered only
" - "once")); - - REQUIRE_THAT(src, - HasCall(_A("tmain()"), _A("add_impl(double,double)"), - "")); - - REQUIRE_THAT( - src, HasMessageComment(_A("tmain()"), "What is 2 \\+ 2\\?")); - - REQUIRE_THAT(src, - !HasMessageComment( - _A("tmain()"), "This is specific for some_other_diagram")); - - REQUIRE_THAT( - src, HasMessageComment(_A("tmain()"), "Calling - B::bbbbb\\(\\)")); - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("B"), "bbbbb()")); - - REQUIRE_THAT(src, - !HasMessageComment( - _A("tmain()"), "This is specific for some_other_diagram")); - - REQUIRE_THAT( - src, HasMessageComment(_A("tmain()"), "Calling - B::bbbbb\\(\\)")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", - src); - } - */ } \ No newline at end of file diff --git a/tests/t20039/test_case.h b/tests/t20039/test_case.h index 628bef51..88a011f6 100644 --- a/tests/t20039/test_case.h +++ b/tests/t20039/test_case.h @@ -31,54 +31,8 @@ TEST_CASE("t20039") {"R", "A", "a(int)"}, // {"R", "A", "a(int_vec_t)"}, // {"R", "A", "a(string_vec_t)"}, // - {"R", "A", "a(int_map_t)"}, // + {"R", "A", "a(int_map_t)"}, // {"R", "A", "a(string_map_t)"} // })); }); -/* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - // Check if all calls exist - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("R"), "run()")); - REQUIRE_THAT(src, HasCall(_A("R"), _A("A"), "a(int)")); - REQUIRE_THAT(src, HasCall(_A("R"), _A("A"), "a(int_vec_t)")); - REQUIRE_THAT( - src, HasCall(_A("R"), _A("A"), "a(string_vec_t)")); - REQUIRE_THAT(src, HasCall(_A("R"), _A("A"), "a(int_map_t)")); - REQUIRE_THAT( - src, HasCall(_A("R"), _A("A"), "a(string_map_t)")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - - REQUIRE_THAT(src, HasCall(_A("tmain()"), _A("R"), "run()")); - REQUIRE_THAT(src, HasCall(_A("R"), _A("A"), "a(int)")); - REQUIRE_THAT(src, HasCall(_A("R"), _A("A"), "a(int_vec_t)")); - REQUIRE_THAT( - src, HasCall(_A("R"), _A("A"), "a(string_vec_t)")); - REQUIRE_THAT(src, HasCall(_A("R"), _A("A"), "a(int_map_t)")); - REQUIRE_THAT( - src, HasCall(_A("R"), _A("A"), "a(string_map_t)")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", src); - }*/ } \ No newline at end of file diff --git a/tests/t20040/test_case.h b/tests/t20040/test_case.h index a9297bbd..87277908 100644 --- a/tests/t20040/test_case.h +++ b/tests/t20040/test_case.h @@ -45,66 +45,4 @@ TEST_CASE("t20040") {"print(int)", "print()", ""}, // })); }); - /* - { - auto src = generate_sequence_puml(diagram, *model); - AliasMatcher _A(src); - - REQUIRE_THAT(src, StartsWith("@startuml")); - REQUIRE_THAT(src, EndsWith("@enduml\n")); - - REQUIRE_THAT(src, - HasCall(_A("tmain()"), - _A("print(int,double,std::string)"), - "")); - - REQUIRE_THAT(src, - HasCall(_A("print(int,double,std::string)"), - _A("print(double,std::string)"), "")); - - REQUIRE_THAT(src, - HasCall(_A("print(double,std::string)"), - _A("print(std::string)"), "")); - - REQUIRE_THAT(src, - HasCall(_A("print(std::string)"), _A("print()"), - "")); - - save_puml(config.output_directory(), diagram->name + ".puml", src); - } - - { - auto j = generate_sequence_json(diagram, *model); - - using namespace json; - - save_json(config.output_directory(), diagram->name + ".json", j); - } - - { - auto src = generate_sequence_mermaid(diagram, *model); - - mermaid::SequenceDiagramAliasMatcher _A(src); - using mermaid::HasCall; - - REQUIRE_THAT(src, - HasCall(_A("tmain()"), - _A("print(int,double,std::string)"), - "")); - - REQUIRE_THAT(src, - HasCall(_A("print(int,double,std::string)"), - _A("print(double,std::string)"), "")); - - REQUIRE_THAT(src, - HasCall(_A("print(double,std::string)"), - _A("print(std::string)"), "")); - - REQUIRE_THAT(src, - HasCall(_A("print(std::string)"), _A("print()"), - "")); - - save_mermaid(config.output_directory(), diagram->name + ".mmd", - src); - }*/ } \ No newline at end of file diff --git a/tests/t20046/test_case.h b/tests/t20046/test_case.h index 89d328ff..3e7d293a 100644 --- a/tests/t20046/test_case.h +++ b/tests/t20046/test_case.h @@ -49,8 +49,7 @@ TEST_CASE("t20046") "t20046.cc:19:34)", "operator()(auto &&) const"}, // {"tmain()::(lambda t20046.cc:19:9)::(lambda t20046.cc:19:34)", - "a3(int)", ""} - + "a3(int)", ""} // })); }); } \ No newline at end of file diff --git a/tests/t20047/test_case.h b/tests/t20047/test_case.h index ab0e68f2..34b7b155 100644 --- a/tests/t20047/test_case.h +++ b/tests/t20047/test_case.h @@ -33,7 +33,6 @@ TEST_CASE("t20047") {"tmain()", "a4(int)", ""}, // {"tmain()", "a5(int)", ""}, // {"tmain()", "a6(int)", ""}, // - })); }); } \ No newline at end of file diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 6ac3872e..845b3df3 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -121,42 +121,6 @@ auto render_diagram( return ss.str(); } } -// -// template -// auto generate_diagram_json( -// std::shared_ptr config, DiagramModel &model) -//{ -// using diagram_config = DiagramConfig; -// using diagram_model = DiagramModel; -// using diagram_generator = -// typename clanguml::common::generators::diagram_generator_t< -// DiagramConfig, -// clanguml::common::generators::json_generator_tag>::type; -// -// std::stringstream ss; -// -// ss << diagram_generator(dynamic_cast(*config), model); -// -// return nlohmann::json::parse(ss.str()); -//} -// -// template -// auto generate_diagram_mermaid( -// std::shared_ptr config, DiagramModel &model) -//{ -// using diagram_config = DiagramConfig; -// using diagram_model = DiagramModel; -// using diagram_generator = -// typename clanguml::common::generators::diagram_generator_t< -// DiagramConfig, -// clanguml::common::generators::mermaid_generator_tag>::type; -// -// std::stringstream ss; -// -// ss << diagram_generator(dynamic_cast(*config), model); -// -// return ss.str(); -//} } // namespace detail /// @@ -198,109 +162,6 @@ generate_include_diagram(clanguml::common::compilation_database &db, /// }@ -/// -/// @defgroup Diagram renderers -/// @{ -/// -/* -template -std::string render_class_diagram( - std::shared_ptr config, - clanguml::class_diagram::model::diagram &model) -{ - return detail::generate_diagram(config, model); -} - -std::string render_sequence_diagram( - std::shared_ptr config, - clanguml::sequence_diagram::model::diagram &model) -{ - return detail::generate_diagram_puml( - config, model); -} - -std::string generate_package_puml( - std::shared_ptr config, - clanguml::package_diagram::model::diagram &model) -{ - return detail::generate_diagram_puml( - config, model); -} - -std::string generate_include_puml( - std::shared_ptr config, - clanguml::include_diagram::model::diagram &model) -{ - return detail::generate_diagram_puml( - config, model); -} - -nlohmann::json generate_class_json( - std::shared_ptr config, - clanguml::class_diagram::model::diagram &model) -{ - return detail::generate_diagram_json( - config, model); -} - -nlohmann::json generate_sequence_json( - std::shared_ptr config, - clanguml::sequence_diagram::model::diagram &model) -{ - return detail::generate_diagram_json( - config, model); -} - -nlohmann::json generate_package_json( - std::shared_ptr config, - clanguml::package_diagram::model::diagram &model) -{ - return detail::generate_diagram_json( - config, model); -} - -nlohmann::json generate_include_json( - std::shared_ptr config, - clanguml::include_diagram::model::diagram &model) -{ - return detail::generate_diagram_json( - config, model); -} - -std::string generate_class_mermaid( - std::shared_ptr config, - clanguml::class_diagram::model::diagram &model) -{ - return detail::generate_diagram_mermaid( - config, model); -} - -std::string generate_sequence_mermaid( - std::shared_ptr config, - clanguml::sequence_diagram::model::diagram &model) -{ - return detail::generate_diagram_mermaid( - config, model); -} - -std::string generate_package_mermaid( - std::shared_ptr config, - clanguml::package_diagram::model::diagram &model) -{ - return detail::generate_diagram_mermaid( - config, model); -} - -std::string generate_include_mermaid( - std::shared_ptr config, - clanguml::include_diagram::model::diagram &model) -{ - return detail::generate_diagram_mermaid( - config, model); -} -*/ - template void save_diagram(const std::filesystem::path &path, const T &diagram) { @@ -592,495 +453,6 @@ void CHECK_INCLUDE_DIAGRAM(const clanguml::config::config &config, } } // namespace clanguml::test -/* -template <> -plantuml_t render_class_diagram( - std::shared_ptr c, - clanguml::class_diagram::model::diagram &d) -{ - return detail::generate_diagram_puml(c, d); -} - -template <> -mermaid_t render_class_diagram( - std::shared_ptr c, - clanguml::class_diagram::model::diagram &d) -{ - return generate_class_mermaid(c, d); -} - -template <> -json_t render_class_diagram( - std::shared_ptr c, - clanguml::class_diagram::model::diagram &d) -{ - return generate_class_json(c, d); -} - -template <> -DiagramType render_sequence_diagram( - std::shared_ptr c, - clanguml::sequence_diagram::model::diagram &model); - -template -DiagramType render_package_diagram(std::shared_ptr c, - clanguml::package_diagram::model::diagram &model); - -template -DiagramType render_include_diagram(std::shared_ptr c, - clanguml::include_diagram::model::diagram &model); - -} -*/ -// using namespace clanguml::test::matchers; - -/* - - -namespace detail { -template -auto generate_diagram_impl(clanguml::common::compilation_database &db, - std::shared_ptr diagram) -{ - LOG_INFO("All paths will be evaluated relative to {}", - diagram->root_directory().string()); - - using diagram_config = DiagramConfig; - using diagram_model = - typename clanguml::common::generators::diagram_model_t< - diagram_config>::type; - using diagram_visitor = - typename clanguml::common::generators::diagram_visitor_t< - diagram_config>::type; - - inject_diagram_options(diagram); - - auto model = clanguml::common::generators::generate(db, diagram->name, - dynamic_cast(*diagram), - diagram->get_translation_units()); - - return model; -} - -template -auto generate_diagram_puml( - std::shared_ptr config, DiagramModel &model) -{ - using diagram_config = DiagramConfig; - using diagram_model = DiagramModel; - using diagram_generator = - typename clanguml::common::generators::diagram_generator_t< - DiagramConfig, - clanguml::common::generators::plantuml_generator_tag>::type; - - std::stringstream ss; - - ss << diagram_generator(dynamic_cast(*config), model); - - return ss.str(); -} - -template -auto generate_diagram_json( - std::shared_ptr config, DiagramModel &model) -{ - using diagram_config = DiagramConfig; - using diagram_model = DiagramModel; - using diagram_generator = - typename clanguml::common::generators::diagram_generator_t< - DiagramConfig, - clanguml::common::generators::json_generator_tag>::type; - - std::stringstream ss; - - ss << diagram_generator(dynamic_cast(*config), model); - - return nlohmann::json::parse(ss.str()); -} - -template -auto generate_diagram_mermaid( - std::shared_ptr config, DiagramModel &model) -{ - using diagram_config = DiagramConfig; - using diagram_model = DiagramModel; - using diagram_generator = - typename clanguml::common::generators::diagram_generator_t< - DiagramConfig, - clanguml::common::generators::mermaid_generator_tag>::type; - - std::stringstream ss; - - ss << diagram_generator(dynamic_cast(*config), model); - - return ss.str(); -} -} - -std::unique_ptr generate_class_diagram( - clanguml::common::compilation_database &db, - std::shared_ptr diagram) -{ - return detail::generate_diagram_impl( - db, diagram); -} - -std::unique_ptr -generate_sequence_diagram(clanguml::common::compilation_database &db, - std::shared_ptr diagram) -{ - return detail::generate_diagram_impl( - db, diagram); -} - -std::unique_ptr -generate_package_diagram(clanguml::common::compilation_database &db, - std::shared_ptr diagram) -{ - return detail::generate_diagram_impl( - db, diagram); -} - -std::unique_ptr -generate_include_diagram(clanguml::common::compilation_database &db, - std::shared_ptr diagram) -{ - return detail::generate_diagram_impl( - db, diagram); -} - -std::string generate_class_puml( - std::shared_ptr config, - clanguml::class_diagram::model::diagram &model) -{ - return detail::generate_diagram_puml( - config, model); -} - -std::string generate_sequence_puml( - std::shared_ptr config, - clanguml::sequence_diagram::model::diagram &model) -{ - return detail::generate_diagram_puml( - config, model); -} - -std::string generate_package_puml( - std::shared_ptr config, - clanguml::package_diagram::model::diagram &model) -{ - return detail::generate_diagram_puml( - config, model); -} - -std::string generate_include_puml( - std::shared_ptr config, - clanguml::include_diagram::model::diagram &model) -{ - return detail::generate_diagram_puml( - config, model); -} - -nlohmann::json generate_class_json( - std::shared_ptr config, - clanguml::class_diagram::model::diagram &model) -{ - return detail::generate_diagram_json( - config, model); -} - -nlohmann::json generate_sequence_json( - std::shared_ptr config, - clanguml::sequence_diagram::model::diagram &model) -{ - return detail::generate_diagram_json( - config, model); -} - -nlohmann::json generate_package_json( - std::shared_ptr config, - clanguml::package_diagram::model::diagram &model) -{ - return detail::generate_diagram_json( - config, model); -} - -nlohmann::json generate_include_json( - std::shared_ptr config, - clanguml::include_diagram::model::diagram &model) -{ - return detail::generate_diagram_json( - config, model); -} - -std::string generate_class_mermaid( - std::shared_ptr config, - clanguml::class_diagram::model::diagram &model) -{ - return detail::generate_diagram_mermaid( - config, model); -} - -std::string generate_sequence_mermaid( - std::shared_ptr config, - clanguml::sequence_diagram::model::diagram &model) -{ - return detail::generate_diagram_mermaid( - config, model); -} - -std::string generate_package_mermaid( - std::shared_ptr config, - clanguml::package_diagram::model::diagram &model) -{ - return detail::generate_diagram_mermaid( - config, model); -} - -std::string generate_include_mermaid( - std::shared_ptr config, - clanguml::include_diagram::model::diagram &model) -{ - return detail::generate_diagram_mermaid( - config, model); -} - -template -void save_diagram(const std::filesystem::path &path, const T &diagram) -{ - static_assert( - std::is_same_v || std::is_same_v); - - std::filesystem::create_directories(path.parent_path()); - std::ofstream ofs; - ofs.open(path, std::ofstream::out | std::ofstream::trunc); - if constexpr (std::is_same_v) { - ofs << std::setw(2) << diagram; - } - else { - ofs << diagram; - } - - ofs.close(); -} - -void save_puml(const std::string &path, const std::string &filename, - const std::string &puml) -{ - std::filesystem::path p{path}; - p /= filename; - save_diagram(p, puml); -} - -void save_json(const std::string &path, const std::string &filename, - const nlohmann::json &j) -{ - std::filesystem::path p{path}; - p /= filename; - save_diagram(p, j); -} - -void save_mermaid(const std::string &path, const std::string &filename, - const std::string &mmd) -{ - std::filesystem::path p{path}; - p /= filename; - save_diagram(p, mmd); -} - -namespace clanguml::test { - -template struct test_traits; - -// function pointer -template -struct test_traits : public test_traits { }; - -template struct test_traits { - using return_type = R; - - static constexpr std::size_t arity = sizeof...(Args); - - template struct argument { - static_assert(N < arity, "error: invalid parameter index."); - using type = typename std::tuple_element>::type; - }; -}; - -struct diagram_source_storage { - diagram_source_storage(plantuml_t &&p, json_t &&j, mermaid_t &&m) - : plantuml{std::move(p)} - , json{std::move(j)} - , mermaid{std::move(m)} - { - } - - template const T &get() const; - - plantuml_t plantuml; - json_t json; - mermaid_t mermaid; -}; - -template <> const plantuml_t &diagram_source_storage::get() const -{ - return plantuml; -} - -template <> const json_t &diagram_source_storage::get() const -{ - return json; -} - -template <> const mermaid_t &diagram_source_storage::get() const -{ - return mermaid; -} - -template -void CHECK_CLASS_DIAGRAM_IMPL( - const diagram_source_storage &diagrams, TC &&tc, TCs &&...tcs) -{ - if constexpr (std::is_invocable_v) { - tc(diagrams.get()); - } - if constexpr (std::is_invocable_v) { - tc(diagrams.get()); - } - if constexpr (std::is_invocable_v) { - tc(diagrams.get()); - } - if constexpr (sizeof...(tcs) > 0) { - CHECK_CLASS_DIAGRAM_IMPL(diagrams, std::forward(tcs)...); - } -} - -template -void CHECK_CLASS_DIAGRAM( - DiagramConfig diagram, DiagramModel &model, TCs &&...tcs) -{ - diagram_source_storage diagram_sources{ - render_class_diagram(diagram, model), - render_class_diagram(diagram, model), - render_class_diagram(diagram, model)}; - - CHECK_CLASS_DIAGRAM_IMPL(diagram_sources, std::forward(tcs)...); -} - -// -// PlantUML test helpers -// -template <> -plantuml_t render_class_diagram( - std::shared_ptr c, - clanguml::class_diagram::model::diagram &d) -{ - return generate_class_puml(c, d); -} - -template <> bool IsClass(plantuml_t d, std::string name) -{ - return util::contains(d.src, fmt::format("class {}", name)); -} - -// -// MermaidJS test helpers -// -template <> -mermaid_t render_class_diagram( - std::shared_ptr c, - clanguml::class_diagram::model::diagram &d) -{ - return generate_class_mermaid(c, d); -} - -template <> bool IsClass(mermaid_t d, std::string name) -{ - return util::contains(d.src, fmt::format("class {}", name)); -} - -// -// JSON test helpers -// -struct File { - explicit File(const std::string &f) - : file{f} - { - } - - const std::string file; -}; - -std::optional get_element_by_id( - const nlohmann::json &j, const std::string &id) -{ - if (!j.contains("elements")) - return {}; - - for (const nlohmann::json &e : j["elements"]) { - if (e["id"] == id) - return {e}; - - if (e["type"] == "namespace" || e["type"] == "folder") { - auto maybe_e = get_element_by_id(e, id); - if (maybe_e) - return maybe_e; - } - } - - return {}; -} - -std::optional get_element( - const nlohmann::json &j, const std::string &name) -{ - if (!j.contains("elements")) - return {}; - - for (const nlohmann::json &e : j["elements"]) { - if (e["display_name"] == name) - return {e}; - - if (e["type"] == "namespace" || e["type"] == "folder" || - e["type"] == "directory" || e["type"] == "module") { - auto maybe_e = get_element(e, name); - if (maybe_e) - return maybe_e; - } - } - - return {}; -} - -std::optional get_element( - const json_t &src, const std::string &name) -{ - return get_element(src.src, name); -} - -std::string expand_name(const nlohmann::json &j, const std::string &name) -{ - return name; -} - -template <> -json_t render_class_diagram( - std::shared_ptr c, - clanguml::class_diagram::model::diagram &d) -{ - return generate_class_json(c, d); -} - -template <> bool IsClass(json_t d, std::string name) -{ - auto e = get_element(d.src, expand_name(d.src, name)); - return e && e->at("type") == "class"; -} -} -} - - */ /// /// Class diagram tests /// @@ -1186,7 +558,6 @@ template <> bool IsClass(json_t d, std::string name) #include "t20005/test_case.h" #endif #include "t20006/test_case.h" - #include "t20007/test_case.h" #include "t20008/test_case.h" #include "t20009/test_case.h" diff --git a/tests/test_cases.h b/tests/test_cases.h index e4d3fccd..60c2b4c0 100644 --- a/tests/test_cases.h +++ b/tests/test_cases.h @@ -51,7 +51,7 @@ using namespace clanguml::util; std::pair load_config(const std::string &test_name); -void save_puml(const std::string &path, const std::string &puml); +//void save_puml(const std::string &path, const std::string &puml); namespace clanguml::test { @@ -2562,1635 +2562,4 @@ bool IsParticipant( return p && (p->at("type") == type); } -} - -/* -namespace clanguml { -namespace test { -namespace matchers { - -using Catch::CaseSensitive; -using Catch::Matchers::StdString::CasedString; -using Catch::Matchers::StdString::ContainsMatcher; -using Catch::Matchers::StdString::RegexMatcher; - -using Catch::Matchers::Contains; -using Catch::Matchers::EndsWith; -using Catch::Matchers::Equals; -using Catch::Matchers::Matches; -using Catch::Matchers::StartsWith; -using Catch::Matchers::VectorContains; - -struct JsonMatcherBase : Catch::MatcherBase { - JsonMatcherBase( - std::string const &operation, CasedString const &comparator); - std::string describe() const override; - - CasedString m_comparator; - std::string m_operation; -}; - -template constexpr bool has_type() noexcept -{ - return (std::is_same_v || ... || false); -} - -struct Public { }; - -struct Protected { }; - -struct Private { }; - -struct Abstract { }; - -struct Static { }; - -struct Const { }; - -struct Constexpr { }; - -struct Consteval { }; - -struct Coroutine { }; - -struct Noexcept { }; - -struct Default { }; - -struct Deleted { }; - -struct HasCallWithResultMatcher : ContainsMatcher { - HasCallWithResultMatcher( - CasedString const &comparator, CasedString const &resultComparator) - : ContainsMatcher(comparator) - , m_resultComparator{resultComparator} - { - } - - bool match(std::string const &source) const override - { - return Catch::contains( - m_comparator.adjustString(source), m_comparator.m_str) && - Catch::contains( - m_comparator.adjustString(source), m_resultComparator.m_str); - } - - CasedString m_resultComparator; -}; - -template class HasCallMatcher : public Catch::MatcherBase { - T m_from, m_to, m_message; - bool m_is_response; - std::string m_call_arrow, m_return_arrow; - std::string call_pattern, response_pattern; - -public: - HasCallMatcher(T from, T to, T message, bool is_response = false, - const std::string &call_arrow = "->", - const std::string &return_arrow = "-->") - : m_from(from) - , m_to{to} - , m_message{message} - , m_is_response{is_response} - , m_call_arrow{call_arrow} - , m_return_arrow{return_arrow} - { - util::replace_all(m_message, "(", "\\("); - util::replace_all(m_message, ")", "\\)"); - util::replace_all(m_message, "*", "\\*"); - util::replace_all(m_message, "[", "\\["); - util::replace_all(m_message, "]", "\\]"); - util::replace_all(m_message, "+", "\\+"); - - call_pattern = fmt::format("{} {} {} " - "(\\[\\[.*\\]\\] )?: {}", - m_from, m_call_arrow, m_to, m_message); - - response_pattern = fmt::format( - "{} {} {} : //{}//", m_from, m_return_arrow, m_to, m_message); - } - - bool match(T const &in) const override - { - std::regex r{m_is_response ? response_pattern : call_pattern}; - std::smatch base_match; - std::regex_search(in, base_match, r); - if (base_match.size() > 0) - return true; - - return false; - } - - std::string describe() const override - { - std::ostringstream ss; - ss << "has call " - << fmt::format( - "{} {} {} : {}", m_from, m_call_arrow, m_to, m_message); - return ss.str(); - } -}; - -auto HasCall(std::string const &from, std::string const &to, - std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return HasCallMatcher(from, to, message, false); -} - -auto HasResponse(std::string const &from, std::string const &to, - std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return HasCallMatcher(to, from, message, true); -} - -auto HasCallInControlCondition(std::string const &from, std::string const &to, - std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return HasCallMatcher(from, to, fmt::format("**[**{}**]**", message)); -} - -auto HasCall(std::string const &from, std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return HasCall(from, from, message, caseSensitivity); -} - -namespace mermaid { -template class HasCallMatcher : public Catch::MatcherBase { - T m_from, m_to, m_message; - bool m_is_response; - std::string m_call_arrow, m_return_arrow; - std::string call_pattern, response_pattern; - -public: - HasCallMatcher(T from, T to, T message, bool is_response = false, - const std::string &call_arrow = "->>", - const std::string &return_arrow = "-->>") - : m_from(from) - , m_to{to} - , m_message{message} - , m_is_response{is_response} - , m_call_arrow{call_arrow} - , m_return_arrow{return_arrow} - { - util::replace_all(m_message, "(", "\\("); - util::replace_all(m_message, ")", "\\)"); - util::replace_all(m_message, "*", "\\*"); - util::replace_all(m_message, "[", "\\["); - util::replace_all(m_message, "]", "\\]"); - util::replace_all(m_message, "+", "\\+"); - - call_pattern = - fmt::format("{} {} {} : {}", m_from, m_call_arrow, m_to, m_message); - - response_pattern = fmt::format( - "{} {} {} : {}", m_from, m_return_arrow, m_to, m_message); - } - - bool match(T const &in) const override - { - std::regex r{m_is_response ? response_pattern : call_pattern}; - std::smatch base_match; - std::regex_search(in, base_match, r); - if (base_match.size() > 0) - return true; - - return false; - } - - std::string describe() const override - { - std::ostringstream ss; - ss << "has call " - << fmt::format( - "{} {} {} : {}", m_from, m_call_arrow, m_to, m_message); - return ss.str(); - } -}; - -auto HasCall(std::string const &from, std::string const &to, - std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return mermaid::HasCallMatcher(from, to, message, false); -} - -auto HasCallInControlCondition(std::string const &from, std::string const &to, - std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return mermaid::HasCallMatcher(from, to, fmt::format("[{}]", message)); -} - -auto HasResponse(std::string const &from, std::string const &to, - std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return HasCallMatcher(to, from, message, true, "->>", "-->>"); -} - -auto HasCall(std::string const &from, std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return mermaid::HasCall(from, from, message, caseSensitivity); -} -} - -ContainsMatcher HasEntrypoint(std::string const &to, std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("[-> {} : {}", to, message), caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher HasEntrypoint(std::string const &to, std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("* ->> {} : {}", to, message), caseSensitivity)); -} -} - -ContainsMatcher HasExitpoint(std::string const &to, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("[<-- {}", to), caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher HasExitpoint(std::string const &to, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("{} -->> *", to), caseSensitivity)); -} -} - -std::string _NS(std::string_view s) -{ - return fmt::format( - "clanguml::{}::{}", Catch::getResultCapture().getCurrentTestName(), s); -} - -class NamespaceWrapper { - -private: -}; - -struct AliasMatcher { - AliasMatcher(const std::string &puml_) - : puml{split(puml_, "\n")} - { - } - - std::string operator()(std::string name) - { - std::vector patterns; - - const std::string alias_regex("([A-Z]_[0-9]+)"); - - util::replace_all(name, "(", "\\("); - util::replace_all(name, ")", "\\)"); - util::replace_all(name, " ", "\\s"); - util::replace_all(name, "*", "\\*"); - util::replace_all(name, "[", "\\["); - util::replace_all(name, "]", "\\]"); - - patterns.push_back( - std::regex{"class\\s\"" + name + "\"\\sas\\s" + alias_regex}); - patterns.push_back( - std::regex{"abstract\\s\"" + name + "\"\\sas\\s" + alias_regex}); - patterns.push_back( - std::regex{"enum\\s\"" + name + "\"\\sas\\s" + alias_regex}); - patterns.push_back( - std::regex{"package\\s\"" + name + "\"\\sas\\s" + alias_regex}); - patterns.push_back( - std::regex{"package\\s\\[" + name + "\\]\\sas\\s" + alias_regex}); - patterns.push_back( - std::regex{"file\\s\"" + name + "\"\\sas\\s" + alias_regex}); - patterns.push_back( - std::regex{"folder\\s\"" + name + "\"\\sas\\s" + alias_regex}); - patterns.push_back( - std::regex{"participant\\s\"" + name + "\"\\sas\\s" + alias_regex}); - - std::smatch base_match; - - for (const auto &line : puml) { - for (const auto &pattern : patterns) { - if (std::regex_search(line, base_match, pattern) && - base_match.size() == 2) { - std::ssub_match base_sub_match = base_match[1]; - std::string alias = base_sub_match.str(); - return trim(alias); - } - } - } - - return fmt::format("__INVALID__ALIAS__({})", name); - } - - const std::vector puml; -}; - -namespace mermaid { -struct AliasMatcher { - AliasMatcher(const std::string &mmd_) - : mmd{split(mmd_, "\n")} - { - } - - std::string operator()(std::string name) - { - std::vector patterns; - - const std::string alias_regex("([A-Z]_[0-9]+)"); - - util::replace_all(name, "(", "("); - util::replace_all(name, ")", ")"); - util::replace_all(name, " ", "\\s"); - util::replace_all(name, "*", "\\*"); - util::replace_all(name, "[", "\\["); - util::replace_all(name, "]", "\\]"); - util::replace_all(name, "<", "<"); - util::replace_all(name, ">", ">"); - - patterns.push_back( - std::regex{"class\\s" + alias_regex + "\\[\"" + name + "\"\\]"}); - patterns.push_back( - std::regex{"subgraph\\s" + alias_regex + "\\[" + name + "\\]"}); - patterns.push_back( - std::regex{"\\s\\s" + alias_regex + "\\[" + name + "\\]"}); // file - - std::smatch base_match; - - for (const auto &line : mmd) { - for (const auto &pattern : patterns) { - if (std::regex_search(line, base_match, pattern) && - base_match.size() == 2) { - std::ssub_match base_sub_match = base_match[1]; - std::string alias = base_sub_match.str(); - return trim(alias); - } - } - } - - return "__INVALID__ALIAS__"; - } - - const std::vector mmd; -}; - -struct SequenceDiagramAliasMatcher { - SequenceDiagramAliasMatcher(const std::string &mmd_) - : mmd{split(mmd_, "\n")} - { - } - - std::string operator()(std::string name) - { - std::vector patterns; - - const std::string alias_regex("([A-Z]_[0-9]+)"); - - util::replace_all(name, "(", "\\("); - util::replace_all(name, ")", "\\)"); - util::replace_all(name, " ", "\\s"); - util::replace_all(name, "*", "\\*"); - util::replace_all(name, "[", "\\["); - util::replace_all(name, "]", "\\]"); - - patterns.push_back( - std::regex{"participant\\s" + alias_regex + "\\sas\\s" + name}); - - std::smatch base_match; - - for (const auto &line : mmd) { - for (const auto &pattern : patterns) { - if (std::regex_search(line, base_match, pattern) && - base_match.size() == 2) { - std::ssub_match base_sub_match = base_match[1]; - std::string alias = base_sub_match.str(); - return trim(alias); - } - } - } - - return "__INVALID__ALIAS__"; - } - - const std::vector mmd; -}; -} - -ContainsMatcher HasTitle(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString("title " + str, caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher HasTitle(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString("title: " + str, caseSensitivity)); -} -} - -ContainsMatcher IsClass(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString("class " + str, caseSensitivity)); -} - -namespace mermaid { -auto IsClass(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString("class " + str, caseSensitivity)); -} -} - -ContainsMatcher IsUnion(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString("class " + str + " <>", caseSensitivity)); -} - -namespace mermaid { -auto IsUnion(std::string const &alias, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return Catch::Matchers::Matches( - std::string("class ") + alias + " \\{\\n\\s+<>", - caseSensitivity); -} -} - -ContainsMatcher IsClassTemplate(std::string const &str, - std::string const &tmplt, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("class \"{}<{}>\"", str, tmplt), caseSensitivity)); -} - -ContainsMatcher IsConcept(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString("class " + str + " <>", caseSensitivity)); -} - -namespace mermaid { -auto IsConcept(std::string const &alias, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return Catch::Matchers::Matches( - std::string("class ") + alias + " \\{\\n\\s+<>", - caseSensitivity); -} -} - -ContainsMatcher IsEnum(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString("enum " + str, caseSensitivity)); -} - -namespace mermaid { -auto IsEnum(std::string const &alias, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return Catch::Matchers::Matches( - std::string("class ") + alias + " \\{\\n\\s+<>", - caseSensitivity); -} -} - -ContainsMatcher IsAbstractClass(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString("abstract " + str, caseSensitivity)); -} - -namespace mermaid { -auto IsAbstractClass(std::string const &alias, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return Catch::Matchers::Matches( - std::string("class ") + alias + " \\{\\n\\s+<>", - caseSensitivity); -} -} - -ContainsMatcher IsAbstractClassTemplate(std::string const &str, - std::string const &tmplt, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("abstract \"{}<{}>\"", str, tmplt), caseSensitivity)); -} - -ContainsMatcher IsBaseClass(std::string const &base, std::string const &sub, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString(base + " <|-- " + sub, caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher IsBaseClass(std::string const &base, std::string const &sub, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString(base + " <|-- " + sub, caseSensitivity)); -} -} - -ContainsMatcher IsInnerClass(std::string const &parent, - std::string const &inner, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(inner + " --+ " + parent, caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher IsInnerClass(std::string const &parent, - std::string const &inner, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(parent + " ()-- " + inner + " : ", caseSensitivity)); -} -} - -ContainsMatcher IsAssociation(std::string const &from, std::string const &to, - std::string const &label = "", std::string multiplicity_source = "", - std::string multiplicity_dest = "", std::string style = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - std::string format_string = "{}"; - if (!multiplicity_source.empty()) - format_string += " \"" + multiplicity_source + "\""; - - format_string += fmt::format(" -{}->", style); - - if (!multiplicity_dest.empty()) - format_string += " \"" + multiplicity_dest + "\""; - - format_string += " {}"; - - if (!label.empty()) { - format_string += " : {}"; - return ContainsMatcher(CasedString( - fmt::format(fmt::runtime(format_string), from, to, label), - caseSensitivity)); - } - else - return ContainsMatcher( - CasedString(fmt::format(fmt::runtime(format_string), from, to), - caseSensitivity)); -} - -ContainsMatcher IsComposition(std::string const &from, std::string const &to, - std::string const &label, std::string multiplicity_source = "", - std::string multiplicity_dest = "", std::string style = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - std::string format_string = "{}"; - if (!multiplicity_source.empty()) - format_string += " \"" + multiplicity_source + "\""; - - format_string += fmt::format(" *-{}-", style); - - if (!multiplicity_dest.empty()) - format_string += " \"" + multiplicity_dest + "\""; - - format_string += " {} : {}"; - - return ContainsMatcher( - CasedString(fmt::format(fmt::runtime(format_string), from, to, label), - caseSensitivity)); -} - -ContainsMatcher IsAggregation(std::string const &from, std::string const &to, - std::string const &label, std::string multiplicity_source = "", - std::string multiplicity_dest = "", std::string style = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - std::string format_string = "{}"; - if (!multiplicity_source.empty()) - format_string += " \"" + multiplicity_source + "\""; - - format_string += fmt::format(" o-{}-", style); - - if (!multiplicity_dest.empty()) - format_string += " \"" + multiplicity_dest + "\""; - - format_string += " {} : {}"; - - return ContainsMatcher( - CasedString(fmt::format(fmt::runtime(format_string), from, to, label), - caseSensitivity)); -} - -ContainsMatcher IsInstantiation(std::string const &from, std::string const &to, - std::string style = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("{} .{}.|> {}", to, style, from), caseSensitivity)); -} - -ContainsMatcher IsDependency(std::string const &from, std::string const &to, - std::string style = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("{} .{}.> {}", from, style, to), caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher IsPackageDependency(std::string const &from, - std::string const &to, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("{} -.-> {}", from, to), caseSensitivity)); -} -ContainsMatcher IsIncludeDependency(std::string const &from, - std::string const &to, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("{} -.-> {}", from, to), caseSensitivity)); -} -} - -ContainsMatcher IsConstraint(std::string const &from, std::string const &to, - std::string const &label = {}, std::string style = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - if (label.empty()) - return ContainsMatcher(CasedString( - fmt::format("{} .{}.> {}", from, style, to), caseSensitivity)); - else - return ContainsMatcher( - CasedString(fmt::format("{} .{}.> {} : {}", from, style, to, label), - caseSensitivity)); -} - -ContainsMatcher IsConceptRequirement(std::string const &cpt, - std::string const &requirement, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString(requirement, caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher IsConstraint(std::string const &from, std::string const &to, - std::string label = {}, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - util::replace_all(label, "<", "<"); - util::replace_all(label, ">", ">"); - util::replace_all(label, "(", "("); - util::replace_all(label, ")", ") - util::replace_all(label, "##", "::"); - util::replace_all(label, "{", "{"); - util::replace_all(label, "}", "}"); - - if (label.empty()) - return ContainsMatcher( - CasedString(fmt::format("{} ..> {}", from, to), caseSensitivity)); - else - return ContainsMatcher(CasedString( - fmt::format("{} ..> {} : {}", from, to, label), caseSensitivity)); -} - -ContainsMatcher IsConceptRequirement(std::string const &cpt, - std::string requirement, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - util::replace_all(requirement, "<", "<"); - util::replace_all(requirement, ">", ">"); - util::replace_all(requirement, "(", "("); - util::replace_all(requirement, ")", ")"); - util::replace_all(requirement, "##", "::"); - util::replace_all(requirement, "{", "{"); - util::replace_all(requirement, "}", "}"); - - return ContainsMatcher(CasedString(requirement, caseSensitivity)); -} -} - -ContainsMatcher IsLayoutHint(std::string const &from, std::string const &hint, - std::string const &to, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("{} -[hidden]{}- {}", from, hint, to), caseSensitivity)); -} - -ContainsMatcher HasComment(std::string const &comment, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("' {}", comment), caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher HasComment(std::string const &comment, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("%% {}", comment), caseSensitivity)); -} -} - -ContainsMatcher HasNote(std::string const &cls, std::string const &position, - std::string const ¬e = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("note {} of {}", position, cls), caseSensitivity)); -} - -auto HasMessageComment(std::string const &alias, std::string const ¬e, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return Catch::Matchers::Matches( - std::string("note over ") + alias + "\\n" + note + "\\n" + "end note", - caseSensitivity); -} - -namespace mermaid { -auto HasMessageComment(std::string const &alias, std::string const ¬e, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return Catch::Matchers::Matches( - std::string("note over ") + alias + ": " + note, caseSensitivity); -} - -ContainsMatcher HasNote(std::string const &cls, - std::string const &position = "", std::string const ¬e = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("note for {}", cls), caseSensitivity)); -} -ContainsMatcher HasPackageNote(std::string const &cls, - std::string const &position = "", std::string const ¬e = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("-.- {}", cls), caseSensitivity)); -} -} - -ContainsMatcher HasMemberNote(std::string const &cls, std::string const &member, - std::string const &position, std::string const ¬e = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("note {} of {}::{}", position, cls, member), - caseSensitivity)); -} - -ContainsMatcher HasLink(std::string const &alias, std::string const &link, - std::string const &tooltip, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("{} [[{}{{{}}}]]", alias, link, tooltip), caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher HasLink(std::string const &alias, std::string const &link, - std::string const &tooltip, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("click {} href \"{}\" \"{}\"", alias, link, tooltip), - caseSensitivity)); -} -} - -ContainsMatcher HasMemberLink(std::string const &method, - std::string const &link, std::string const &tooltip, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(fmt::format("{} [[[{}{{{}}}]]]", method, link, tooltip), - caseSensitivity)); -} - -template -ContainsMatcher IsMethod(std::string const &name, - std::string const &type = "void", std::string const ¶ms = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - std::string pattern; - if constexpr (has_type()) - pattern += "{static} "; - - if constexpr (has_type()) - pattern += "{abstract} "; - - if constexpr (has_type()) - pattern = "+"; - else if constexpr (has_type()) - pattern = "#"; - else - pattern = "-"; - - pattern += name; - - pattern += "(" + params + ")"; - - if constexpr (has_type()) - pattern += " constexpr"; - - if constexpr (has_type()) - pattern += " consteval"; - - if constexpr (has_type()) - pattern += " const"; - - if constexpr (has_type()) - pattern += " = 0"; - - if constexpr (has_type()) - pattern += " = default"; - - if constexpr (has_type()) - pattern += " = deleted"; - - if constexpr (has_type()) - pattern += " [coroutine]"; - - pattern += " : " + type; - - return ContainsMatcher(CasedString(pattern, caseSensitivity)); -} - -namespace mermaid { -template -ContainsMatcher IsMethod(std::string const &name, std::string type = "void", - std::string const ¶ms = "", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - std::string pattern; - - if constexpr (has_type()) - pattern = "+"; - else if constexpr (has_type()) - pattern = "#"; - else - pattern = "-"; - - pattern += name; - - pattern += "(" + params + ")"; - - std::vector method_mods; - if constexpr (has_type()) - method_mods.push_back("default"); - if constexpr (has_type()) - method_mods.push_back("const"); - if constexpr (has_type()) - method_mods.push_back("constexpr"); - if constexpr (has_type()) - method_mods.push_back("consteval"); - if constexpr (has_type()) - method_mods.push_back("coroutine"); - - pattern += " : "; - - if (!method_mods.empty()) { - pattern += fmt::format("[{}] ", fmt::join(method_mods, ",")); - } - - util::replace_all(type, "<", "<"); - util::replace_all(type, ">", ">"); - util::replace_all(type, "(", "("); - util::replace_all(type, ")", ")"); - util::replace_all(type, "##", "::"); - util::replace_all(type, "{", "{"); - util::replace_all(type, "}", "}"); - - pattern += type; - - if constexpr (has_type()) - pattern += "*"; - - if constexpr (has_type()) - pattern += "$"; - - return ContainsMatcher(CasedString(pattern, caseSensitivity)); -} -} - -template -ContainsMatcher IsField(std::string const &name, - std::string const &type = "void", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - std::string pattern; - if constexpr (has_type()) - pattern += "{static} "; - - if constexpr (has_type()) - pattern = "+"; - else if constexpr (has_type()) - pattern = "#"; - else - pattern = "-"; - - pattern += name; - - return ContainsMatcher( - CasedString(pattern + " : " + type, caseSensitivity)); -} - -namespace mermaid { -template -ContainsMatcher IsField(std::string const &name, std::string type = "void", - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - std::string pattern; - if constexpr (has_type()) - pattern += "{static} "; - - if constexpr (has_type()) - pattern = "+"; - else if constexpr (has_type()) - pattern = "#"; - else - pattern = "-"; - - pattern += name; - - util::replace_all(type, "<", "<"); - util::replace_all(type, ">", ">"); - util::replace_all(type, "(", "("); - util::replace_all(type, ")", ")"); - util::replace_all(type, "##", "::"); - util::replace_all(type, "{", "{"); - util::replace_all(type, "}", "}"); - - return ContainsMatcher( - CasedString(pattern + " : " + type, caseSensitivity)); -} -} - -template -ContainsMatcher IsFriend(std::string const &from, std::string const &to, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - std::string pattern; - - if constexpr (has_type()) - pattern = "+"; - else if constexpr (has_type()) - pattern = "#"; - else - pattern = "-"; - - return ContainsMatcher( - CasedString(fmt::format("{} <.. {} : {}<>", from, to, pattern), - caseSensitivity)); -} - -namespace mermaid { -template -ContainsMatcher IsFriend(std::string const &from, std::string const &to, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - std::string pattern; - - if constexpr (has_type()) - pattern = "+"; - else if constexpr (has_type()) - pattern = "#"; - else - pattern = "-"; - - return ContainsMatcher( - CasedString(fmt::format("{} <.. {} : {}[friend]", from, to, pattern), - caseSensitivity)); -} -} - -ContainsMatcher IsPackage(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString("package [" + str + "]", caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher IsPackage(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString("subgraph " + str, caseSensitivity)); -} -} - -ContainsMatcher IsFolder(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString("folder \"" + str + "\"", caseSensitivity)); -} - -ContainsMatcher IsFile(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString("file \"" + str + "\"", caseSensitivity)); -} - -namespace mermaid { -ContainsMatcher IsFolder(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString("subgraph " + str, caseSensitivity)); -} - -ContainsMatcher IsFile(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString(str + "[", caseSensitivity)); -} -} - -ContainsMatcher IsDeprecated(std::string const &str, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher( - CasedString(str + " <> ", caseSensitivity)); -} - -namespace json { -struct File { - explicit File(const std::string &f) - : file{f} - { - } - - const std::string file; -}; - -std::optional get_element_by_id( - const nlohmann::json &j, const std::string &id) -{ - if (!j.contains("elements")) - return {}; - - for (const nlohmann::json &e : j["elements"]) { - if (e["id"] == id) - return {e}; - - if (e["type"] == "namespace" || e["type"] == "folder") { - auto maybe_e = get_element_by_id(e, id); - if (maybe_e) - return maybe_e; - } - } - - return {}; -} - -std::optional get_element( - const nlohmann::json &j, const std::string &name) -{ - if (!j.contains("elements")) - return {}; - - for (const nlohmann::json &e : j["elements"]) { - if (e["display_name"] == name) - return {e}; - - if (e["type"] == "namespace" || e["type"] == "folder" || - e["type"] == "directory" || e["type"] == "module") { - auto maybe_e = get_element(e, name); - if (maybe_e) - return maybe_e; - } - } - - return {}; -} - -std::optional get_participant( - const nlohmann::json &j, const std::string &name) -{ - if (!j.contains("participants")) - return {}; - - for (const nlohmann::json &e : j.at("participants")) { - if (e["display_name"] == name) - return {e}; - } - - return {}; -} - -auto get_relationship(const nlohmann::json &j, const nlohmann::json &from, - const nlohmann::json &to, const std::string &type) -{ - return std::find_if(j["relationships"].begin(), j["relationships"].end(), - [&](const auto &it) { - return (it["source"] == from) && (it["destination"] == to) && - (it["type"] == type); - }); -} - -auto get_relationship(const nlohmann::json &j, const std::string &from, - const std::string &to, const std::string &type) -{ - auto source = get_element(j, from); - auto destination = get_element(j, to); - - if (!(source && destination)) - return j["relationships"].end(); - - return get_relationship(j, source->at("id"), destination->at("id"), type); -} - -std::string expand_name(const nlohmann::json &j, const std::string &name) -{ - return name; -} - -bool HasTitle(const nlohmann::json &j, const std::string &title) -{ - return j.contains("title") && j["title"] == title; -} - -bool IsClass(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, expand_name(j, name)); - return e && e->at("type") == "class"; -} - -bool IsStruct(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, expand_name(j, name)); - return e && e->at("type") == "class" && e->at("is_struct"); -} - -bool InPublicModule(const nlohmann::json &j, const std::string &element, - const std::string &module) -{ - auto e = get_element(j, expand_name(j, element)); - return e && e->contains("module") && e->at("module")["name"] == module && - !e->at("module")["is_private"]; -} - -bool InPrivateModule(const nlohmann::json &j, const std::string &element, - const std::string &module) -{ - auto e = get_element(j, expand_name(j, element)); - return e && e->contains("module") && e->at("module")["name"] == module && - e->at("module")["is_private"]; -} - -bool IsAbstractClass(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, expand_name(j, name)); - return e && (e->at("type") == "class") && (e->at("is_abstract") == true); -} - -bool IsClassTemplate(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, expand_name(j, name)); - return e && e->at("type") == "class" && e->at("is_template") == true; -} - -bool IsConcept(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, expand_name(j, name)); - return e && e->at("type") == "concept"; -} - -bool IsEnum(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, expand_name(j, name)); - return e && e->at("type") == "enum"; -} - -bool IsPackage(const nlohmann::json &j, const std::string &name, - const std::string &type = "namespace") -{ - auto e = get_element(j, expand_name(j, name)); - return e && e->at("type") == type; -} - -struct NamespacePackage { }; -struct ModulePackage { }; -struct DirectoryPackage { }; - -template std::string package_type_name(); - -template <> std::string package_type_name() -{ - return "namespace"; -} - -template <> std::string package_type_name() { return "module"; } - -template <> std::string package_type_name() -{ - return "directory"; -} - -template -bool IsPackagePath( - const nlohmann::json &j, const std::string &head, Args... args) -{ - if constexpr (sizeof...(Args) == 0) { - auto e = get_element(j, expand_name(j, head)); - - return e && e->at("type") == package_type_name(); - } - else { - auto e = get_element(j, head); - if (!e.has_value()) - return false; - - return IsPackagePath(*e, args...); - } -} - -template -bool IsNamespacePackage( - const nlohmann::json &j, const std::string &head, Args... args) -{ - return IsPackagePath( - j, head, std::forward(args)...); -} - -template -bool IsDirectoryPackage( - const nlohmann::json &j, const std::string &head, Args... args) -{ - return IsPackagePath( - j, head, std::forward(args)...); -} - -template -bool IsModulePackage( - const nlohmann::json &j, const std::string &head, Args... args) -{ - return IsPackagePath(j, head, std::forward(args)...); -} - -bool IsFolder(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, name); - return e && e->at("type") == "folder"; -} - -bool IsFile(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, name); - return e && e->at("type") == "file"; -} - -bool IsSystemHeader(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, name); - return e && e->at("type") == "file" && e->at("file_kind") == "header" && - e->at("is_system"); -} - -bool IsHeader(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, name); - return e && e->at("type") == "file" && e->at("file_kind") == "header" && - !e->at("is_system"); -} - -bool IsDeprecated(const nlohmann::json &j, const std::string &name) -{ - auto e = get_element(j, expand_name(j, name)); - return e && e->at("is_deprecated") == true; -} - -bool IsBaseClass(const nlohmann::json &j, const std::string &base, - const std::string &subclass) -{ - auto base_el = get_element(j, expand_name(j, base)); - auto subclass_el = get_element(j, expand_name(j, subclass)); - - if (!base_el || !subclass_el) - return false; - - const nlohmann::json &bases = (*subclass_el)["bases"]; - - return std::find_if(bases.begin(), bases.end(), [&](const auto &it) { - return it["id"] == base_el.value()["id"]; - }) != bases.end(); -} - -bool IsMethod( - const nlohmann::json &j, const std::string &cls, const std::string &name) -{ - auto sc = get_element(j, expand_name(j, cls)); - - if (!sc) - return false; - - const nlohmann::json &methods = (*sc)["methods"]; - - return std::find_if(methods.begin(), methods.end(), [&](const auto &it) { - return it["name"] == name; - }) != methods.end(); -} - -bool IsField(const nlohmann::json &j, const std::string &cls, - const std::string &name, const std::string &type) -{ - auto sc = get_element(j, expand_name(j, cls)); - - if (!sc) - return false; - - const nlohmann::json &members = (*sc)["members"]; - - return std::find_if(members.begin(), members.end(), [&](const auto &it) { - return it["name"] == name && it["type"] == type; - }) != members.end(); -} - -bool IsAssociation(nlohmann::json j, const std::string &from, - const std::string &to, const std::string &label = "") -{ - auto rel = get_relationship( - j, expand_name(j, from), expand_name(j, to), "association"); - - if (rel == j["relationships"].end()) - return false; - - if (!label.empty() && rel->at("label") != label) - return false; - - return true; -} - -bool IsComposition(nlohmann::json j, const std::string &from, - const std::string &to, const std::string &label = "") -{ - auto rel = get_relationship( - j, expand_name(j, from), expand_name(j, to), "composition"); - - if (rel == j["relationships"].end()) - return false; - - if (!label.empty() && rel->at("label") != label) - return false; - - return true; -} - -bool IsAggregation(nlohmann::json j, const std::string &from, - const std::string &to, const std::string &label = "") -{ - auto rel = get_relationship( - j, expand_name(j, from), expand_name(j, to), "aggregation"); - - if (rel == j["relationships"].end()) - return false; - - if (!label.empty() && rel->at("label") != label) - return false; - - return true; -} - -namespace detail { -bool is_dependency_impl( - nlohmann::json j, const std::string &from, const std::string &to) -{ - auto rel = get_relationship(j, from, to, "dependency"); - - return rel != j["relationships"].end(); -} - -} // namespace detail - -bool IsDependency( - nlohmann::json j, const std::string &from, const std::string &to) -{ - return detail::is_dependency_impl( - j, expand_name(j, from), expand_name(j, to)); -} - -bool IsDependency(nlohmann::json j, const File &from, const File &to) -{ - return detail::is_dependency_impl(j, from.file, to.file); -} - -bool IsInstantiation( - nlohmann::json j, const std::string &from, const std::string &to) -{ - auto rel = get_relationship( - j, expand_name(j, to), expand_name(j, from), "instantiation"); - - return rel != j["relationships"].end(); -} - -bool IsFriend(nlohmann::json j, const std::string &from, const std::string &to) -{ - auto rel = get_relationship( - j, expand_name(j, from), expand_name(j, to), "friendship"); - - return rel != j["relationships"].end(); -} - -bool IsInnerClass( - nlohmann::json j, const std::string &from, const std::string &to) -{ - auto rel = get_relationship( - j, expand_name(j, to), expand_name(j, from), "containment"); - - 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, - std::optional return_type, 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, return_type, from_p, to_p, count); - - if (nested_res >= 0) - return nested_res; - } - } - else if (m.contains("messages")) { - auto nested_res = find_message_nested( - m, from, to, msg, return_type, 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_type || m["return_type"] == *return_type)) - return count; - - count++; - } - } - - return res; -} - -int find_message_impl(const nlohmann::json &j, const std::string &from, - const std::string &to, const std::string &msg, - std::optional return_type) -{ - - auto from_p = get_participant(j, from); - auto to_p = get_participant(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, return_type, *from_p, *to_p, count); - - if (res >= 0) - return res; - - throw std::runtime_error( - fmt::format("No such message {} {} {}", from, to, msg)); -} - -} // namespace detail - -int FindMessage(const nlohmann::json &j, const File &from, const File &to, - const std::string &msg) -{ - return detail::find_message_impl(j, from.file, to.file, msg, {}); -} - -int FindMessage(const nlohmann::json &j, const std::string &from, - const std::string &to, const std::string &msg, - std::optional return_type = {}) -{ - return detail::find_message_impl( - j, expand_name(j, from), expand_name(j, to), msg, return_type); -} - -struct message_test_spec_t { - std::string from; - std::string to; - std::optional return_type; - - bool operator==(const message_test_spec_t &r) const noexcept - { - return from == r.from && to == r.to && return_type == r.return_type; - } -}; - -void from_json(const nlohmann::json &j, message_test_spec_t &p) -{ - j.at("from").at("activity_id").get_to(p.from); - j.at("to").at("activity_id").get_to(p.to); - j.at("return_type").get_to(p.return_type); -} - -std::string get_activity_id( - const nlohmann::json &j, const std::string &display_name) -{ - for (const auto &p : j["participants"]) { - if (p.contains("activities")) { - for (const auto &a : p["activities"]) { - if (a["display_name"] == display_name) { - return a["id"]; - } - } - } - else if (p["display_name"] == display_name) { - return p["id"]; - } - } - - return {}; -} - -bool HasMessageChain( - const nlohmann::json &j, std::vector msgs) -{ - std::vector full_name_messages; - std::transform(msgs.begin(), msgs.end(), - std::back_inserter(full_name_messages), - [&j](const message_test_spec_t &m) { - auto res = m; - res.from = get_activity_id(j, m.from); - res.to = get_activity_id(j, m.to); - return res; - }); - - for (const auto &seq : j.at("sequences")) - for (const auto &mc : seq.at("message_chains")) { - auto mc_msgs = - mc.at("messages").get>(); - - if (full_name_messages == mc_msgs) - return true; - } - - return false; -} - -} // namespace json -} -} -} -*/ \ No newline at end of file +} // namespace clanguml::test