Files
create/tests/src/Mod/Part/App/FeatureOffset.cpp

151 lines
7.2 KiB
C++

// SPDX-License-Identifier: LGPL-2.1-or-later
#include "gtest/gtest.h"
#include <src/App/InitApplication.h>
#include "PartTestHelpers.h"
#include "Mod/Part/App/FeatureOffset.h"
using namespace PartTestHelpers;
// NOLINTBEGIN(readability-magic-numbers,cppcoreguidelines-avoid-magic-numbers)
class FeatureOffsetTest: public ::testing::Test, public PartTestHelperClass
{
protected:
static void SetUpTestSuite()
{
tests::initApplication();
}
void SetUp() override
{
createTestDoc();
_offset = dynamic_cast<Part::Offset*>(_doc->addObject("Part::Offset"));
_offset->Source.setValue(_boxes[0]);
_offset->Value.setValue(1);
_offset->Join.setValue((int)JoinType::intersection);
_offset->execute();
}
void TearDown() override
{}
Part::Offset* _offset = nullptr; // NOLINT Can't be private in a test framework
};
TEST_F(FeatureOffsetTest, testOffset3D)
{
// Arrange
Base::BoundBox3d bb = _offset->Shape.getShape().getBoundBox();
// Assert size and position
// a 1x2x3 box 3doffset by 1 becomes a 3x4x5 box, so volume is 60.
EXPECT_EQ(getVolume(_offset->Shape.getShape().getShape()), 60);
EXPECT_TRUE(boxesMatch(bb, Base::BoundBox3d(-1, -1, -1, 2, 3, 4)));
// Assert correct element Map
#ifdef FC_USE_TNP_FIX
EXPECT_TRUE(allElementsMatch(
_offset->Shape.getShape(),
{
"Edge10;:G;OFS;:H47b:7,E", "Edge11;:G;OFS;:H47b:7,E", "Edge12;:G;OFS;:H47b:7,E",
"Edge1;:G;OFS;:H47b:7,E", "Edge2;:G;OFS;:H47b:7,E", "Edge3;:G;OFS;:H47b:7,E",
"Edge4;:G;OFS;:H47b:7,E", "Edge5;:G;OFS;:H47b:7,E", "Edge6;:G;OFS;:H47b:7,E",
"Edge7;:G;OFS;:H47b:7,E", "Edge8;:G;OFS;:H47b:7,E", "Edge9;:G;OFS;:H47b:7,E",
"Face1;:G;OFS;:H47b:7,F", "Face2;:G;OFS;:H47b:7,F", "Face3;:G;OFS;:H47b:7,F",
"Face4;:G;OFS;:H47b:7,F", "Face5;:G;OFS;:H47b:7,F", "Face6;:G;OFS;:H47b:7,F",
"Vertex1;:G;OFS;:H47b:7,V", "Vertex2;:G;OFS;:H47b:7,V", "Vertex3;:G;OFS;:H47b:7,V",
"Vertex4;:G;OFS;:H47b:7,V", "Vertex5;:G;OFS;:H47b:7,V", "Vertex6;:G;OFS;:H47b:7,V",
"Vertex7;:G;OFS;:H47b:7,V", "Vertex8;:G;OFS;:H47b:7,V",
}));
#else
EXPECT_EQ(_offset->Shape.getShape().getElementMapSize(), 0);
#endif
}
TEST_F(FeatureOffsetTest, testOffset3DWithExistingElementMap)
{
// Arrange
Part::Fuse* _fuse = nullptr; // NOLINT Can't be private in a test framework
_fuse = dynamic_cast<Part::Fuse*>(_doc->addObject("Part::Fuse"));
_fuse->Base.setValue(_boxes[0]);
_fuse->Tool.setValue(_boxes[1]);
_fuse->Refine.setValue(true);
// Act
_fuse->execute();
_offset->Source.setValue(_fuse);
_offset->Value.setValue(2);
_offset->execute();
Base::BoundBox3d bb = _offset->Shape.getShape().getBoundBox();
// Assert size and position
// A 1x3x3 box 3doffset by 2 becomes a 5x7x7 box with volume of 245
EXPECT_EQ(getVolume(_fuse->Shape.getShape().getShape()), 9);
EXPECT_EQ(getVolume(_offset->Shape.getShape().getShape()), 245);
EXPECT_TRUE(boxesMatch(bb, Base::BoundBox3d(-2, -2, -2, 3, 5, 5)));
// Assert correct element Map
#ifdef FC_USE_TNP_FIX
EXPECT_TRUE(elementsMatch(
_offset->Shape.getShape(),
{
"Edge10;FUS;:He59:4,E;RFI;:He59:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge11;FUS;:He5a:4,E;RFI;:He5a:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge12;FUS;:He5a:4,E;RFI;:He5a:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge1;FUS;:He59:4,E;RFI;:He59:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge2;:M2(Edge2;:He5a,E);FUS;:He59:17,E;:G(Edge2;:M2;FUS;:He5a:8,E;K-1;:He5a:4,E|"
"Edge2;:M;FUS;:He59:7,E;K-1;:He59:4,E);RFI;:He59:53,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge3;FUS;:He5a:4,E;RFI;:He5a:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge4;:M2(Edge4;:He5a,E);FUS;:He59:17,E;:G(Edge4;:M2;FUS;:He5a:8,E;K-1;:He5a:4,E|"
"Edge4;:M;FUS;:He59:7,E;K-1;:He59:4,E);RFI;:He59:53,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge5;FUS;:He59:4,E;RFI;:He59:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge6;:M2(Edge6;:He5a,E);FUS;:He59:17,E;:G(Edge6;:M2;FUS;:He5a:8,E;K-1;:He5a:4,E|"
"Edge6;:M;FUS;:He59:7,E;K-1;:He59:4,E);RFI;:He59:53,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge7;FUS;:He5a:4,E;RFI;:He5a:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge8;:M2(Edge8;:He5a,E);FUS;:He59:17,E;:G(Edge8;:M2;FUS;:He5a:8,E;K-1;:He5a:4,E|"
"Edge8;:M;FUS;:He59:7,E;K-1;:He59:4,E);RFI;:He59:53,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Edge9;FUS;:He59:4,E;RFI;:He59:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
"Face1;:M2(Face1;:He5a,F);FUS;:He59:17,F;:G(Face1;:M2;FUS;:He5a:8,F;K-1;:He5a:4,F|"
"Face1;:M;FUS;:He59:7,F;K-1;:He59:4,F);RFI;:He59:53,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
"Face2;:M2(Face2;:He5a,F);FUS;:He59:17,F;:G(Face2;:M2;FUS;:He5a:8,F;K-1;:He5a:4,F|"
"Face2;:M;FUS;:He59:7,F;K-1;:He59:4,F);RFI;:He59:53,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
"Face3;FUS;:He59:4,F;RFI;:He59:4,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
"Face4;FUS;:He5a:4,F;RFI;:He5a:4,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
"Face5;:M2(Face5;:He5a,F);FUS;:He59:17,F;:G(Face5;:M2;FUS;:He5a:8,F;K-1;:He5a:4,F|"
"Face5;:M;FUS;:He59:7,F;K-1;:He59:4,F);RFI;:He59:53,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
"Face6;:M2(Face6;:He5a,F);FUS;:He59:17,F;:G(Face6;:M2;FUS;:He5a:8,F;K-1;:He5a:4,F|"
"Face6;:M;FUS;:He59:7,F;K-1;:He59:4,F);RFI;:He59:53,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
"Vertex1;FUS;:He59:4,V;RFI;:He59:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
"Vertex2;FUS;:He59:4,V;RFI;:He59:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
"Vertex3;FUS;:He5a:4,V;RFI;:He5a:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
"Vertex4;FUS;:He5a:4,V;RFI;:He5a:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
"Vertex5;FUS;:He59:4,V;RFI;:He59:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
"Vertex6;FUS;:He59:4,V;RFI;:He59:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
"Vertex7;FUS;:He5a:4,V;RFI;:He5a:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
"Vertex8;FUS;:He5a:4,V;RFI;:He5a:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
}));
#else
EXPECT_EQ(_offset->Shape.getShape().getElementMapSize(), 0);
#endif
}
TEST_F(FeatureOffsetTest, testOffset2D)
{
// Arrange
Part::Offset2D* _offset2 = dynamic_cast<Part::Offset2D*>(_doc->addObject("Part::Offset2D"));
Part::Plane* _pln = dynamic_cast<Part::Plane*>(_doc->addObject("Part::Plane"));
_pln->Length.setValue(2);
_pln->Width.setValue(3);
_offset2->Source.setValue(_pln);
_offset2->Value.setValue(1);
_offset2->Join.setValue((int)JoinType::intersection);
// Act
_offset2->execute();
Base::BoundBox3d bb = _offset2->Shape.getShape().getBoundBox();
// Assert size and position
// a 2x3 face 2doffset by 1 becomes a 4x5 face, so area is 20.
EXPECT_EQ(getArea(_offset2->Shape.getShape().getShape()), 20);
EXPECT_TRUE(boxesMatch(bb, Base::BoundBox3d(-1, -1, 0, 3, 4, 0)));
// Assert correct element Map
EXPECT_EQ(_offset2->Shape.getShape().getElementMapSize(), 0);
}
// NOLINTEND(readability-magic-numbers,cppcoreguidelines-avoid-magic-numbers)