From b43394de2d394e5a1ab41e0badebd7c9eb050ba8 Mon Sep 17 00:00:00 2001 From: Vincenzo Calligaro Date: Sat, 21 Dec 2024 10:21:01 +0100 Subject: [PATCH] Toponaming: import code related to ElementMapVersion from LS3 *Added test Signed-off-by: Vincenzo Calligaro --- .../PartDesign/App/BackwardCompatibility.cpp | 123 ++++++++++++++++++ tests/src/Mod/PartDesign/App/CMakeLists.txt | 15 +++ .../App/TestModels/ModelFromV021.FCStd | Bin 0 -> 25258 bytes 3 files changed, 138 insertions(+) create mode 100644 tests/src/Mod/PartDesign/App/BackwardCompatibility.cpp create mode 100644 tests/src/Mod/PartDesign/App/TestModels/ModelFromV021.FCStd diff --git a/tests/src/Mod/PartDesign/App/BackwardCompatibility.cpp b/tests/src/Mod/PartDesign/App/BackwardCompatibility.cpp new file mode 100644 index 0000000000..42689b5fa9 --- /dev/null +++ b/tests/src/Mod/PartDesign/App/BackwardCompatibility.cpp @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include +#include +#include +#include +#include "src/App/InitApplication.h" + +#include +#include +#include + +// NOLINTBEGIN(readability-magic-numbers,cppcoreguidelines-avoid-magic-numbers) + +class BackwardCompatibilityTest: public ::testing::Test +{ +protected: + static void SetUpTestSuite() + { + tests::initApplication(); + } + + void SetUp() override + { + _testPath = App::Application::getHomePath() + "tests/TestModels/"; + } + + void TearDown() override + { + App::GetApplication().closeDocument(_doc->getName()); + } + + const App::Document* getDocument() const + { + return _doc; + } + + void setDocument(App::Document* doc) + { + _doc = doc; + } + + std::string getTestPath() const + { + return _testPath; + } + +private: + App::Document* _doc = nullptr; // NOLINT Can't be private in a test framework + std::string _testPath; // NOLINT Can't be private in a test framework +}; + +TEST_F(BackwardCompatibilityTest, TestOpenV021Model) +{ + + // arrange + + auto doc = App::GetApplication().openDocument( + std::string(getTestPath() + "ModelFromV021.FCStd").c_str()); + setDocument(doc); + + auto chamfer = dynamic_cast(doc->getObject("Chamfer")); + auto chamferEdgesNames = chamfer->Base.getSubValues(); + + std::vector chamferOriginalEdges {}; + for (const auto& chamferEdgesName : chamferEdgesNames) { + chamferOriginalEdges.push_back( + chamfer->getBaseTopoShape().getSubTopoShape(chamferEdgesName.c_str()).getShape()); + } + + // act + + doc->recompute(); + chamfer = dynamic_cast(doc->getObject("Chamfer")); + chamferEdgesNames = chamfer->Base.getSubValues(); + + // assert + + auto checkSameVertexes = [](const TopoDS_Shape& e1, const TopoDS_Shape& e2) { + TopExp_Explorer e1Vertexes(e1, TopAbs_VERTEX); + TopExp_Explorer e2Vertexes(e2, TopAbs_VERTEX); + + bool sameCoords {true}; + bool moreToCheck {e1Vertexes.More() && e2Vertexes.More()}; + + // If one of the vertexes doesn't have the same coordinates of the other one then it'll be + // useless to continue + while (moreToCheck && sameCoords) { + auto p1 = BRep_Tool::Pnt(TopoDS::Vertex(e1Vertexes.Current())); + auto p2 = BRep_Tool::Pnt(TopoDS::Vertex(e2Vertexes.Current())); + + sameCoords &= (p1.X() == p2.X() && p1.Y() == p2.Y() && p1.Z() == p2.Z()); + e1Vertexes.Next(); + e2Vertexes.Next(); + + moreToCheck = (e1Vertexes.More() && e2Vertexes.More()); + + // Extra check: both edges should have the same number of vertexes (e*Vertexes.More() + // should be true or false at the same time for both the edges). + // If this doesn't happen then one of the edges won't have enough vertexes to perform a + // full coordinates comparison. + // This shouldn't happen, so it's here just in case + sameCoords &= (e1Vertexes.More() == e2Vertexes.More()); + } + + return sameCoords; + }; + + EXPECT_TRUE(checkSameVertexes( + chamfer->getBaseTopoShape().getSubTopoShape(chamferEdgesNames[0].c_str()).getShape(), + chamferOriginalEdges[0])); + EXPECT_TRUE(checkSameVertexes( + chamfer->getBaseTopoShape().getSubTopoShape(chamferEdgesNames[1].c_str()).getShape(), + chamferOriginalEdges[1])); + EXPECT_TRUE(checkSameVertexes( + chamfer->getBaseTopoShape().getSubTopoShape(chamferEdgesNames[2].c_str()).getShape(), + chamferOriginalEdges[2])); + EXPECT_TRUE(checkSameVertexes( + chamfer->getBaseTopoShape().getSubTopoShape(chamferEdgesNames[3].c_str()).getShape(), + chamferOriginalEdges[3])); +} + +// NOLINTEND(readability-magic-numbers,cppcoreguidelines-avoid-magic-numbers) diff --git a/tests/src/Mod/PartDesign/App/CMakeLists.txt b/tests/src/Mod/PartDesign/App/CMakeLists.txt index 007fd820de..48583700bc 100644 --- a/tests/src/Mod/PartDesign/App/CMakeLists.txt +++ b/tests/src/Mod/PartDesign/App/CMakeLists.txt @@ -2,7 +2,22 @@ target_sources( PartDesign_tests_run PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/BackwardCompatibility.cpp ${CMAKE_CURRENT_SOURCE_DIR}/DatumPlane.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ShapeBinder.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Pad.cpp ) + +set(PartDesignTestData_Files + TestModels/ModelFromV021.FCStd +) + +ADD_CUSTOM_TARGET(PartDesignTestData ALL + SOURCES ${PartDesignTestData_Files} +) + +fc_target_copy_resource(PartDesignTestData + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_BINARY_DIR}/tests + ${PartDesignTestData_Files} +) diff --git a/tests/src/Mod/PartDesign/App/TestModels/ModelFromV021.FCStd b/tests/src/Mod/PartDesign/App/TestModels/ModelFromV021.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..2a062d836111e2f73384de630e22483b1d0442c8 GIT binary patch literal 25258 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