From 9e1d7786b97b3539954319f522bd387e20d0efc4 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 21 Feb 2021 20:53:00 +0100 Subject: [PATCH] Added class diagram test --- .github/workflows/build.yml | 1 + Makefile | 4 ++- src/config/config.h | 4 +++ tests/CMakeLists.txt | 2 ++ tests/t00002/.clanguml | 17 ++++++++++ tests/t00002/t00002.cc | 21 +++++++++++++ tests/test_cases.cc | 62 ++++++++++++++++++++++++++++++++++++- 7 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 tests/t00002/.clanguml create mode 100644 tests/t00002/t00002.cc diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5619268d..bc6d71cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,3 +12,4 @@ jobs: - name: Build and unit test run: | make debug + make test diff --git a/Makefile b/Makefile index 83ef3ec1..854ff029 100644 --- a/Makefile +++ b/Makefile @@ -37,11 +37,13 @@ release/CMakeLists.txt: debug: debug/CMakeLists.txt make -C debug -j - make -C debug test release: release/CMakeLists.txt make -C release -j +test: debug + CTEST_OUTPUT_ON_FAILURE=1 make -C debug test + .PHONY: clang-format clang-format: docker run --rm -v $(CURDIR):/root/sources bkryza/clang-format-check:1.2 diff --git a/src/config/config.h b/src/config/config.h index de386634..d235eede 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -119,6 +119,7 @@ struct config { // directory std::vector glob; std::string compilation_database_dir{"."}; + std::string output_directory{}; std::map> diagrams; }; @@ -242,6 +243,9 @@ template <> struct convert { if (node["glob"]) rhs.glob = node["glob"].as>(); + if (node["output_directory"]) + rhs.output_directory = node["output_directory"].as(); + if (node["compilation_database_dir"]) rhs.compilation_database_dir = node["compilation_database_dir"].as(); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index c772913e..6a13a1df 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -7,6 +7,7 @@ set(CMAKE_CXX_STANDARD 17) set(CLANG_UML_TEST_CASES_SRC test_cases.cc t00001/t00001.cc + t00002/t00002.cc ) set(CLANG_UML_TEST_CASES_HEADER catch.h @@ -23,5 +24,6 @@ target_link_libraries(test_cases spdlog::spdlog clang-umllib) configure_file(t00001/.clanguml t00001/.clanguml COPYONLY) +configure_file(t00002/.clanguml t00002/.clanguml COPYONLY) add_test(NAME test_cases COMMAND test_cases) diff --git a/tests/t00002/.clanguml b/tests/t00002/.clanguml new file mode 100644 index 00000000..d1f97578 --- /dev/null +++ b/tests/t00002/.clanguml @@ -0,0 +1,17 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00002_class: + type: class + glob: + - ../../tests/t00002/t00002.cc + using_namespace: + - clanguml::t00002 + include: + namespaces: + - clanguml::t00002 + plantuml: + before: + - "' t00002 test class diagram" + after: + - 'note over "A": A class' diff --git a/tests/t00002/t00002.cc b/tests/t00002/t00002.cc new file mode 100644 index 00000000..e85a9bb6 --- /dev/null +++ b/tests/t00002/t00002.cc @@ -0,0 +1,21 @@ +#include + +namespace clanguml { +namespace t00002 { + +class A { +public: + virtual void foo() {} +}; + +class B : public A { +}; + +class C : public A { +}; + +class D : public B, public C { + std::vector as; +}; +} +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index f6bbf03b..adb7e527 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -41,7 +41,7 @@ auto generate_sequence_diagram(compilation_database &db, } auto generate_class_diagram(compilation_database &db, - std::shared_ptr diagram) + std::shared_ptr diagram) { auto diagram_model = clanguml::generators::class_diagram::generate(db, diagram->name, @@ -64,6 +64,31 @@ std::string generate_sequence_puml( return ss.str(); } +std::string generate_class_puml( + std::shared_ptr config, + clanguml::model::class_diagram::diagram &model) +{ + using namespace clanguml::generators::class_diagram::puml; + + std::stringstream ss; + + ss << generator( + dynamic_cast(*config), model); + + return ss.str(); +} + +void save_puml(const std::string &path, const std::string &puml) +{ + std::filesystem::path p{path}; + spdlog::error("PWD: {}", std::filesystem::current_path().string()); + spdlog::error("SAVING TEST PWD {} DIAGRAM: {}", p.string()); + std::ofstream ofs; + ofs.open(p, std::ofstream::out | std::ofstream::trunc); + ofs << puml; + ofs.close(); +} + TEST_CASE("Test t00001", "[unit-test]") { spdlog::set_level(spdlog::level::debug); @@ -94,4 +119,39 @@ TEST_CASE("Test t00001", "[unit-test]") REQUIRE_THAT(puml, StartsWith("@startuml")); REQUIRE_THAT(puml, EndsWith("@enduml\n")); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} + +TEST_CASE("Test t00002", "[unit-test]") +{ + spdlog::set_level(spdlog::level::debug); + + auto [config, db] = load_config("t00002"); + + auto diagram = config.diagrams["t00002_class"]; + + REQUIRE(diagram->name == "t00002_class"); + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t00002"})); + + REQUIRE(diagram->exclude.namespaces.size() == 0); + + REQUIRE(diagram->should_include("clanguml::t00002::A")); + REQUIRE(!diagram->should_include("std::vector")); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name == "t00002_class"); + + auto puml = generate_class_puml(diagram, model); + + REQUIRE_THAT(puml, StartsWith("@startuml")); + REQUIRE_THAT(puml, EndsWith("@enduml\n")); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); }