From eb32b3d83167bbf4619660620d543638454f8a51 Mon Sep 17 00:00:00 2001 From: Eivind Kvedalen Date: Sun, 4 Sep 2016 23:54:06 +0200 Subject: [PATCH] Spreadsheet: Fixed for issue #2767: In some instances, needed parentheses are dropped from the expression. Fixed and updated unit tests. --- src/App/Expression.cpp | 4 ++++ src/Mod/Spreadsheet/TestSpreadsheet.py | 14 +++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/App/Expression.cpp b/src/App/Expression.cpp index e00e500ac..1bab01b75 100644 --- a/src/App/Expression.cpp +++ b/src/App/Expression.cpp @@ -534,6 +534,10 @@ std::string OperatorExpression::toString() const else if (!isCommutative()) needsParens = true; } + else if (right->priority() == priority()) { + if (!isRightAssociative()) + needsParens = true; + } if (needsParens) s << "(" << right->toString() << ")"; diff --git a/src/Mod/Spreadsheet/TestSpreadsheet.py b/src/Mod/Spreadsheet/TestSpreadsheet.py index 328ebbf6d..324953251 100644 --- a/src/Mod/Spreadsheet/TestSpreadsheet.py +++ b/src/Mod/Spreadsheet/TestSpreadsheet.py @@ -348,6 +348,10 @@ class SpreadsheetCases(unittest.TestCase): sheet.set('A34', '=1 < 2 ? <> : <>') sheet.set('A35', '=min(A32:A33)') sheet.set('A36', '=(1 < 2 ? 0 : 1) * 3') + sheet.set('A37', '=8/(2^2*2)') + sheet.set('A38', '=(2^2*2)/8') + sheet.set('A39', '=2^(2*2)/8') + sheet.set('A40', '=8/2^(2*2)') self.doc.recompute() self.assertEqual(sheet.getContents("A1"), "=1 < 2 ? 3 : 4") self.assertEqual(sheet.getContents("A2"), "=1 + 2 < 3 + 4 ? 5 + 6 : 7 + 8") @@ -383,6 +387,10 @@ class SpreadsheetCases(unittest.TestCase): self.assertEqual(sheet.A29, 3.0/8) self.assertEqual(sheet.A30, 3.0/2) self.assertEqual(sheet.A31, 3.0/8) + self.assertEqual(sheet.A37, 1) + self.assertEqual(sheet.A38, 1) + self.assertEqual(sheet.A39, 2) + self.assertEqual(sheet.A40, 0.5) self.assertEqual(sheet.getContents('A1'), '=1 < 2 ? 3 : 4') self.assertEqual(sheet.getContents('A2'), '=1 + 2 < 3 + 4 ? 5 + 6 : 7 + 8') self.assertEqual(sheet.getContents('A3'), '=1 + 2 * 1 < 3 + 4 ? 5 * 2 + 6 * 3 + 2 ^ 4 : 7 * 2 + 8 * 3 + 2 ^ 3') @@ -398,7 +406,7 @@ class SpreadsheetCases(unittest.TestCase): self.assertEqual(sheet.getContents('A13'), '=1 + 4 / 2 + 5') self.assertEqual(sheet.getContents('A14'), '=(3 + 6) / (1 + 2)') self.assertEqual(sheet.getContents('A15'), '=1 * 2 / 3 * 4') - self.assertEqual(sheet.getContents('A16'), '=1 * 2 / 3 * 4') + self.assertEqual(sheet.getContents('A16'), '=1 * 2 / (3 * 4)') self.assertEqual(sheet.getContents('A17'), '=3 ^ 4 ^ 2') self.assertEqual(sheet.getContents('A18'), '=3 ^ (4 ^ 2)') self.assertEqual(sheet.getContents('A19'), '=3 ^ 4 ^ 2') @@ -419,6 +427,10 @@ class SpreadsheetCases(unittest.TestCase): self.assertEqual(sheet.getContents('A34'), '=1 < 2 ? <> : <>') self.assertEqual(sheet.getContents('A35'), '=min(A32:A33)') self.assertEqual(sheet.getContents('A36'), '=(1 < 2 ? 0 : 1) * 3') + self.assertEqual(sheet.getContents('A37'), '=8 / (2 ^ 2 * 2)') + self.assertEqual(sheet.getContents('A38'), '=2 ^ 2 * 2 / 8') + self.assertEqual(sheet.getContents('A39'), '=2 ^ (2 * 2) / 8') + self.assertEqual(sheet.getContents('A40'), '=8 / 2 ^ (2 * 2)') def testNumbers(self): """ Test different numbers """