From 0ba52f0e2294dda0ba2e46f5ab3267e019aae076 Mon Sep 17 00:00:00 2001 From: Benjamin Nauck Date: Tue, 11 Feb 2025 15:33:30 +0100 Subject: [PATCH] Make modulo require units to be same or dimensionless Fixes #19517 --- src/App/Expression.cpp | 4 +++- src/Mod/Spreadsheet/TestSpreadsheet.py | 14 +++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/App/Expression.cpp b/src/App/Expression.cpp index 596930a0bc..f2314627f5 100644 --- a/src/App/Expression.cpp +++ b/src/App/Expression.cpp @@ -2471,7 +2471,9 @@ Py::Object FunctionExpression::evaluate(const Expression *expr, int f, const std case MOD: if (e2.isNone()) _EXPR_THROW("Invalid second argument.",expr); - unit = v1.getUnit() / v2.getUnit(); + if (v1.getUnit() != v2.getUnit() && !v1.isDimensionless() && !v2.isDimensionless()) + _EXPR_THROW("Units must be equal or dimensionless.",expr); + unit = v1.getUnit(); break; case POW: { if (e2.isNone()) diff --git a/src/Mod/Spreadsheet/TestSpreadsheet.py b/src/Mod/Spreadsheet/TestSpreadsheet.py index d51719adf8..a5d78a9810 100644 --- a/src/Mod/Spreadsheet/TestSpreadsheet.py +++ b/src/Mod/Spreadsheet/TestSpreadsheet.py @@ -1088,14 +1088,18 @@ class SpreadsheetCases(unittest.TestCase): self.assertEqual(sheet.B8, rot) self.assertEqual(sheet.C8, pla) - def testIssue3128(self): - """Regression test for issue 3128; mod should work with arbitrary units for both arguments""" + def testIssue19517(self): + """Regression test for issue 19517; mod should work with units""" sheet = self.doc.addObject("Spreadsheet::Sheet", "Spreadsheet") sheet.set("A1", "=mod(7mm;3mm)") - sheet.set("A2", "=mod(7kg;3mm)") self.doc.recompute() - self.assertEqual(sheet.A1, Units.Quantity("1")) - self.assertEqual(sheet.A2, Units.Quantity("1 kg/mm")) + self.assertEqual(sheet.A1, Units.Quantity("1 mm")) + try: + sheet.set("A2", "=mod(7kg;3mm)") + self.doc.recompute() + self.fail("Units need to be the same or dimensionless") + except Exception: + pass def testIssue3363(self): """Regression test for issue 3363; Nested conditionals statement fails with additional conditional statement in false-branch"""