| | |
| |
|
| | #include <gtest/gtest.h> |
| |
|
| | #include "Mod/Part/App/FeaturePartFuse.h" |
| | #include <src/App/InitApplication.h> |
| | #include "Mod/Part/App/FeatureCompound.h" |
| |
|
| | #include "PartTestHelpers.h" |
| |
|
| |
|
| | class FeaturePartFuseTest: public ::testing::Test, public PartTestHelpers::PartTestHelperClass |
| | { |
| | protected: |
| | static void SetUpTestSuite() |
| | { |
| | tests::initApplication(); |
| | } |
| |
|
| | void SetUp() override |
| | { |
| | createTestDoc(); |
| | _fuse = _doc->addObject<Part::Fuse>(); |
| | _multiFuse = _doc->addObject<Part::MultiFuse>(); |
| | } |
| |
|
| | void TearDown() override |
| | {} |
| |
|
| | Part::Fuse* _fuse = nullptr; |
| | Part::MultiFuse* _multiFuse = nullptr; |
| | }; |
| |
|
| | TEST_F(FeaturePartFuseTest, testIntersecting) |
| | { |
| | |
| | _fuse->Base.setValue(_boxes[0]); |
| | _fuse->Tool.setValue(_boxes[1]); |
| |
|
| | |
| | _fuse->execute(); |
| | Part::TopoShape ts = _fuse->Shape.getValue(); |
| | double volume = PartTestHelpers::getVolume(ts.getShape()); |
| | Base::BoundBox3d bb = ts.getBoundBox(); |
| |
|
| | |
| | EXPECT_DOUBLE_EQ(volume, 9.0); |
| | |
| | EXPECT_DOUBLE_EQ(bb.MinX, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinY, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinZ, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxX, 1.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxY, 3.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxZ, 3.0); |
| | } |
| |
|
| | TEST_F(FeaturePartFuseTest, testCompound) |
| | { |
| | |
| | Part::Compound* _compound = nullptr; |
| | _compound = _doc->addObject<Part::Compound>(); |
| | _compound->Links.setValues({_boxes[0], _boxes[1]}); |
| | _multiFuse->Shapes.setValues({_compound}); |
| |
|
| | |
| | _compound->execute(); |
| | _multiFuse->execute(); |
| | Part::TopoShape ts = _multiFuse->Shape.getValue(); |
| | double volume = PartTestHelpers::getVolume(ts.getShape()); |
| | Base::BoundBox3d bb = ts.getBoundBox(); |
| |
|
| | |
| | EXPECT_DOUBLE_EQ(volume, 9.0); |
| | |
| | EXPECT_DOUBLE_EQ(bb.MinX, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinY, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinZ, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxX, 1.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxY, 3.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxZ, 3.0); |
| | } |
| | TEST_F(FeaturePartFuseTest, testRecursiveCompound) |
| | { |
| | |
| | Part::Compound* _compound[3] = {nullptr}; |
| | int t; |
| | for (t = 0; t < 3; t++) { |
| | _compound[t] = _doc->addObject<Part::Compound>(); |
| | } |
| | _compound[0]->Links.setValues({_boxes[0], _boxes[1]}); |
| | _compound[1]->Links.setValues({_compound[0]}); |
| | _compound[2]->Links.setValues({_compound[1]}); |
| | _multiFuse->Shapes.setValues({_compound[2]}); |
| |
|
| | |
| | for (t = 0; t < 3; t++) { |
| | _compound[t]->execute(); |
| | } |
| | _multiFuse->execute(); |
| | Part::TopoShape ts = _multiFuse->Shape.getValue(); |
| | double volume = PartTestHelpers::getVolume(ts.getShape()); |
| | Base::BoundBox3d bb = ts.getBoundBox(); |
| |
|
| | |
| | EXPECT_DOUBLE_EQ(volume, 9.0); |
| | |
| | EXPECT_DOUBLE_EQ(bb.MinX, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinY, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinZ, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxX, 1.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxY, 3.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxZ, 3.0); |
| | } |
| |
|
| | TEST_F(FeaturePartFuseTest, testNonIntersecting) |
| | { |
| | |
| | _fuse->Base.setValue(_boxes[0]); |
| | _fuse->Tool.setValue(_boxes[2]); |
| |
|
| | |
| | _fuse->execute(); |
| | Part::TopoShape ts = _fuse->Shape.getValue(); |
| | double volume = PartTestHelpers::getVolume(ts.getShape()); |
| | Base::BoundBox3d bb = ts.getBoundBox(); |
| |
|
| | |
| | EXPECT_DOUBLE_EQ(volume, 12.0); |
| | |
| | EXPECT_DOUBLE_EQ(bb.MinX, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinY, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinZ, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxX, 1.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxY, 5.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxZ, 3.0); |
| | } |
| |
|
| | TEST_F(FeaturePartFuseTest, testTouching) |
| | { |
| | |
| | _fuse->Base.setValue(_boxes[0]); |
| | _fuse->Tool.setValue(_boxes[3]); |
| |
|
| | |
| | _fuse->execute(); |
| | Part::TopoShape ts = _fuse->Shape.getValue(); |
| | double volume = PartTestHelpers::getVolume(ts.getShape()); |
| | Base::BoundBox3d bb = ts.getBoundBox(); |
| |
|
| | |
| | EXPECT_DOUBLE_EQ(volume, 12.0); |
| | |
| | EXPECT_DOUBLE_EQ(bb.MinX, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinY, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinZ, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxX, 1.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxY, 4.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxZ, 3.0); |
| | } |
| |
|
| | TEST_F(FeaturePartFuseTest, testAlmostTouching) |
| | { |
| | |
| | _fuse->Base.setValue(_boxes[0]); |
| | _fuse->Tool.setValue(_boxes[4]); |
| |
|
| | |
| | _fuse->execute(); |
| | Part::TopoShape ts = _fuse->Shape.getValue(); |
| | double volume = PartTestHelpers::getVolume(ts.getShape()); |
| | Base::BoundBox3d bb = ts.getBoundBox(); |
| |
|
| | |
| | EXPECT_FLOAT_EQ(volume, 12.0); |
| | |
| | EXPECT_DOUBLE_EQ(bb.MinX, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinY, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinZ, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxX, 1.0); |
| | EXPECT_FLOAT_EQ(bb.MaxY, 4.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxZ, 3.0); |
| | } |
| |
|
| | TEST_F(FeaturePartFuseTest, testBarelyIntersecting) |
| | { |
| | |
| | _fuse->Base.setValue(_boxes[0]); |
| | _fuse->Tool.setValue(_boxes[5]); |
| |
|
| | |
| | _fuse->execute(); |
| | Part::TopoShape ts = _fuse->Shape.getValue(); |
| | double volume = PartTestHelpers::getVolume(ts.getShape()); |
| | double target = 12 - PartTestHelpers::minimalDistance * 3; |
| | Base::BoundBox3d bb = ts.getBoundBox(); |
| |
|
| | |
| | |
| | |
| | |
| | EXPECT_FLOAT_EQ(volume, target); |
| | |
| | EXPECT_DOUBLE_EQ(bb.MinX, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinY, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MinZ, 0.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxX, 1.0); |
| | EXPECT_DOUBLE_EQ(bb.MaxY, 4.0 - PartTestHelpers::minimalDistance); |
| | EXPECT_DOUBLE_EQ(bb.MaxZ, 3.0); |
| | } |
| |
|
| | TEST_F(FeaturePartFuseTest, testMustExecute) |
| | { |
| | |
| | EXPECT_FALSE(_fuse->mustExecute()); |
| | |
| | _fuse->Base.setValue(_boxes[0]); |
| | |
| | EXPECT_FALSE(_fuse->mustExecute()); |
| | |
| | _fuse->Tool.setValue(_boxes[1]); |
| | |
| | EXPECT_TRUE(_fuse->mustExecute()); |
| | |
| | _doc->recompute(); |
| | |
| | EXPECT_FALSE(_fuse->mustExecute()); |
| | } |
| |
|
| | TEST_F(FeaturePartFuseTest, testGetProviderName) |
| | { |
| | |
| | _fuse->execute(); |
| | const char* name = _fuse->getViewProviderName(); |
| | |
| | EXPECT_STREQ(name, "PartGui::ViewProviderBoolean"); |
| | } |
| |
|
| | TEST_F(FeaturePartFuseTest, testRefine) |
| | { |
| | |
| | _fuse->Base.setValue(_boxes[0]); |
| | _fuse->Tool.setValue(_boxes[1]); |
| | _fuse->Refine.setValue(false); |
| | |
| | _fuse->execute(); |
| | Part::TopoShape ts = _fuse->Shape.getValue(); |
| | std::vector<Part::TopoShape> subs = ts.getSubTopoShapes(TopAbs_FACE); |
| | |
| | |
| | EXPECT_EQ(subs.size(), 14); |
| | |
| | |
| | |
| | |
| | |
| | EXPECT_EQ(_fuse->Shape.getShape().getElementMapSize(), 58); |
| | |
| | _fuse->Refine.setValue(true); |
| | _fuse->execute(); |
| | ts = _fuse->Shape.getValue(); |
| | subs = ts.getSubTopoShapes(TopAbs_FACE); |
| | |
| | EXPECT_EQ(subs.size(), 6); |
| | |
| | |
| | |
| | |
| | |
| | EXPECT_EQ(_fuse->Shape.getShape().getElementMapSize(), 26); |
| | } |
| |
|
| | |
| |
|