Spreadsheet: Fixed for issue #2767: In some instances, needed parentheses are dropped from the expression. Fixed and updated unit tests.

This commit is contained in:
Eivind Kvedalen 2016-09-04 23:54:06 +02:00 committed by wmayer
parent 089bb79674
commit eb32b3d831
2 changed files with 17 additions and 1 deletions

View File

@ -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() << ")";

View File

@ -348,6 +348,10 @@ class SpreadsheetCases(unittest.TestCase):
sheet.set('A34', '=1 < 2 ? <<A>> : <<B>>')
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 ? <<A>> : <<B>>')
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 """