diff --git a/src/class_diagram/generators/json/class_diagram_generator.cc b/src/class_diagram/generators/json/class_diagram_generator.cc index 40ce347e..9ff39d7d 100644 --- a/src/class_diagram/generators/json/class_diagram_generator.cc +++ b/src/class_diagram/generators/json/class_diagram_generator.cc @@ -34,6 +34,9 @@ void to_json(nlohmann::json &j, const element &c) {"namespace", c.get_namespace().to_string()}, {"type", c.type_name()}, {"display_name", c.full_name(false)}}; + if (c.comment()) + j["comment"] = c.comment().value(); + if (!c.file().empty()) j["source_location"] = dynamic_cast(c); @@ -60,7 +63,12 @@ void to_json(nlohmann::json &j, const relationship &c) j["multiplicity_source"] = c.multiplicity_source(); if (!c.multiplicity_destination().empty()) j["multiplicity_destination"] = c.multiplicity_destination(); - j["access"] = to_string(c.access()); + if (c.access() != access_t::kNone) + j["access"] = to_string(c.access()); + if (!c.label().empty()) + j["label"] = c.label(); + if (c.comment()) + j["comment"] = c.comment().value(); } } @@ -69,11 +77,15 @@ namespace clanguml::class_diagram::model { using nlohmann::json; void to_json(nlohmann::json &j, const class_element &c) { - j = {{"name", c.name()}, {"type", c.type()}, - {"access", to_string(c.access())}}; + j["name"] = c.name(); + j["type"] = c.type(); + if (c.access() != common::model::access_t::kNone) + j["access"] = to_string(c.access()); if (!c.file().empty()) j["source_location"] = dynamic_cast(c); + if (c.comment()) + j["comment"] = c.comment().value(); } void to_json(nlohmann::json &j, const class_member &c) @@ -92,6 +104,8 @@ void to_json(nlohmann::json &j, const method_parameter &c) void to_json(nlohmann::json &j, const class_method &c) { + j = dynamic_cast(c); + j["is_static"] = c.is_static(); j["is_const"] = c.is_const(); j["is_defaulted"] = c.is_defaulted(); @@ -106,7 +120,8 @@ void to_json(nlohmann::json &j, const class_parent &c) { j["is_virtual"] = c.is_virtual(); j["id"] = std::to_string(c.id()); - j["access"] = to_string(c.access()); + if (c.access() != common::model::access_t::kNone) + j["access"] = to_string(c.access()); j["name"] = c.name(); } @@ -152,6 +167,8 @@ void generator::generate(std::ostream &ostr) const { generate_top_level_elements(json_); + generate_relationships(json_); + ostr << json_; } @@ -167,6 +184,16 @@ void generator::generate_top_level_elements(nlohmann::json &parent) const generate(*cls, parent); } } + else if (auto *enm = dynamic_cast(p.get()); enm) { + if (m_model.should_include(*enm)) { + generate(*enm, parent); + } + } + else if (auto *cpt = dynamic_cast(p.get()); cpt) { + if (m_model.should_include(*cpt)) { + generate(*cpt, parent); + } + } } } @@ -177,11 +204,11 @@ void generator::generate(const package &p, nlohmann::json &parent) const nlohmann::json package_object; if (m_config.generate_packages()) { - LOG_DBG("Generating package {}", p.name()); - // Don't generate packages from namespaces filtered out by // using_namespace if (!uns.starts_with({p.full_name(false)})) { + LOG_DBG("Generating package {}", p.name()); + package_object["type"] = "namespace"; package_object["name"] = p.name(); package_object["display_name"] = p.full_name(false); @@ -190,7 +217,6 @@ void generator::generate(const package &p, nlohmann::json &parent) const for (const auto &subpackage : p) { if (dynamic_cast(subpackage.get()) != nullptr) { - // TODO: add option - generate_empty_packages const auto &sp = dynamic_cast(*subpackage); if (!sp.is_empty()) { if (m_config.generate_packages()) @@ -200,35 +226,32 @@ void generator::generate(const package &p, nlohmann::json &parent) const } } else if (auto *cls = dynamic_cast(subpackage.get()); cls) { - const auto &sp = dynamic_cast(*subpackage); - if (m_model.should_include(*subpackage)) { + if (m_model.should_include(*cls)) { if (m_config.generate_packages()) - generate(sp, package_object); + generate(*cls, package_object); else - generate(sp, parent); + generate(*cls, parent); } } else if (auto *enm = dynamic_cast(subpackage.get()); enm) { - const auto &sp = dynamic_cast(*subpackage); - if (m_model.should_include(*subpackage)) { + if (m_model.should_include(*enm)) { if (m_config.generate_packages()) - generate(sp, package_object); + generate(*enm, package_object); else - generate(sp, parent); + generate(*enm, parent); } } else if (auto *cpt = dynamic_cast(subpackage.get()); cpt) { - const auto &sp = dynamic_cast(*subpackage); - if (m_model.should_include(*subpackage)) { + if (m_model.should_include(*cpt)) { if (m_config.generate_packages()) - generate(sp, package_object); + generate(*cpt, package_object); else - generate(sp, parent); + generate(*cpt, parent); } } } - if (m_config.generate_packages()) { + if (m_config.generate_packages() && !package_object.empty()) { parent["elements"].push_back(std::move(package_object)); } } @@ -236,20 +259,19 @@ void generator::generate(const package &p, nlohmann::json &parent) const void generator::generate(const class_ &c, nlohmann::json &parent) const { nlohmann::json object = c; - json_["elements"].push_back(std::move(object)); + parent["elements"].push_back(std::move(object)); } void generator::generate(const enum_ &e, nlohmann::json &parent) const { nlohmann::json object = e; - json_["elements"].push_back(std::move(object)); + parent["elements"].push_back(std::move(object)); } void generator::generate(const concept_ &c, nlohmann::json &parent) const { nlohmann::json object = c; - json_["elements"].push_back(std::move(object)); - generate_relationships(json_); + parent["elements"].push_back(std::move(object)); } void generator::generate_relationships(nlohmann::json &parent) const @@ -280,6 +302,14 @@ void generator::generate_relationships( const class_ &c, nlohmann::json &parent) const { for (const auto &r : c.relationships()) { + auto target_element = m_model.get(r.destination()); + if (!target_element.has_value()) { + LOG_DBG("Skipping {} relation from {} to {} due " + "to unresolved destination id", + to_string(r.type()), c.full_name(), r.destination()); + continue; + } + nlohmann::json rel = r; rel["source"] = std::to_string(c.id()); parent["relationships"].push_back(rel); @@ -300,6 +330,14 @@ void generator::generate_relationships( const enum_ &c, nlohmann::json &parent) const { for (const auto &r : c.relationships()) { + auto target_element = m_model.get(r.destination()); + if (!target_element.has_value()) { + LOG_DBG("Skipping {} relation from {} to {} due " + "to unresolved destination id", + to_string(r.type()), c.full_name(), r.destination()); + continue; + } + nlohmann::json rel = r; rel["source"] = std::to_string(c.id()); parent["relationships"].push_back(rel); @@ -310,6 +348,14 @@ void generator::generate_relationships( const concept_ &c, nlohmann::json &parent) const { for (const auto &r : c.relationships()) { + auto target_element = m_model.get(r.destination()); + if (!target_element.has_value()) { + LOG_DBG("Skipping {} relation from {} to {} due " + "to unresolved destination id", + to_string(r.type()), c.full_name(), r.destination()); + continue; + } + nlohmann::json rel = r; rel["source"] = std::to_string(c.id()); parent["relationships"].push_back(rel); @@ -319,6 +365,31 @@ void generator::generate_relationships( void generator::generate_relationships( const package &p, nlohmann::json &parent) const { + for (const auto &subpackage : p) { + if (dynamic_cast(subpackage.get()) != nullptr) { + const auto &sp = dynamic_cast(*subpackage); + if (!sp.is_empty()) + generate_relationships(sp, parent); + } + else if (dynamic_cast(subpackage.get()) != nullptr) { + if (m_model.should_include(*subpackage)) { + generate_relationships( + dynamic_cast(*subpackage), parent); + } + } + else if (dynamic_cast(subpackage.get()) != nullptr) { + if (m_model.should_include(*subpackage)) { + generate_relationships( + dynamic_cast(*subpackage), parent); + } + } + else if (dynamic_cast(subpackage.get()) != nullptr) { + if (m_model.should_include(*subpackage)) { + generate_relationships( + dynamic_cast(*subpackage), parent); + } + } + } } } // namespace clanguml::class_diagram::generators::plantuml diff --git a/tests/t00002/test_case.h b/tests/t00002/test_case.h index 72f328cd..2441faab 100644 --- a/tests/t00002/test_case.h +++ b/tests/t00002/test_case.h @@ -74,4 +74,445 @@ TEST_CASE("t00002", "[test-case][class]") "This is class B")); save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); + + const std::string expected_json = R"##( +{ + "elements": [ + { + "bases": [], + "comment": { + "brief": [ + " This is class A\n" + ], + "formatted": "\\brief This is class A", + "paragraph": [ + " \n" + ], + "raw": "/// \\brief This is class A", + "text": "\n \n" + }, + "display_name": "clanguml::t00002::A", + "id": "987634239855407298", + "is_abstract": true, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [ + { + "access": "public", + "comment": { + "formatted": "Abstract foo_a", + "paragraph": [ + " Abstract foo_a\n" + ], + "raw": "/// Abstract foo_a", + "text": "\n Abstract foo_a\n" + }, + "is_const": false, + "is_defaulted": false, + "is_implicit": false, + "is_pure_virtual": true, + "is_static": false, + "is_virtual": true, + "name": "foo_a", + "parameters": [], + "type": "void" + }, + { + "access": "public", + "comment": { + "formatted": "Abstract foo_c", + "paragraph": [ + " Abstract foo_c\n" + ], + "raw": "/// Abstract foo_c", + "text": "\n Abstract foo_c\n" + }, + "is_const": false, + "is_defaulted": false, + "is_implicit": false, + "is_pure_virtual": true, + "is_static": false, + "is_virtual": true, + "name": "foo_c", + "parameters": [], + "type": "void" + } + ], + "name": "A", + "namespace": "clanguml::t00002", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00002/t00002.cc", + "line": 7 + }, + "template_parameters": [], + "type": "class" + }, + { + "bases": [ + { + "access": "public", + "id": "987634239855407298", + "is_virtual": false, + "name": "clanguml::t00002::A" + } + ], + "comment": { + "brief": [ + " This is class B\n" + ], + "formatted": "\\brief This is class B", + "paragraph": [ + " \n" + ], + "raw": "/// \\brief This is class B", + "text": "\n \n" + }, + "display_name": "clanguml::t00002::B", + "id": "594234458687375950", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [ + { + "access": "public", + "is_const": false, + "is_defaulted": false, + "is_implicit": false, + "is_pure_virtual": false, + "is_static": false, + "is_virtual": true, + "name": "foo_a", + "parameters": [], + "type": "void" + } + ], + "name": "B", + "namespace": "clanguml::t00002", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00002/t00002.cc", + "line": 16 + }, + "template_parameters": [], + "type": "class" + }, + { + "bases": [ + { + "access": "public", + "id": "987634239855407298", + "is_virtual": false, + "name": "clanguml::t00002::A" + } + ], + "comment": { + "brief": [ + " This is class C - class C has a long comment\n" + ], + "formatted": "@brief This is class C - class C has a long comment\n\nVivamus integer non suscipit taciti mus etiam at primis tempor sagittis sit,\neuismod libero facilisi aptent elementum felis blandit cursus gravida sociis\nerat ante, eleifend lectus nullam dapibus netus feugiat curae curabitur est\nad.", + "paragraph": [ + " \n", + " Vivamus integer non suscipit taciti mus etiam at primis tempor sagittis sit,\n euismod libero facilisi aptent elementum felis blandit cursus gravida sociis\n erat ante, eleifend lectus nullam dapibus netus feugiat curae curabitur est\n ad.\n" + ], + "raw": "/// @brief This is class C - class C has a long comment\n///\n/// Vivamus integer non suscipit taciti mus etiam at primis tempor sagittis sit,\n/// euismod libero facilisi aptent elementum felis blandit cursus gravida sociis\n/// erat ante, eleifend lectus nullam dapibus netus feugiat curae curabitur est\n/// ad.", + "text": "\n \n\n Vivamus integer non suscipit taciti mus etiam at primis tempor sagittis sit,\n euismod libero facilisi aptent elementum felis blandit cursus gravida sociis\n erat ante, eleifend lectus nullam dapibus netus feugiat curae curabitur est\n ad.\n" + }, + "display_name": "clanguml::t00002::C", + "id": "1142499429598587507", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [ + { + "access": "public", + "comment": { + "formatted": "Do nothing unless override is provided", + "paragraph": [ + " Do nothing unless override is provided\n" + ], + "raw": "/// Do nothing unless override is provided", + "text": "\n Do nothing unless override is provided\n" + }, + "is_const": false, + "is_defaulted": false, + "is_implicit": false, + "is_pure_virtual": false, + "is_static": false, + "is_virtual": true, + "name": "foo_c", + "parameters": [], + "type": "void" + } + ], + "name": "C", + "namespace": "clanguml::t00002", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00002/t00002.cc", + "line": 27 + }, + "template_parameters": [], + "type": "class" + }, + { + "bases": [ + { + "access": "public", + "id": "594234458687375950", + "is_virtual": false, + "name": "clanguml::t00002::B" + }, + { + "access": "public", + "id": "1142499429598587507", + "is_virtual": false, + "name": "clanguml::t00002::C" + } + ], + "comment": { + "formatted": "This is class D\nwhich is a little like B\nand a little like C", + "paragraph": [ + " This is class D\n which is a little like B\n and a little like C\n" + ], + "raw": "/// This is class D\n/// which is a little like B\n/// and a little like C", + "text": "\n This is class D\n which is a little like B\n and a little like C\n" + }, + "display_name": "clanguml::t00002::D", + "id": "60950494980414724", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "private", + "comment": { + "formatted": "All the A pointers", + "paragraph": [ + " All the A pointers\n" + ], + "raw": "/// All the A pointers", + "text": "\n All the A pointers\n" + }, + "is_static": false, + "name": "as", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00002/t00002.cc", + "line": 58 + }, + "type": "std::vector" + } + ], + "methods": [ + { + "access": "public", + "comment": { + "formatted": "\n Forward foo_a\n ", + "paragraph": [ + " Forward foo_a\n" + ], + "raw": "/**\n * Forward foo_a\n */", + "text": "\n Forward foo_a\n" + }, + "is_const": false, + "is_defaulted": false, + "is_implicit": false, + "is_pure_virtual": false, + "is_static": false, + "is_virtual": true, + "name": "foo_a", + "parameters": [], + "type": "void" + }, + { + "access": "public", + "comment": { + "formatted": "\n Forward foo_c\n ", + "paragraph": [ + " Forward foo_c\n" + ], + "raw": "/**\n * Forward foo_c\n */", + "text": "\n Forward foo_c\n" + }, + "is_const": false, + "is_defaulted": false, + "is_implicit": false, + "is_pure_virtual": false, + "is_static": false, + "is_virtual": true, + "name": "foo_c", + "parameters": [], + "type": "void" + } + ], + "name": "D", + "namespace": "clanguml::t00002", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00002/t00002.cc", + "line": 36 + }, + "template_parameters": [], + "type": "class" + }, + { + "bases": [ + { + "access": "public", + "id": "594234458687375950", + "is_virtual": true, + "name": "clanguml::t00002::B" + }, + { + "access": "public", + "id": "1142499429598587507", + "is_virtual": true, + "name": "clanguml::t00002::C" + } + ], + "display_name": "clanguml::t00002::E", + "id": "2237886670308966220", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "private", + "comment": { + "formatted": "All the A pointers", + "paragraph": [ + " All the A pointers\n" + ], + "raw": "/// All the A pointers", + "text": "\n All the A pointers\n" + }, + "is_static": false, + "name": "as", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00002/t00002.cc", + "line": 83 + }, + "type": "std::vector" + } + ], + "methods": [ + { + "access": "public", + "comment": { + "formatted": "\n Forward foo_a", + "paragraph": [ + " Forward foo_a\n" + ], + "raw": "///\n /// Forward foo_a\n ///", + "text": "\n Forward foo_a\n" + }, + "is_const": false, + "is_defaulted": false, + "is_implicit": false, + "is_pure_virtual": false, + "is_static": false, + "is_virtual": true, + "name": "foo_a", + "parameters": [], + "type": "void" + }, + { + "access": "public", + "comment": { + "formatted": "\n Forward foo_c", + "paragraph": [ + " Forward foo_c\n" + ], + "raw": "///\n /// Forward foo_c\n ///", + "text": "\n Forward foo_c\n" + }, + "is_const": false, + "is_defaulted": false, + "is_implicit": false, + "is_pure_virtual": false, + "is_static": false, + "is_virtual": true, + "name": "foo_c", + "parameters": [], + "type": "void" + } + ], + "name": "E", + "namespace": "clanguml::t00002", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00002/t00002.cc", + "line": 61 + }, + "template_parameters": [], + "type": "class" + } + ], + "relationships": [ + { + "access": "public", + "destination": "987634239855407298", + "source": "594234458687375950", + "type": "extension" + }, + { + "access": "public", + "destination": "987634239855407298", + "source": "1142499429598587507", + "type": "extension" + }, + { + "access": "private", + "destination": "987634239855407298", + "label": "as", + "source": "60950494980414724", + "type": "association" + }, + { + "access": "public", + "destination": "594234458687375950", + "source": "60950494980414724", + "type": "extension" + }, + { + "access": "public", + "destination": "1142499429598587507", + "source": "60950494980414724", + "type": "extension" + }, + { + "access": "private", + "destination": "987634239855407298", + "label": "as", + "source": "2237886670308966220", + "type": "association" + }, + { + "access": "public", + "destination": "594234458687375950", + "source": "2237886670308966220", + "type": "extension" + }, + { + "access": "public", + "destination": "1142499429598587507", + "source": "2237886670308966220", + "type": "extension" + } + ] } +)##"; + auto j = generate_class_json(diagram, *model); + + REQUIRE(j == nlohmann::json::parse(expected_json)); + + save_json(config.output_directory() + "/" + diagram->name + ".json", j); +} \ No newline at end of file diff --git a/tests/t00014/test_case.h b/tests/t00014/test_case.h index c20bedb8..f0e16d21 100644 --- a/tests/t00014/test_case.h +++ b/tests/t00014/test_case.h @@ -115,4 +115,965 @@ TEST_CASE("t00014", "[test-case][class]") REQUIRE_THAT(puml, IsDependency(_A("R"), _A("A"))); save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); + + std::string expected_json = R"##( +{ + "elements": [ + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "765890579167335652", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "public", + "is_static": false, + "name": "t", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 22 + }, + "type": "T" + }, + { + "access": "public", + "is_static": false, + "name": "p", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 23 + }, + "type": "P" + } + ], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 21 + }, + "template_parameters": [ + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "P", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::B", + "id": "934136012292043506", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "public", + "is_static": false, + "name": "value", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 27 + }, + "type": "std::string" + } + ], + "methods": [], + "name": "B", + "namespace": "clanguml::t00014", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 26 + }, + "template_parameters": [], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "2186387853087008570", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "std::string", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A>", + "id": "947292733740993297", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "std::unique_ptr", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "1700006390494465667", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "long", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "2017665567517853203", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "double", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "906557320263235873", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "long", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "U", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "378898020828430636", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "long", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "bool", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "2082013375525130414", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "double", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "bool", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "51978493292659230", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "long", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "float", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "197769253782961588", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "double", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "float", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "895940711566401184", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "bool", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "std::string", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A>", + "id": "1751732625010742161", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "float", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "std::unique_ptr", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "887121441210847583", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "int", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "std::string", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "1119452495635561975", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "std::string", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "std::string", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "640294848489463071", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "char", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "std::string", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::A", + "id": "139599686499155694", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00014", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "wchar_t", + "type": "" + }, + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "std::string", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00014::R", + "id": "1192822659863756768", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "private", + "is_static": false, + "name": "bapair", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 58 + }, + "type": "PairPairBA" + }, + { + "access": "private", + "is_static": false, + "name": "abool", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 60 + }, + "type": "APtr" + }, + { + "access": "private", + "is_static": false, + "name": "aboolfloat", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 61 + }, + "type": "AAPtr" + }, + { + "access": "private", + "is_static": false, + "name": "afloat", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 62 + }, + "type": "ASharedPtr" + }, + { + "access": "private", + "is_static": false, + "name": "boolstring", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 63 + }, + "type": "A" + }, + { + "access": "private", + "is_static": false, + "name": "floatstring", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 64 + }, + "type": "AStringPtr" + }, + { + "access": "private", + "is_static": false, + "name": "intstring", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 65 + }, + "type": "clanguml::t00014::AIntString" + }, + { + "access": "private", + "is_static": false, + "name": "stringstring", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 66 + }, + "type": "clanguml::t00014::AStringString" + }, + { + "access": "private", + "is_static": false, + "name": "bstringstring", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 67 + }, + "type": "clanguml::t00014::BStringString" + }, + { + "access": "protected", + "is_static": false, + "name": "bs", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 70 + }, + "type": "clanguml::t00014::BVector" + }, + { + "access": "public", + "is_static": false, + "name": "bs2", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 73 + }, + "type": "clanguml::t00014::BVector2" + }, + { + "access": "public", + "is_static": false, + "name": "cb", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 74 + }, + "type": "SimpleCallback" + }, + { + "access": "public", + "is_static": false, + "name": "gcb", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 75 + }, + "type": "GenericCallback" + }, + { + "access": "public", + "is_static": false, + "name": "vcb", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 76 + }, + "type": "clanguml::t00014::VoidCallback" + }, + { + "access": "public", + "is_static": false, + "name": "vps", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 77 + }, + "type": "VectorPtr" + } + ], + "methods": [], + "name": "R", + "namespace": "clanguml::t00014", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00014/t00014.cc", + "line": 55 + }, + "template_parameters": [], + "type": "class" + } + ], + "relationships": [ + { + "access": "public", + "destination": "765890579167335652", + "source": "2186387853087008570", + "type": "instantiation" + }, + { + "access": "public", + "destination": "765890579167335652", + "source": "947292733740993297", + "type": "instantiation" + }, + { + "access": "public", + "destination": "765890579167335652", + "source": "1700006390494465667", + "type": "instantiation" + }, + { + "access": "public", + "destination": "765890579167335652", + "source": "2017665567517853203", + "type": "instantiation" + }, + { + "access": "public", + "destination": "1700006390494465667", + "source": "906557320263235873", + "type": "instantiation" + }, + { + "access": "public", + "destination": "1700006390494465667", + "source": "378898020828430636", + "type": "instantiation" + }, + { + "access": "public", + "destination": "2017665567517853203", + "source": "2082013375525130414", + "type": "instantiation" + }, + { + "access": "public", + "destination": "1700006390494465667", + "source": "51978493292659230", + "type": "instantiation" + }, + { + "access": "public", + "destination": "2017665567517853203", + "source": "197769253782961588", + "type": "instantiation" + }, + { + "access": "public", + "destination": "2186387853087008570", + "source": "895940711566401184", + "type": "instantiation" + }, + { + "access": "public", + "destination": "947292733740993297", + "source": "1751732625010742161", + "type": "instantiation" + }, + { + "access": "public", + "destination": "2186387853087008570", + "source": "887121441210847583", + "type": "instantiation" + }, + { + "access": "public", + "destination": "2186387853087008570", + "source": "1119452495635561975", + "type": "instantiation" + }, + { + "access": "public", + "destination": "2186387853087008570", + "source": "640294848489463071", + "type": "instantiation" + }, + { + "access": "public", + "destination": "2186387853087008570", + "source": "139599686499155694", + "type": "instantiation" + }, + { + "access": "public", + "destination": "378898020828430636", + "source": "1192822659863756768", + "type": "dependency" + }, + { + "access": "private", + "destination": "934136012292043506", + "label": "bapair", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "private", + "destination": "378898020828430636", + "label": "bapair", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "public", + "destination": "2082013375525130414", + "source": "1192822659863756768", + "type": "dependency" + }, + { + "access": "private", + "destination": "2082013375525130414", + "label": "abool", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "public", + "destination": "51978493292659230", + "source": "1192822659863756768", + "type": "dependency" + }, + { + "access": "private", + "destination": "2082013375525130414", + "label": "aboolfloat", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "private", + "destination": "51978493292659230", + "label": "aboolfloat", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "public", + "destination": "197769253782961588", + "source": "1192822659863756768", + "type": "dependency" + }, + { + "access": "private", + "destination": "197769253782961588", + "label": "afloat", + "source": "1192822659863756768", + "type": "association" + }, + { + "access": "private", + "destination": "895940711566401184", + "label": "boolstring", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "private", + "destination": "1751732625010742161", + "label": "floatstring", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "private", + "destination": "887121441210847583", + "label": "intstring", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "private", + "destination": "1119452495635561975", + "label": "stringstring", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "private", + "destination": "1119452495635561975", + "label": "bstringstring", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "protected", + "destination": "934136012292043506", + "label": "bs", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "public", + "destination": "934136012292043506", + "label": "bs2", + "source": "1192822659863756768", + "type": "aggregation" + }, + { + "access": "public", + "destination": "640294848489463071", + "source": "1192822659863756768", + "type": "dependency" + }, + { + "access": "public", + "destination": "139599686499155694", + "source": "1192822659863756768", + "type": "dependency" + }, + { + "access": "public", + "destination": "934136012292043506", + "label": "vps", + "source": "1192822659863756768", + "type": "aggregation" + } + ] +} +)##"; + auto j = generate_class_json(diagram, *model); + + REQUIRE(j == nlohmann::json::parse(expected_json)); + + save_json(config.output_directory() + "/" + diagram->name + ".json", j); } diff --git a/tests/t00036/test_case.h b/tests/t00036/test_case.h index 4e52ada0..0a87bfa5 100644 --- a/tests/t00036/test_case.h +++ b/tests/t00036/test_case.h @@ -46,4 +46,197 @@ TEST_CASE("t00036", "[test-case][class]") REQUIRE_THAT(puml, IsAggregation(_A("B"), _A("A"), "+a_int")); save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); + + const std::string expected_json = R"##( +{ + "elements": [ + { + "display_name": "clanguml::t00036::ns1", + "elements": [ + { + "constants": [ + "blue", + "yellow" + ], + "display_name": "clanguml::t00036::ns1::E", + "id": "2144761953049158478", + "is_nested": false, + "name": "E", + "namespace": "clanguml::t00036::ns1", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00036/t00036.cc", + "line": 6 + }, + "type": "enum" + }, + { + "display_name": "clanguml::t00036::ns1::ns11", + "elements": [ + { + "bases": [], + "display_name": "clanguml::t00036::ns1::ns11::A", + "id": "571573305652194946", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "public", + "is_static": false, + "name": "a", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00036/t00036.cc", + "line": 11 + }, + "type": "T" + } + ], + "methods": [], + "name": "A", + "namespace": "clanguml::t00036::ns1::ns11", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00036/t00036.cc", + "line": 10 + }, + "template_parameters": [ + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T", + "type": "" + } + ], + "type": "class" + }, + { + "display_name": "clanguml::t00036::ns1::ns11::ns111", + "elements": [ + { + "bases": [], + "display_name": "clanguml::t00036::ns1::ns11::ns111::B", + "id": "1964031933563607376", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "public", + "is_static": false, + "name": "a_int", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00036/t00036.cc", + "line": 17 + }, + "type": "A" + } + ], + "methods": [], + "name": "B", + "namespace": "clanguml::t00036::ns1::ns11::ns111", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00036/t00036.cc", + "line": 16 + }, + "template_parameters": [], + "type": "class" + } + ], + "name": "ns111", + "type": "namespace" + }, + { + "bases": [], + "display_name": "clanguml::t00036::ns1::ns11::A", + "id": "1832710427462319797", + "is_abstract": false, + "is_nested": false, + "is_struct": false, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "A", + "namespace": "clanguml::t00036::ns1::ns11", + "template_parameters": [ + { + "is_template_parameter": false, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "int", + "type": "" + } + ], + "type": "class" + } + ], + "name": "ns11", + "type": "namespace" + } + ], + "name": "ns1", + "type": "namespace" + }, + { + "display_name": "clanguml::t00036::ns2", + "elements": [ + { + "display_name": "clanguml::t00036::ns2::ns22", + "elements": [ + { + "bases": [], + "display_name": "clanguml::t00036::ns2::ns22::C", + "id": "2038956882066165590", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "C", + "namespace": "clanguml::t00036::ns2::ns22", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00036/t00036.cc", + "line": 28 + }, + "template_parameters": [], + "type": "class" + } + ], + "name": "ns22", + "type": "namespace" + } + ], + "name": "ns2", + "type": "namespace" + } + ], + "relationships": [ + { + "access": "public", + "destination": "1832710427462319797", + "label": "a_int", + "source": "1964031933563607376", + "type": "aggregation" + }, + { + "access": "public", + "destination": "571573305652194946", + "source": "1832710427462319797", + "type": "instantiation" + } + ] +} +)##"; + + auto j = generate_class_json(diagram, *model); + + REQUIRE(j == nlohmann::json::parse(expected_json)); + + save_json(config.output_directory() + "/" + diagram->name + ".json", j); } diff --git a/tests/t00056/test_case.h b/tests/t00056/test_case.h index a1cce9f9..cdae7c0d 100644 --- a/tests/t00056/test_case.h +++ b/tests/t00056/test_case.h @@ -114,4 +114,559 @@ TEST_CASE("t00056", "[test-case][class]") _A("F"), _A("greater_than_simple"), "T1,T3")); save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml); + + const std::string expected_json = R"##( +{ + "elements": [ + { + "display_name": "clanguml::t00056::greater_than_simple", + "id": "902541696362244204", + "name": "greater_than_simple", + "namespace": "clanguml::t00056", + "parameters": [], + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 7 + }, + "statements": [], + "type": "concept" + }, + { + "display_name": "clanguml::t00056::greater_than_with_requires", + "id": "1830716585637735576", + "name": "greater_than_with_requires", + "namespace": "clanguml::t00056", + "parameters": [ + { + "name": "clanguml::t00056::l", + "type": "T" + }, + { + "name": "clanguml::t00056::r", + "type": "P" + } + ], + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 10 + }, + "statements": [ + "sizeof (l) > sizeof (r)" + ], + "type": "concept" + }, + { + "display_name": "clanguml::t00056::max_four_bytes", + "id": "385255522691733325", + "name": "max_four_bytes", + "namespace": "clanguml::t00056", + "parameters": [], + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 15 + }, + "statements": [], + "type": "concept" + }, + { + "display_name": "clanguml::t00056::iterable", + "id": "392540961352249242", + "name": "iterable", + "namespace": "clanguml::t00056", + "parameters": [ + { + "name": "clanguml::t00056::container", + "type": "T" + } + ], + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 19 + }, + "statements": [ + "container.begin()", + "container.end()" + ], + "type": "concept" + }, + { + "display_name": "clanguml::t00056::has_value_type", + "id": "1850394311226276678", + "name": "has_value_type", + "namespace": "clanguml::t00056", + "parameters": [], + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 26 + }, + "statements": [ + "typename T::value_type" + ], + "type": "concept" + }, + { + "display_name": "clanguml::t00056::convertible_to_string", + "id": "137304962071054497", + "name": "convertible_to_string", + "namespace": "clanguml::t00056", + "parameters": [ + { + "name": "clanguml::t00056::s", + "type": "T" + } + ], + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 29 + }, + "statements": [ + "std::string{s}", + "{std::to_string(s)} noexcept", + "{std::to_string(s)} -> std::same_as" + ], + "type": "concept" + }, + { + "display_name": "clanguml::t00056::iterable_with_value_type", + "id": "1043398062146751019", + "name": "iterable_with_value_type", + "namespace": "clanguml::t00056", + "parameters": [], + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 45 + }, + "statements": [], + "type": "concept" + }, + { + "display_name": "clanguml::t00056::iterable_or_small_value_type", + "id": "866345615551223718", + "name": "iterable_or_small_value_type", + "namespace": "clanguml::t00056", + "parameters": [], + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 48 + }, + "statements": [], + "type": "concept" + }, + { + "bases": [], + "display_name": "clanguml::t00056::A", + "id": "1418333499545421661", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "public", + "is_static": false, + "name": "a", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 53 + }, + "type": "T" + } + ], + "methods": [], + "name": "A", + "namespace": "clanguml::t00056", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 52 + }, + "template_parameters": [ + { + "concept_constraint": "clanguml::t00056::max_four_bytes", + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00056::B", + "id": "1814355496814977880", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "public", + "is_static": false, + "name": "b", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 60 + }, + "type": "T" + } + ], + "methods": [], + "name": "B", + "namespace": "clanguml::t00056", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 59 + }, + "template_parameters": [ + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00056::C", + "id": "1512618198241549089", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "public", + "is_static": false, + "name": "c", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 70 + }, + "type": "T" + } + ], + "methods": [], + "name": "C", + "namespace": "clanguml::t00056", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 69 + }, + "template_parameters": [ + { + "concept_constraint": "clanguml::t00056::convertible_to_string", + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00056::D", + "id": "1635109601630198093", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [], + "methods": [], + "name": "D", + "namespace": "clanguml::t00056", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 75 + }, + "template_parameters": [ + { + "concept_constraint": "clanguml::t00056::iterable", + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T1", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T2", + "type": "" + }, + { + "concept_constraint": "clanguml::t00056::iterable", + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T3", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T4", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T5", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00056::E", + "id": "1429225801945621089", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "public", + "is_static": false, + "name": "e1", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 80 + }, + "type": "T1" + }, + { + "access": "public", + "is_static": false, + "name": "e2", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 81 + }, + "type": "T2" + }, + { + "access": "public", + "is_static": false, + "name": "e3", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 82 + }, + "type": "T3" + } + ], + "methods": [], + "name": "E", + "namespace": "clanguml::t00056", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 79 + }, + "template_parameters": [ + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T1", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T2", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T3", + "type": "" + } + ], + "type": "class" + }, + { + "bases": [], + "display_name": "clanguml::t00056::F", + "id": "856301122972546034", + "is_abstract": false, + "is_nested": false, + "is_struct": true, + "is_template": false, + "is_union": false, + "members": [ + { + "access": "public", + "is_static": false, + "name": "f1", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 88 + }, + "type": "T1" + }, + { + "access": "public", + "is_static": false, + "name": "f2", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 89 + }, + "type": "T2" + }, + { + "access": "public", + "is_static": false, + "name": "f3", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 90 + }, + "type": "T3" + } + ], + "methods": [], + "name": "F", + "namespace": "clanguml::t00056", + "source_location": { + "file": "/home/bartek/devel/clang-uml/tests/t00056/t00056.cc", + "line": 87 + }, + "template_parameters": [ + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T1", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T2", + "type": "" + }, + { + "is_template_parameter": true, + "is_template_template_parameter": false, + "is_variadic": false, + "name": "T3", + "type": "" + } + ], + "type": "class" + } + ], + "relationships": [ + { + "destination": "385255522691733325", + "label": "T", + "source": "137304962071054497", + "type": "constraint" + }, + { + "destination": "392540961352249242", + "label": "T", + "source": "1043398062146751019", + "type": "constraint" + }, + { + "destination": "1850394311226276678", + "label": "T", + "source": "1043398062146751019", + "type": "constraint" + }, + { + "destination": "1043398062146751019", + "label": "T", + "source": "866345615551223718", + "type": "constraint" + }, + { + "destination": "385255522691733325", + "label": "T", + "source": "866345615551223718", + "type": "constraint" + }, + { + "destination": "385255522691733325", + "label": "T", + "source": "1418333499545421661", + "type": "constraint" + }, + { + "destination": "866345615551223718", + "label": "T", + "source": "1814355496814977880", + "type": "constraint" + }, + { + "destination": "137304962071054497", + "label": "T", + "source": "1512618198241549089", + "type": "constraint" + }, + { + "destination": "392540961352249242", + "label": "T1", + "source": "1635109601630198093", + "type": "constraint" + }, + { + "destination": "392540961352249242", + "label": "T3", + "source": "1635109601630198093", + "type": "constraint" + }, + { + "destination": "385255522691733325", + "label": "T2", + "source": "1635109601630198093", + "type": "constraint" + }, + { + "destination": "385255522691733325", + "label": "T5", + "source": "1635109601630198093", + "type": "constraint" + }, + { + "destination": "1830716585637735576", + "label": "T1,T3", + "source": "1429225801945621089", + "type": "constraint" + }, + { + "destination": "902541696362244204", + "label": "T1,T3", + "source": "856301122972546034", + "type": "constraint" + } + ] +} +)##"; + auto j = generate_class_json(diagram, *model); + + REQUIRE(j == nlohmann::json::parse(expected_json)); + + save_json(config.output_directory() + "/" + diagram->name + ".json", j); } \ No newline at end of file diff --git a/tests/test_cases.cc b/tests/test_cases.cc index e3434ef0..c7b52c8c 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -156,6 +156,20 @@ std::string generate_class_puml( return ss.str(); } +nlohmann::json generate_class_json( + std::shared_ptr config, + clanguml::class_diagram::model::diagram &model) +{ + using namespace clanguml::class_diagram::generators::json; + + std::stringstream ss; + + ss << generator( + dynamic_cast(*config), model); + + return nlohmann::json::parse(ss.str()); +} + std::string generate_package_puml( std::shared_ptr config, clanguml::package_diagram::model::diagram &model) @@ -198,6 +212,16 @@ void save_puml(const std::string &path, const std::string &puml) ofs.close(); } +void save_json(const std::string &path, const nlohmann::json &j) +{ + std::filesystem::path p{path}; + std::filesystem::create_directory(p.parent_path()); + std::ofstream ofs; + ofs.open(p, std::ofstream::out | std::ofstream::trunc); + ofs << std::setw(2) << j; + ofs.close(); +} + using namespace clanguml::test::matchers; ///