diff --git a/src/sequence_diagram/model/diagram.cc b/src/sequence_diagram/model/diagram.cc index 0d42987b..722685f6 100644 --- a/src/sequence_diagram/model/diagram.cc +++ b/src/sequence_diagram/model/diagram.cc @@ -29,14 +29,22 @@ common::model::diagram_t diagram::type() const } common::optional_ref diagram::get( - const std::string & /*full_name*/) const + const std::string & full_name) const { + for(const auto& [id, participant] : participants) { + if(participant->full_name(false) == full_name) + return {*participant}; + } + return {}; } common::optional_ref diagram::get( - const common::model::diagram_element::id_t /*id*/) const + const common::model::diagram_element::id_t id) const { + if(participants.find(id) != participants.end()) + return {*participants.at(id)}; + return {}; } @@ -53,6 +61,11 @@ inja::json diagram::context() const inja::json::array_t elements{}; + // Add classes + for (const auto &[id, p] : participants) { + elements.emplace_back(p->context()); + } + ctx["elements"] = elements; return ctx; diff --git a/src/util/util.cc b/src/util/util.cc index b6c9eecf..9a820790 100644 --- a/src/util/util.cc +++ b/src/util/util.cc @@ -201,7 +201,6 @@ std::string abbreviate(const std::string &s, const unsigned int max_length) bool find_element_alias( const std::string &input, std::tuple &result) { - std::regex alias_regex("(@A\\([^\\).]+\\))"); auto alias_it = diff --git a/tests/t20001/.clang-uml b/tests/t20001/.clang-uml index 5a2b9c8c..0e443a01 100644 --- a/tests/t20001/.clang-uml +++ b/tests/t20001/.clang-uml @@ -19,4 +19,4 @@ diagrams: before: - "' t20001 test sequence diagram" after: - - 'note over "tmain()": Main test function' + - '{% set e=element("clanguml::t20001::tmain()") %} note over {{ e.alias) }}: Main test function' diff --git a/tests/t20001/test_case.h b/tests/t20001/test_case.h index 82e44243..6ee8363a 100644 --- a/tests/t20001/test_case.h +++ b/tests/t20001/test_case.h @@ -33,15 +33,16 @@ TEST_CASE("t20001", "[test-case][sequence]") REQUIRE(!model->should_include("std::vector")); auto puml = generate_sequence_puml(diagram, *model); + AliasMatcher _A(puml); REQUIRE_THAT(puml, StartsWith("@startuml")); REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, HasCall("A", "log_result")); - REQUIRE_THAT(puml, HasCall("B", "A", "log_result")); - REQUIRE_THAT(puml, HasCallWithResponse("B", "A", "add3")); - REQUIRE_THAT(puml, HasCall("A", "add")); - REQUIRE_THAT(puml, !HasCall("A", "detail::C", "add")); + REQUIRE_THAT(puml, HasCall(_A("A"), "log_result")); + REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "log_result")); + REQUIRE_THAT(puml, HasCallWithResponse(_A("B"), _A("A"), "add3")); + REQUIRE_THAT(puml, HasCall(_A("A"), "add")); + REQUIRE_THAT(puml, !HasCall(_A("A"), _A("detail::C"), "add")); save_puml( "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); diff --git a/tests/t20002/test_case.h b/tests/t20002/test_case.h index ebefda0f..09691b06 100644 --- a/tests/t20002/test_case.h +++ b/tests/t20002/test_case.h @@ -29,13 +29,14 @@ TEST_CASE("t20002", "[test-case][sequence]") REQUIRE(model->name() == "t20002_sequence"); auto puml = generate_sequence_puml(diagram, *model); + AliasMatcher _A(puml); REQUIRE_THAT(puml, StartsWith("@startuml")); REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, HasFunctionCall("m1", "m2")); - REQUIRE_THAT(puml, HasFunctionCall("m2", "m3")); - REQUIRE_THAT(puml, HasFunctionCall("m3", "m4")); + REQUIRE_THAT(puml, HasCall(_A("m1()"), _A("m2()"), "m2")); + REQUIRE_THAT(puml, HasCall(_A("m2()"), _A("m3()"), "m3")); + REQUIRE_THAT(puml, HasCall(_A("m3()"), _A("m4()"), "m4")); save_puml( "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); diff --git a/tests/t20003/test_case.h b/tests/t20003/test_case.h index eb8aecf5..efe4a4fa 100644 --- a/tests/t20003/test_case.h +++ b/tests/t20003/test_case.h @@ -29,13 +29,14 @@ TEST_CASE("t20003", "[test-case][sequence]") REQUIRE(model->name() == "t20003_sequence"); auto puml = generate_sequence_puml(diagram, *model); + AliasMatcher _A(puml); REQUIRE_THAT(puml, StartsWith("@startuml")); REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, HasFunctionCall("m1", "m2")); - REQUIRE_THAT(puml, HasFunctionCall("m2", "m3")); - REQUIRE_THAT(puml, HasFunctionCall("m3", "m4")); + REQUIRE_THAT(puml, HasCall(_A("m1()"), _A("m2()"))); + REQUIRE_THAT(puml, HasCall(_A("m2()"), _A("m3()"))); + REQUIRE_THAT(puml, HasCall(_A("m3()"), _A("m4()"))); save_puml( "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); diff --git a/tests/t20004/test_case.h b/tests/t20004/test_case.h index b6b1d9c4..26f9d792 100644 --- a/tests/t20004/test_case.h +++ b/tests/t20004/test_case.h @@ -32,15 +32,14 @@ TEST_CASE("t20004", "[test-case][sequence]") AliasMatcher _A(puml); REQUIRE_THAT(puml, StartsWith("@startuml")); - REQUIRE_THAT(puml, HasFunctionCall("main()", "m1()")); - REQUIRE_THAT(puml, HasFunctionCall("m2", "m3")); - REQUIRE_THAT(puml, HasFunctionCall("m3", "m4")); + REQUIRE_THAT(puml, HasCall(_A("main()"), _A("m1()"))); + REQUIRE_THAT(puml, HasCall(_A("m2()"), _A("m3()"))); + REQUIRE_THAT(puml, HasCall(_A("m3()"), _A("m4()"))); REQUIRE_THAT(puml, EndsWith("@enduml\n")); - // Check if all calls exist - REQUIRE_THAT(puml, HasCall("A", "log_result")); - //REQUIRE_THAT(puml, HasCallWithResponse("B", "A", "add3")); + REQUIRE_THAT(puml, HasCall(_A("A"), "log_result")); + // REQUIRE_THAT(puml, HasCallWithResponse("B", "A", "add3")); save_puml( "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); diff --git a/tests/test_cases.h b/tests/test_cases.h index 9fe8e489..4d6ec4be 100644 --- a/tests/test_cases.h +++ b/tests/test_cases.h @@ -123,25 +123,16 @@ ContainsMatcher HasCall(std::string const &from, std::string const &message, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) { return ContainsMatcher( - CasedString(fmt::format("\"{}\" -> \"{}\" : {}()", from, from, message), + CasedString(fmt::format("{} -> {} : {}()", from, from, message), caseSensitivity)); } -ContainsMatcher HasFunctionCall(std::string const &from, - std::string const &message, - CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) -{ - return ContainsMatcher(CasedString( - fmt::format("\"{}()\" -> \"{}()\" : {}()", from, message, message), - caseSensitivity)); -} - ContainsMatcher HasCall(std::string const &from, std::string const &to, std::string const &message, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) { return ContainsMatcher( - CasedString(fmt::format("\"{}\" -> \"{}\" : {}()", from, to, message), + CasedString(fmt::format("{} -> {} : {}()", from, to, message), caseSensitivity)); } @@ -150,10 +141,10 @@ auto HasCallWithResponse(std::string const &from, std::string const &to, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes) { return HasCallWithResultMatcher( - CasedString(fmt::format("\"{}\" -> \"{}\" : {}()", from, to, message), + CasedString(fmt::format("{} -> {} : {}()", from, to, message), caseSensitivity), CasedString( - fmt::format("\"{}\" --> \"{}\"", to, from), caseSensitivity)); + fmt::format("{} --> {}", to, from), caseSensitivity)); } struct AliasMatcher { @@ -162,12 +153,15 @@ struct AliasMatcher { { } - std::string operator()(const std::string &name) + 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, ")", "\\)"); + patterns.push_back( std::regex{"class\\s\"" + name + "\"\\sas\\s" + alias_regex}); patterns.push_back( @@ -182,6 +176,8 @@ struct AliasMatcher { 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;