[Sketcher] Fix angle constraint expression regression (#10743)

* fix 10742

* moved expression string modifier to helper function

* Tests: Add example tests for SketchObject

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* made expr modifier func static, pass by value and added unit tests

---------

Co-authored-by: Chris Hennes <chennes@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
howie-j
2023-09-25 17:44:31 +02:00
committed by GitHub
parent 8945ab642d
commit acbf135b78
3 changed files with 127 additions and 11 deletions

View File

@@ -6,6 +6,8 @@
#include <App/Application.h>
#include <App/Document.h>
#include <App/Expression.h>
#include <App/ObjectIdentifier.h>
#include <Mod/Sketcher/App/GeoEnum.h>
#include <Mod/Sketcher/App/SketchObject.h>
@@ -162,3 +164,96 @@ TEST_F(SketchObjectTest, testGeoIdFromShapeTypeRootPoint)
EXPECT_EQ(geoId, Sketcher::GeoEnum::RtPnt);
EXPECT_EQ(posId, Sketcher::PointPos::start);
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionNoUnits1)
{
std::string expr = Sketcher::SketchObject::reverseAngleConstraintExpression("180 - 60");
EXPECT_EQ(expr, std::string("60"));
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionNoUnits2)
{
std::string expr = Sketcher::SketchObject::reverseAngleConstraintExpression("60");
EXPECT_EQ(expr, std::string("180 - (60)"));
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionWithUnits1)
{
std::string expr = Sketcher::SketchObject::reverseAngleConstraintExpression("180 ° - 60 °");
EXPECT_EQ(expr, std::string("60 °"));
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionWithUnits2)
{
std::string expr = Sketcher::SketchObject::reverseAngleConstraintExpression("60 °");
EXPECT_EQ(expr, std::string("180 ° - (60 °)"));
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionWithUnits3)
{
std::string expr = Sketcher::SketchObject::reverseAngleConstraintExpression("60 deg");
EXPECT_EQ(expr, std::string("180 ° - (60 deg)"));
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionWithUnits4)
{
std::string expr = Sketcher::SketchObject::reverseAngleConstraintExpression("1rad");
EXPECT_EQ(expr, std::string("180 ° - (1rad)"));
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionApplyAndReverse1)
{
std::string expr = "180";
expr = Sketcher::SketchObject::reverseAngleConstraintExpression(expr);
expr = Sketcher::SketchObject::reverseAngleConstraintExpression(expr);
EXPECT_EQ(expr, std::string("(180)"));
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionApplyAndReverse2)
{
std::string expr = "(30 + 15) * 2 / 3";
expr = Sketcher::SketchObject::reverseAngleConstraintExpression(expr);
expr = Sketcher::SketchObject::reverseAngleConstraintExpression(expr);
EXPECT_EQ(expr, std::string("((30 + 15) * 2 / 3)"));
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionSimple)
{
// Arrange
auto constraint = new Sketcher::Constraint(); // Ownership will be transferred to the sketch
constraint->Type = Sketcher::ConstraintType::Angle;
auto id = getObject()->addConstraint(constraint);
App::ObjectIdentifier path(App::ObjectIdentifier::parse(getObject(), "Constraints[0]"));
std::shared_ptr<App::Expression> shared_expr(App::Expression::parse(getObject(), "0"));
getObject()->setExpression(path, shared_expr);
getObject()->setConstraintExpression(id, "180 - (60)");
// Act
getObject()->reverseAngleConstraintToSupplementary(constraint, id);
// Assert
EXPECT_EQ(std::string("60"), getObject()->getConstraintExpression(id));
}
TEST_F(SketchObjectTest, testReverseAngleConstraintToSupplementaryExpressionApplyAndReverse)
{
// Arrange
auto constraint = new Sketcher::Constraint(); // Ownership will be transferred to the sketch
constraint->Type = Sketcher::ConstraintType::Angle;
auto id = getObject()->addConstraint(constraint);
App::ObjectIdentifier path(App::ObjectIdentifier::parse(getObject(), "Constraints[0]"));
std::shared_ptr<App::Expression> shared_expr(App::Expression::parse(getObject(), "0"));
getObject()->setExpression(path, shared_expr);
getObject()->setConstraintExpression(id, "32 °");
// Act
getObject()->reverseAngleConstraintToSupplementary(constraint, id);
getObject()->reverseAngleConstraintToSupplementary(constraint, id);
// Assert
EXPECT_EQ(std::string("32 °"), getObject()->getConstraintExpression(id));
}