Added mermaid test cases for class diagrams
This commit is contained in:
@@ -302,12 +302,86 @@ struct AliasMatcher {
|
||||
const std::vector<std::string> puml;
|
||||
};
|
||||
|
||||
namespace mermaid {
|
||||
struct AliasMatcher {
|
||||
AliasMatcher(const std::string &mmd_)
|
||||
: mmd{split(mmd_, "\n")}
|
||||
{
|
||||
}
|
||||
|
||||
std::string operator()(std::string name)
|
||||
{
|
||||
std::vector<std::regex> 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{"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 : 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<std::string> mmd;
|
||||
};
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -315,6 +389,16 @@ ContainsMatcher IsUnion(std::string const &str,
|
||||
CasedString("class " + str + " <<union>>", caseSensitivity));
|
||||
}
|
||||
|
||||
namespace mermaid {
|
||||
auto IsUnion(std::string const &alias,
|
||||
CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
|
||||
{
|
||||
return Catch::Matchers::Matches(
|
||||
std::string("class ") + alias + " \\{\\n\\s+<<union>>",
|
||||
caseSensitivity);
|
||||
}
|
||||
}
|
||||
|
||||
ContainsMatcher IsClassTemplate(std::string const &str,
|
||||
std::string const &tmplt,
|
||||
CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
|
||||
@@ -330,18 +414,48 @@ ContainsMatcher IsConcept(std::string const &str,
|
||||
CasedString("class " + str + " <<concept>>", caseSensitivity));
|
||||
}
|
||||
|
||||
namespace mermaid {
|
||||
auto IsConcept(std::string const &alias,
|
||||
CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
|
||||
{
|
||||
return Catch::Matchers::Matches(
|
||||
std::string("class ") + alias + " \\{\\n\\s+<<concept>>",
|
||||
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+<<enumeration>>",
|
||||
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+<<abstract>>",
|
||||
caseSensitivity);
|
||||
}
|
||||
}
|
||||
|
||||
ContainsMatcher IsAbstractClassTemplate(std::string const &str,
|
||||
std::string const &tmplt,
|
||||
CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
|
||||
@@ -356,6 +470,14 @@ ContainsMatcher IsBaseClass(std::string const &base, std::string const &sub,
|
||||
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)
|
||||
@@ -364,6 +486,16 @@ ContainsMatcher IsInnerClass(std::string const &parent,
|
||||
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 = "",
|
||||
@@ -494,6 +626,43 @@ ContainsMatcher IsConceptRequirement(std::string const &cpt,
|
||||
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)
|
||||
@@ -534,6 +703,17 @@ ContainsMatcher HasLink(std::string const &alias, std::string const &link,
|
||||
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)
|
||||
@@ -589,6 +769,61 @@ ContainsMatcher IsMethod(std::string const &name,
|
||||
return ContainsMatcher(CasedString(pattern, caseSensitivity));
|
||||
}
|
||||
|
||||
namespace mermaid {
|
||||
template <typename... Ts>
|
||||
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<Public, Ts...>())
|
||||
pattern = "+";
|
||||
else if constexpr (has_type<Protected, Ts...>())
|
||||
pattern = "#";
|
||||
else
|
||||
pattern = "-";
|
||||
|
||||
pattern += name;
|
||||
|
||||
pattern += "(" + params + ")";
|
||||
|
||||
std::vector<std::string> method_mods;
|
||||
if constexpr (has_type<Default, Ts...>())
|
||||
method_mods.push_back("default");
|
||||
if constexpr (has_type<Const, Ts...>())
|
||||
method_mods.push_back("const");
|
||||
if constexpr (has_type<Constexpr, Ts...>())
|
||||
method_mods.push_back("constexpr");
|
||||
if constexpr (has_type<Consteval, Ts...>())
|
||||
method_mods.push_back("consteval");
|
||||
|
||||
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<Abstract, Ts...>())
|
||||
pattern += "*";
|
||||
|
||||
if constexpr (has_type<Static, Ts...>())
|
||||
pattern += "$";
|
||||
|
||||
return ContainsMatcher(CasedString(pattern, caseSensitivity));
|
||||
}
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
ContainsMatcher IsField(std::string const &name,
|
||||
std::string const &type = "void",
|
||||
@@ -611,6 +846,37 @@ ContainsMatcher IsField(std::string const &name,
|
||||
CasedString(pattern + " : " + type, caseSensitivity));
|
||||
}
|
||||
|
||||
namespace mermaid {
|
||||
template <typename... Ts>
|
||||
ContainsMatcher IsField(std::string const &name, std::string type = "void",
|
||||
CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
|
||||
{
|
||||
std::string pattern;
|
||||
if constexpr (has_type<Static, Ts...>())
|
||||
pattern += "{static} ";
|
||||
|
||||
if constexpr (has_type<Public, Ts...>())
|
||||
pattern = "+";
|
||||
else if constexpr (has_type<Protected, Ts...>())
|
||||
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 <typename... Ts>
|
||||
ContainsMatcher IsFriend(std::string const &from, std::string const &to,
|
||||
CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
|
||||
|
||||
Reference in New Issue
Block a user