From 8a59350de83010292808e0d1b4641ee9bfd3e737 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 27 Aug 2023 17:59:40 +0200 Subject: [PATCH] Mesh: add unit tests --- src/Mod/Mesh/App/Core/KDTree.cpp | 2 +- src/Mod/Mesh/App/Core/KDTree.h | 2 +- tests/CMakeLists.txt | 2 + tests/src/Mod/CMakeLists.txt | 2 + tests/src/Mod/Mesh/App/CMakeLists.txt | 6 ++ tests/src/Mod/Mesh/App/Core/KDTree.cpp | 91 ++++++++++++++++++++++++++ tests/src/Mod/Mesh/App/Mesh.cpp | 21 ++++++ tests/src/Mod/Mesh/CMakeLists.txt | 15 +++++ 8 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 tests/src/Mod/Mesh/App/CMakeLists.txt create mode 100644 tests/src/Mod/Mesh/App/Core/KDTree.cpp create mode 100644 tests/src/Mod/Mesh/App/Mesh.cpp create mode 100644 tests/src/Mod/Mesh/CMakeLists.txt diff --git a/src/Mod/Mesh/App/Core/KDTree.cpp b/src/Mod/Mesh/App/Core/KDTree.cpp index ee4ae5a2b0..e7c50a88c9 100644 --- a/src/Mod/Mesh/App/Core/KDTree.cpp +++ b/src/Mod/Mesh/App/Core/KDTree.cpp @@ -108,7 +108,7 @@ MeshKDTree::~MeshKDTree() delete d; } -void MeshKDTree::AddPoint(Base::Vector3f& point) +void MeshKDTree::AddPoint(const Base::Vector3f& point) { PointIndex index=d->kd_tree.size(); d->kd_tree.insert(Point3d(point, index)); diff --git a/src/Mod/Mesh/App/Core/KDTree.h b/src/Mod/Mesh/App/Core/KDTree.h index c3b3d97e08..fbe74c2254 100644 --- a/src/Mod/Mesh/App/Core/KDTree.h +++ b/src/Mod/Mesh/App/Core/KDTree.h @@ -37,7 +37,7 @@ public: explicit MeshKDTree(const MeshPointArray& points); ~MeshKDTree(); - void AddPoint(Base::Vector3f& point); + void AddPoint(const Base::Vector3f& point); void AddPoints(const std::vector& points); void AddPoints(const MeshPointArray& points); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5af6ce9427..c10aeabb6e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -66,7 +66,9 @@ function(setup_qt_test) endfunction() add_executable(Tests_run) +add_executable(Mesh_tests_run) add_executable(Part_tests_run) +add_executable(Points_tests_run) add_subdirectory(lib) add_subdirectory(src) target_include_directories(Tests_run PUBLIC diff --git a/tests/src/Mod/CMakeLists.txt b/tests/src/Mod/CMakeLists.txt index 22666473d0..3832eeb0fe 100644 --- a/tests/src/Mod/CMakeLists.txt +++ b/tests/src/Mod/CMakeLists.txt @@ -1 +1,3 @@ +add_subdirectory(Mesh) add_subdirectory(Part) +add_subdirectory(Points) diff --git a/tests/src/Mod/Mesh/App/CMakeLists.txt b/tests/src/Mod/Mesh/App/CMakeLists.txt new file mode 100644 index 0000000000..7b7d537599 --- /dev/null +++ b/tests/src/Mod/Mesh/App/CMakeLists.txt @@ -0,0 +1,6 @@ +target_sources( + Mesh_tests_run + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/Core/KDTree.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Mesh.cpp +) diff --git a/tests/src/Mod/Mesh/App/Core/KDTree.cpp b/tests/src/Mod/Mesh/App/Core/KDTree.cpp new file mode 100644 index 0000000000..7935f3da0e --- /dev/null +++ b/tests/src/Mod/Mesh/App/Core/KDTree.cpp @@ -0,0 +1,91 @@ +#include "gtest/gtest.h" +#include + +// NOLINTBEGIN(cppcoreguidelines-*,readability-*) + +class KDTreeTest: public ::testing::Test +{ +protected: + void SetUp() override + { + points.emplace_back(0, 0, 0); + points.emplace_back(0, 0, 1); + points.emplace_back(0, 1, 0); + points.emplace_back(0, 1, 1); + points.emplace_back(1, 0, 0); + points.emplace_back(1, 0, 1); + points.emplace_back(1, 1, 0); + points.emplace_back(1, 1, 1); + } + + void TearDown() override + {} + + const std::vector& GetPoints() const + { + return points; + } + +private: + std::vector points; +}; + +TEST_F(KDTreeTest, TestKDTreeEmpty) +{ + MeshCore::MeshKDTree tree; + EXPECT_EQ(tree.IsEmpty(), true); +} + +TEST_F(KDTreeTest, TestKDTreeNearestEmpty) +{ + MeshCore::MeshKDTree tree; + + Base::Vector3f pnt; + Base::Vector3f nor; + float dist; + EXPECT_EQ(tree.FindNearest(pnt, nor, dist), MeshCore::POINT_INDEX_MAX); +} + +TEST_F(KDTreeTest, TestKDTreeNearest) +{ + MeshCore::MeshKDTree tree; + tree.AddPoints(GetPoints()); + EXPECT_EQ(tree.IsEmpty(), false); + + Base::Vector3f nor; + float dist; + EXPECT_EQ(tree.FindNearest(Base::Vector3f(0.9F, 0.1F, 0.1F), nor, dist), 4); +} + +TEST_F(KDTreeTest, TestKDTreeNearestMaxDist) +{ + MeshCore::MeshKDTree tree; + tree.AddPoints(GetPoints()); + EXPECT_EQ(tree.IsEmpty(), false); + + Base::Vector3f nor; + float dist; + EXPECT_EQ(tree.FindNearest(Base::Vector3f(0.9F, 0.1F, 0.1F), 0.0F, nor, dist), + MeshCore::POINT_INDEX_MAX); +} + +TEST_F(KDTreeTest, TestKDTreeFindExact) +{ + MeshCore::MeshKDTree tree; + tree.AddPoints(GetPoints()); + + EXPECT_EQ(tree.FindExact(Base::Vector3f(0.1F, 0, 0)), MeshCore::POINT_INDEX_MAX); + EXPECT_EQ(tree.FindExact(Base::Vector3f(0, 0, 0)), 0); +} + +TEST_F(KDTreeTest, TestKDTreeFindRange) +{ + MeshCore::MeshKDTree tree; + tree.AddPoints(GetPoints()); + + std::vector index; + std::vector result = {0, 4}; + tree.FindInRange(Base::Vector3f(0.5F, 0, 0), 0.6F, index); + EXPECT_EQ(index, result); +} +// NOLINTEND(cppcoreguidelines-*,readability-*) diff --git a/tests/src/Mod/Mesh/App/Mesh.cpp b/tests/src/Mod/Mesh/App/Mesh.cpp new file mode 100644 index 0000000000..9f578782af --- /dev/null +++ b/tests/src/Mod/Mesh/App/Mesh.cpp @@ -0,0 +1,21 @@ +#include "gtest/gtest.h" +#include + +// NOLINTBEGIN(cppcoreguidelines-*,readability-*) +TEST(MeshTest, TestDefault) +{ + MeshCore::MeshKernel kernel; + Base::Vector3f p1 { + 0, + 0, + 0, + }; + Base::Vector3f p2 {0, 0, 1}; + Base::Vector3f p3 {0, 1, 0}; + kernel.AddFacet(MeshCore::MeshGeomFacet(p1, p2, p3)); + + EXPECT_EQ(kernel.CountPoints(), 3); + EXPECT_EQ(kernel.CountEdges(), 3); + EXPECT_EQ(kernel.CountFacets(), 1); +} +// NOLINTEND(cppcoreguidelines-*,readability-*) diff --git a/tests/src/Mod/Mesh/CMakeLists.txt b/tests/src/Mod/Mesh/CMakeLists.txt new file mode 100644 index 0000000000..6796225c45 --- /dev/null +++ b/tests/src/Mod/Mesh/CMakeLists.txt @@ -0,0 +1,15 @@ + +target_include_directories(Mesh_tests_run PUBLIC + ${EIGEN3_INCLUDE_DIR} + ${OCC_INCLUDE_DIR} + ${Python3_INCLUDE_DIRS} + ${XercesC_INCLUDE_DIRS} +) + +target_link_libraries(Mesh_tests_run + gtest_main + ${Google_Tests_LIBS} + Mesh +) + +add_subdirectory(App)