diff --git a/tests/src/Mod/Part/App/CMakeLists.txt b/tests/src/Mod/Part/App/CMakeLists.txt index bfd77aea3b..3a3e19dade 100644 --- a/tests/src/Mod/Part/App/CMakeLists.txt +++ b/tests/src/Mod/Part/App/CMakeLists.txt @@ -16,6 +16,7 @@ target_sources( ${CMAKE_CURRENT_SOURCE_DIR}/FeaturePartCut.cpp ${CMAKE_CURRENT_SOURCE_DIR}/FeaturePartFuse.cpp ${CMAKE_CURRENT_SOURCE_DIR}/FeatureRevolution.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Geometry.cpp ${CMAKE_CURRENT_SOURCE_DIR}/PartFeature.cpp ${CMAKE_CURRENT_SOURCE_DIR}/PartFeatures.cpp ${CMAKE_CURRENT_SOURCE_DIR}/PartTestHelpers.cpp diff --git a/tests/src/Mod/Part/App/Geometry.cpp b/tests/src/Mod/Part/App/Geometry.cpp new file mode 100644 index 0000000000..025bced432 --- /dev/null +++ b/tests/src/Mod/Part/App/Geometry.cpp @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include + +#include +#include "Mod/Part/App/Geometry.h" +#include +#include +#include "PartTestHelpers.h" +#include "App/MappedElement.h" + +// using namespace Part; +// using namespace PartTestHelpers; + +class GeometryTest: public ::testing::Test, public PartTestHelpers::PartTestHelperClass +{ +protected: + static void SetUpTestSuite() + { + tests::initApplication(); + } + + void SetUp() override + { + createTestDoc(); + } + + void TearDown() override + {} +}; + +TEST_F(GeometryTest, testTrimBSpline) +{ + // Arrange + // create arbitrary B-splines periodic and non-periodic, with arbitrary knots + // NOTE: Avoid B-spline with typical knots like those ranging from [0,1] or [-1,1] + int degree = 3; + std::vector poles; + poles.emplace_back(1, 0, 0); + poles.emplace_back(1, 1, 0); + poles.emplace_back(1, 0.5, 0); + poles.emplace_back(0, 1, 0); + poles.emplace_back(0, 0, 0); + std::vector weights(5, 1.0); + std::vector knotsNonPeriodic = {0.0, 1.0, 2.0}; + std::vector multiplicitiesNonPeriodic = {degree + 1, 1, degree + 1}; + Part::GeomBSplineCurve nonPeriodicBSpline1(poles, + weights, + knotsNonPeriodic, + multiplicitiesNonPeriodic, + degree, + false); + Part::GeomBSplineCurve nonPeriodicBSpline2(poles, + weights, + knotsNonPeriodic, + multiplicitiesNonPeriodic, + degree, + false); + std::vector knotsPeriodic = {0.0, 0.3, 1.0, 1.5, 1.8, 2.0}; + double period = knotsPeriodic.back() - knotsPeriodic.front(); + std::vector multiplicitiesPeriodic(6, 1); + Part::GeomBSplineCurve periodicBSpline1(poles, + weights, + knotsPeriodic, + multiplicitiesPeriodic, + degree, + true); + Part::GeomBSplineCurve periodicBSpline2(poles, + weights, + knotsPeriodic, + multiplicitiesPeriodic, + degree, + true); + // NOTE: These should be within the knot range, with param1 < param2 + double param1 = 0.5, param2 = 1.4; + // TODO: Decide what to do if params are outside the range + + // Act + periodicBSpline1.Trim(param1, param2); + periodicBSpline2.Trim(param2, param1); + nonPeriodicBSpline1.Trim(param1, param2); + // TODO: What happens when a non-periodic B-spline is trimmed this way? + nonPeriodicBSpline2.Trim(param2, param1); + + // Assert + EXPECT_DOUBLE_EQ(periodicBSpline1.getFirstParameter(), param1); + EXPECT_DOUBLE_EQ(periodicBSpline1.getLastParameter(), param2); + EXPECT_DOUBLE_EQ(periodicBSpline2.getFirstParameter(), param2); + EXPECT_DOUBLE_EQ(periodicBSpline2.getLastParameter(), param1 + period); + EXPECT_DOUBLE_EQ(nonPeriodicBSpline1.getFirstParameter(), param1); + EXPECT_DOUBLE_EQ(nonPeriodicBSpline1.getLastParameter(), param2); +}