From 22d8c8f0ddcdd8ad1eb3ee2200ecb883ffd72649 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Wed, 19 Apr 2023 22:21:41 -0500 Subject: [PATCH] Sketcher: Add gtest unit test framework --- src/Mod/Sketcher/App/planegcs/Constraints.h | 3 +- src/Mod/Sketcher/App/planegcs/GCS.h | 15 +++++- tests/CMakeLists.txt | 5 ++ tests/src/Mod/Sketcher/App/CMakeLists.txt | 1 + .../Mod/Sketcher/App/planegcs/CMakeLists.txt | 5 ++ tests/src/Mod/Sketcher/App/planegcs/GCS.cpp | 50 +++++++++++++++++++ tests/src/Mod/Sketcher/CMakeLists.txt | 1 + 7 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 tests/src/Mod/Sketcher/App/CMakeLists.txt create mode 100644 tests/src/Mod/Sketcher/App/planegcs/CMakeLists.txt create mode 100644 tests/src/Mod/Sketcher/App/planegcs/GCS.cpp create mode 100644 tests/src/Mod/Sketcher/CMakeLists.txt diff --git a/src/Mod/Sketcher/App/planegcs/Constraints.h b/src/Mod/Sketcher/App/planegcs/Constraints.h index eea3a0208e..6f2144e166 100644 --- a/src/Mod/Sketcher/App/planegcs/Constraints.h +++ b/src/Mod/Sketcher/App/planegcs/Constraints.h @@ -24,6 +24,7 @@ #define PLANEGCS_CONSTRAINTS_H #include "Geo.h" +#include "../../SketcherGlobal.h" //#define _GCS_EXTRACT_SOLVER_SUBSYSTEM_ // This enables debugging code intended to extract information to file bug reports against Eigen, not for production code @@ -96,7 +97,7 @@ namespace GCS HyperbolaNegativeMinorY = 17 }; - class Constraint + class SketcherExport Constraint { public: diff --git a/src/Mod/Sketcher/App/planegcs/GCS.h b/src/Mod/Sketcher/App/planegcs/GCS.h index a5e9174166..b572244a4b 100644 --- a/src/Mod/Sketcher/App/planegcs/GCS.h +++ b/src/Mod/Sketcher/App/planegcs/GCS.h @@ -26,6 +26,7 @@ #include #include "SubSystem.h" +#include "../../SketcherGlobal.h" #define EIGEN_VERSION (EIGEN_WORLD_VERSION * 10000 \ @@ -98,7 +99,7 @@ namespace GCS DefaultTemporaryConstraint = -1 }; - class System + class SketcherExport System { // This is the main class. It holds all constraints and information // about partitioning into subsystems and solution strategies @@ -449,6 +450,18 @@ namespace GCS } void invalidatedDiagnosis(); + + // Unit testing interface - not intended for use by production code + protected: + size_t _getNumberOfConstraints(int tagID = -1) + { + if (tagID < 0) { + return clist.size(); + } + return std::count_if(clist.begin(), clist.end(), [tagID](Constraint* constraint) { + return constraint->getTag() == tagID; + }); + } }; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f290074394..72fada6d0f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -38,3 +38,8 @@ add_executable(Tests_run) add_subdirectory(lib) add_subdirectory(src) target_link_libraries(Tests_run gtest_main ${Google_Tests_LIBS} FreeCADApp) + +add_executable(Sketcher_tests_run) +add_subdirectory(src/Mod/Sketcher) +target_include_directories(Sketcher_tests_run PUBLIC ${EIGEN3_INCLUDE_DIR}) +target_link_libraries(Sketcher_tests_run gtest_main ${Google_Tests_LIBS} Sketcher) diff --git a/tests/src/Mod/Sketcher/App/CMakeLists.txt b/tests/src/Mod/Sketcher/App/CMakeLists.txt new file mode 100644 index 0000000000..425a06675b --- /dev/null +++ b/tests/src/Mod/Sketcher/App/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(planegcs) diff --git a/tests/src/Mod/Sketcher/App/planegcs/CMakeLists.txt b/tests/src/Mod/Sketcher/App/planegcs/CMakeLists.txt new file mode 100644 index 0000000000..dffcf38874 --- /dev/null +++ b/tests/src/Mod/Sketcher/App/planegcs/CMakeLists.txt @@ -0,0 +1,5 @@ +target_sources( + Sketcher_tests_run + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/GCS.cpp +) diff --git a/tests/src/Mod/Sketcher/App/planegcs/GCS.cpp b/tests/src/Mod/Sketcher/App/planegcs/GCS.cpp new file mode 100644 index 0000000000..fcbc16280c --- /dev/null +++ b/tests/src/Mod/Sketcher/App/planegcs/GCS.cpp @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "gtest/gtest.h" + +#include "Mod/Sketcher/App/planegcs/GCS.h" + +class SystemTest : public GCS::System{ +public: + size_t getNumberOfConstraints(int tagID = -1) { + return _getNumberOfConstraints(tagID); + } +}; + +class GCSTest: public ::testing::Test +{ +protected: + void SetUp() override + { + _system = std::make_unique(); + } + + void TearDown() override + { + _system.reset(); + } + + SystemTest* System() + { + return _system.get(); + } + +private: + std::unique_ptr _system; +}; + +TEST_F(GCSTest, clearConstraints) // NOLINT +{ + // Arrange + const size_t numConstraints {100}; + for (size_t i = 0; i < numConstraints; ++i) { + System()->addConstraint(new GCS::Constraint()); + } + ASSERT_EQ(numConstraints, System()->getNumberOfConstraints()); + + // Act + System()->clear(); + + // Assert + EXPECT_EQ(0, System()->getNumberOfConstraints()); +} diff --git a/tests/src/Mod/Sketcher/CMakeLists.txt b/tests/src/Mod/Sketcher/CMakeLists.txt new file mode 100644 index 0000000000..14c361067f --- /dev/null +++ b/tests/src/Mod/Sketcher/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(App)