From 0f3aff0eacd19dcd6199ed28fa16adb8fc873f9b Mon Sep 17 00:00:00 2001 From: Ajinkya Dahale Date: Mon, 12 Aug 2024 00:39:38 +0530 Subject: [PATCH] [Sketcher][test] Create test for `getConstraintAfterDeletingGeo`+ [Sketcher] Add null case to constraint change on deletion checks --- src/Mod/Sketcher/App/SketchObject.h | 2 + tests/src/Mod/Sketcher/App/SketchObject.cpp | 69 +++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/src/Mod/Sketcher/App/SketchObject.h b/src/Mod/Sketcher/App/SketchObject.h index f9e95e0615..b132017bff 100644 --- a/src/Mod/Sketcher/App/SketchObject.h +++ b/src/Mod/Sketcher/App/SketchObject.h @@ -982,6 +982,8 @@ protected: int thirdGeoId = GeoEnum::GeoUndef, Sketcher::PointPos thirdPos = Sketcher::PointPos::none); +public: + // FIXME: These may not need to be public. Decide before merging. std::unique_ptr getConstraintAfterDeletingGeo(const Constraint* constr, const int deletedGeoId) const; diff --git a/tests/src/Mod/Sketcher/App/SketchObject.cpp b/tests/src/Mod/Sketcher/App/SketchObject.cpp index 69c4fdcd54..9010c1749a 100644 --- a/tests/src/Mod/Sketcher/App/SketchObject.cpp +++ b/tests/src/Mod/Sketcher/App/SketchObject.cpp @@ -562,6 +562,75 @@ TEST_F(SketchObjectTest, testGetPointFromGeomBSplineCurvePeriodic) EXPECT_DOUBLE_EQ(ptStart[1], ptEnd[1]); } +TEST_F(SketchObjectTest, testConstraintAfterDeletingGeo) +{ + // Arrange + int geoId1 = 42, geoId2 = 10, geoId3 = 0, geoId4 = -8; + + Sketcher::Constraint* nullConstr = nullptr; + + Sketcher::Constraint constr1; + constr1.Type = Sketcher::ConstraintType::Coincident; + constr1.First = geoId1; + constr1.FirstPos = Sketcher::PointPos::start; + constr1.Second = geoId2; + constr1.SecondPos = Sketcher::PointPos::end; + + Sketcher::Constraint constr2; + constr2.Type = Sketcher::ConstraintType::Tangent; + constr2.First = geoId4; + constr2.FirstPos = Sketcher::PointPos::none; + constr2.Second = geoId3; + constr2.SecondPos = Sketcher::PointPos::none; + constr2.Third = geoId1; + constr2.ThirdPos = Sketcher::PointPos::start; + + // Act + auto nullConstrAfter = getObject()->getConstraintAfterDeletingGeo(nullConstr, 5); + + // Assert + EXPECT_EQ(nullConstrAfter, nullptr); + + // Act + getObject()->changeConstraintAfterDeletingGeo(nullConstr, 5); + + // Assert + EXPECT_EQ(nullConstr, nullptr); + + // Act + // delete typical in-sketch geo + auto constr1PtrAfter1 = getObject()->getConstraintAfterDeletingGeo(&constr1, 5); + // delete external geo (negative id) + auto constr1PtrAfter2 = getObject()->getConstraintAfterDeletingGeo(&constr1, -5); + // Delete a geo involved in the constraint + auto constr1PtrAfter3 = getObject()->getConstraintAfterDeletingGeo(&constr1, 10); + + // Assert + EXPECT_EQ(constr1.Type, Sketcher::ConstraintType::Coincident); + EXPECT_EQ(constr1.First, geoId1); + EXPECT_EQ(constr1.Second, geoId2); + EXPECT_EQ(constr1PtrAfter1->First, geoId1 - 1); + EXPECT_EQ(constr1PtrAfter1->Second, geoId2 - 1); + EXPECT_EQ(constr1PtrAfter2->Third, Sketcher::GeoEnum::GeoUndef); + EXPECT_EQ(constr1PtrAfter3.get(), nullptr); + + // Act + getObject()->changeConstraintAfterDeletingGeo(&constr2, -3); + + // Assert + EXPECT_EQ(constr2.Type, Sketcher::ConstraintType::Tangent); + EXPECT_EQ(constr2.First, geoId4 + 1); + EXPECT_EQ(constr2.Second, geoId3); + EXPECT_EQ(constr2.Third, geoId1); + + // Act + // Delete a geo involved in the constraint + getObject()->changeConstraintAfterDeletingGeo(&constr2, 0); + + // Assert + EXPECT_EQ(constr2.Type, Sketcher::ConstraintType::None); +} + TEST_F(SketchObjectTest, testSplitLineSegment) { // Arrange