diff --git a/tests/src/Mod/Part/App/FeatureFillet.cpp b/tests/src/Mod/Part/App/FeatureFillet.cpp new file mode 100644 index 0000000000..61289d4e7b --- /dev/null +++ b/tests/src/Mod/Part/App/FeatureFillet.cpp @@ -0,0 +1,162 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "gtest/gtest.h" + +#include + +#include "PartTestHelpers.h" + +std::vector _getFilletEdges(std::vector edges = {1,2}, double startRadius = 0.3, double endRadius = 0.3) { + std::vector filletElements; + for ( auto e : edges ) { + Part::FilletElement fe = {e, startRadius, endRadius}; + filletElements.push_back(fe); + } + return filletElements; +} + + +class FeatureFilletTest: public ::testing::Test, public PartTestHelpers::PartTestHelperClass +{ +protected: + static void SetUpTestSuite() + { + tests::initApplication(); + } + + void SetUp() override + { + createTestFile(); + _box1obj->Length.setValue(4); + _box1obj->Width.setValue(5); + _box1obj->Height.setValue(6); + _box1obj->Placement.setValue( + Base::Placement(Base::Vector3d(), Base::Rotation(), Base::Vector3d())); + _box2obj->Placement.setValue( + Base::Placement(Base::Vector3d(0, 1, 6), Base::Rotation(), Base::Vector3d())); + _box2obj->Length.setValue(1); + _box2obj->Width.setValue(2); + _box2obj->Height.setValue(3); + _fused = static_cast(_doc->addObject("Part::Fuse")); + _fused->Base.setValue(_box1obj); + _fused->Tool.setValue(_box2obj); + _fused->execute(); + _fillet = static_cast(_doc->addObject("Part::Fillet")); + } + + void TearDown() override + {} + + Part::Fuse *_fused; + Part::Fillet* _fillet; +}; + +TEST_F(FeatureFilletTest, testInner) +{ + // Arrange + _fillet->Base.setValue(_fused); + Part::TopoShape rf = _fused->Shape.getValue(); + std::vector get = rf.getElementTypes(); + ASSERT_EQ(get.size(),3); + EXPECT_STREQ(get[0],"Face"); + EXPECT_STREQ(get[1],"Edge"); + EXPECT_STREQ(get[2],"Vertex"); + unsigned long sec = rf.countSubElements("Edge"); + EXPECT_EQ(sec,25); + _fused->Refine.setValue(true); + _fused->execute(); + rf = _fused->Shape.getValue(); + sec = rf.countSubElements("Edge"); + EXPECT_EQ(sec,24); + + _fillet->Edges.setValues(_getFilletEdges()); + + // Act + double volume; + + volume = PartTestHelpers::getVolume(_fused->Shape.getValue()); + EXPECT_DOUBLE_EQ(volume,126.0); + volume = PartTestHelpers::getVolume(_fillet->Shape.getValue()); + EXPECT_DOUBLE_EQ(volume,0.0); + _fillet->execute(); + volume = PartTestHelpers::getVolume(_fillet->Shape.getValue()); + EXPECT_DOUBLE_EQ(volume,125.80944686460914); +} + +TEST_F(FeatureFilletTest, testOuter) +{ + // Arrange + _fillet->Base.setValue(_fused); + _fillet->Edges.setValues(_getFilletEdges({3,4,5,6,7,8,9,10})); + + // Act + _fillet->execute(); + Part::TopoShape ts = _fillet->Shape.getValue(); +} + +// Hmmmm... FeaturePartCommon with insufficent parameters says MustExecute false, +// but FeatureFillet says MustExecute true ... Neither of these should really +// happen, though. + +TEST_F(FeatureFilletTest, testMustExecute) +{ + // Act + // short mE = _fillet->mustExecute(); + // // Assert + // EXPECT_FALSE(mE); + // _fillet->Base.setValue(_box1obj); + // // Assert + // mE = _fillet->mustExecute(); + // EXPECT_FALSE(mE); + // // Act + // // _fillet->Edges.setValue(_box2obj); + // // Assert + // mE = _fillet->mustExecute(); + // EXPECT_TRUE(mE); + // _doc->recompute(); + // mE = _fillet->mustExecute(); + // EXPECT_FALSE(mE); +} + +TEST_F(FeatureFilletTest, testGetProviderName) +{ + // Act + _fillet->execute(); + const char* name = _fillet->getViewProviderName(); + // Assert + EXPECT_STREQ(name, "PartGui::ViewProviderFillet"); +} + + +// TEST_F(FeatureFilletTest, testHistory) +// { +// // Arrange +// _fillet->Base.setValue(_box1obj); +// _fillet->Tool.setValue(_box2obj); + +// // Act and Assert +// std::vector hist = _fillet->History.getValues(); +// EXPECT_EQ(hist.size(), 0); + +// // This creates the histories classically generated by FreeCAD for comparison +// using MapList = std::map>; +// using List = std::vector; +// MapList compare1 = +// {{0, List {0}}, {1, List {5}}, {2, List()}, {3, List {2}}, {4, List {3}}, {5, List {1}}}; +// MapList compare2 = +// {{0, List {0}}, {1, List {5}}, {2, List {4}}, {3, List()}, {4, List {3}}, {5, List {1}}}; + +// _fillet->execute(); +// hist = _fillet->History.getValues(); +// EXPECT_EQ(hist.size(), 2); +// EXPECT_EQ(hist[0].shapeMap, compare1); +// EXPECT_EQ(hist[1].shapeMap, compare2); +// _fillet->Base.setValue(_box2obj); +// _fillet->Tool.setValue(_box1obj); +// _fillet->execute(); +// hist = _fillet->History.getValues(); +// // std::cout << testing::PrintToString(hist[0]) << testing::PrintToString(hist[1]); +// EXPECT_EQ(hist.size(), 2); +// EXPECT_EQ(hist[1].shapeMap, compare1); +// EXPECT_EQ(hist[0].shapeMap, compare2); +// } diff --git a/tests/src/Mod/Part/App/FeaturePartCommon.cpp b/tests/src/Mod/Part/App/FeaturePartCommon.cpp index ef460523ff..6023eabfed 100644 --- a/tests/src/Mod/Part/App/FeaturePartCommon.cpp +++ b/tests/src/Mod/Part/App/FeaturePartCommon.cpp @@ -19,13 +19,13 @@ protected: void SetUp() override { createTestDoc(); - _common = static_cast(_doc->addObject("Part::Common")); + _common = dynamic_cast(_doc->addObject("Part::Common")); } void TearDown() override {} - Part::Common* _common; + Part::Common* _common; // NOLINT Can't be private in a test framework }; TEST_F(FeaturePartCommonTest, testIntersecting) @@ -106,7 +106,7 @@ TEST_F(FeaturePartCommonTest, testBarelyIntersecting) { // Arrange _common->Base.setValue(_boxes[0]); - _common->Tool.setValue(_boxes[5]); + _common->Tool.setValue(_boxes[5]); // NOLINT magic number // Act _common->execute(); @@ -165,9 +165,9 @@ TEST_F(FeaturePartCommonTest, testHistory) using MapList = std::map>; using List = std::vector; MapList compare1 = - {{0, List {0}}, {1, List {5}}, {2, List()}, {3, List {2}}, {4, List {3}}, {5, List {1}}}; + {{0, List {0}}, {1, List {5}}, {2, List()}, {3, List {2}}, {4, List {3}}, {5, List {1}}}; // NOLINT magic number MapList compare2 = - {{0, List {0}}, {1, List {5}}, {2, List {4}}, {3, List()}, {4, List {3}}, {5, List {1}}}; + {{0, List {0}}, {1, List {5}}, {2, List {4}}, {3, List()}, {4, List {3}}, {5, List {1}}}; // NOLINT magic number // Act and Assert no histories yet std::vector hist = _common->History.getValues(); diff --git a/tests/src/Mod/Part/App/FeaturePartCut.cpp b/tests/src/Mod/Part/App/FeaturePartCut.cpp index 3b12aede87..29276e4566 100644 --- a/tests/src/Mod/Part/App/FeaturePartCut.cpp +++ b/tests/src/Mod/Part/App/FeaturePartCut.cpp @@ -18,13 +18,13 @@ protected: void SetUp() override { createTestDoc(); - _cut = static_cast(_doc->addObject("Part::Cut")); + _cut = dynamic_cast(_doc->addObject("Part::Cut")); } void TearDown() override {} - Part::Cut* _cut; + Part::Cut* _cut; // NOLINT Can't be private in a test framework }; TEST_F(FeaturePartCutTest, testIntersecting) @@ -123,7 +123,7 @@ TEST_F(FeaturePartCutTest, testBarelyIntersecting) { // Arrange _cut->Base.setValue(_boxes[0]); - _cut->Tool.setValue(_boxes[5]); + _cut->Tool.setValue(_boxes[5]); // NOLINT magic number // Act _cut->execute(); diff --git a/tests/src/Mod/Part/App/FeaturePartFuse.cpp b/tests/src/Mod/Part/App/FeaturePartFuse.cpp index b8df7c61c9..bcfdb0bf36 100644 --- a/tests/src/Mod/Part/App/FeaturePartFuse.cpp +++ b/tests/src/Mod/Part/App/FeaturePartFuse.cpp @@ -19,13 +19,13 @@ protected: void SetUp() override { createTestDoc(); - _fuse = static_cast(_doc->addObject("Part::Fuse")); + _fuse = dynamic_cast(_doc->addObject("Part::Fuse")); } void TearDown() override {} - Part::Fuse* _fuse; + Part::Fuse* _fuse; // NOLINT Can't be private in a test framework }; TEST_F(FeaturePartFuseTest, testIntersecting) @@ -124,7 +124,7 @@ TEST_F(FeaturePartFuseTest, testBarelyIntersecting) { // Arrange _fuse->Base.setValue(_boxes[0]); - _fuse->Tool.setValue(_boxes[5]); + _fuse->Tool.setValue(_boxes[5]); // NOLINT magic number // Act _fuse->execute();