diff --git a/src/App/Expression.cpp b/src/App/Expression.cpp index 486100f45..657424397 100644 --- a/src/App/Expression.cpp +++ b/src/App/Expression.cpp @@ -455,17 +455,6 @@ std::string OperatorExpression::toString() const bool needsParens; Operator leftOperator(NONE), rightOperator(NONE); - switch (op) { - case NEG: - s << "-" << left->toString(); - return s.str(); - case POS: - s << "+" << left->toString(); - return s.str(); - default: - break; - } - needsParens = false; if (freecad_dynamic_cast(left)) leftOperator = static_cast(left)->op; @@ -478,6 +467,17 @@ std::string OperatorExpression::toString() const // needsParens = true; } + switch (op) { + case NEG: + s << "-" << (needsParens ? "(" : "") << left->toString() << (needsParens ? ")" : ""); + return s.str(); + case POS: + s << "+" << (needsParens ? "(" : "") << left->toString() << (needsParens ? ")" : ""); + return s.str(); + default: + break; + } + if (needsParens) s << "(" << left->toString() << ")"; else diff --git a/src/Mod/Spreadsheet/TestSpreadsheet.py b/src/Mod/Spreadsheet/TestSpreadsheet.py index 2cd26b5be..105ef38c6 100644 --- a/src/Mod/Spreadsheet/TestSpreadsheet.py +++ b/src/Mod/Spreadsheet/TestSpreadsheet.py @@ -29,6 +29,7 @@ class SpreadsheetCases(unittest.TestCase): def testAggregates(self): """ Test all aggregate functions """ sheet = self.doc.addObject('Spreadsheet::Sheet','Spreadsheet') + sheet = self.doc.addObject('Spreadsheet::Sheet','Spreadsheet') sheet.set('B13', '4') sheet.set('B14', '5') sheet.set('B15', '6') @@ -436,6 +437,25 @@ class SpreadsheetCases(unittest.TestCase): sheet.set('A38', '=(2^2*2)/8') sheet.set('A39', '=2^(2*2)/8') sheet.set('A40', '=8/2^(2*2)') + sheet.set('A41', '=-1') + sheet.set('A42', '=-(1)') + sheet.set('A43', '=-(1 + 1)') + sheet.set('A44', '=-(1 - 1)') + sheet.set('A45', '=-(-1 + 1)') + sheet.set('A46', '=-(-1 + -1)') + sheet.set('A47', '=+1') + sheet.set('A48', '=+(1)') + sheet.set('A49', '=+(1 + 1)') + sheet.set('A50', '=+(1 - 1)') + sheet.set('A51', '=+(-1 + 1)') + sheet.set('A52', '=+(-1 + -1)') + + self.doc.addObject("Part::Cylinder", "Cylinder") + self.doc.addObject("Part::Thickness", "Pipe") + sheet.set('B1', '101') + sheet.set('A53', '=-(-(B1-1)/2)') + sheet.set('A54', '=-(Cylinder.Radius + Pipe.Value*1mm - 1"/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") @@ -475,6 +495,20 @@ class SpreadsheetCases(unittest.TestCase): self.assertEqual(sheet.A38, 1) self.assertEqual(sheet.A39, 2) self.assertEqual(sheet.A40, 0.5) + self.assertEqual(sheet.A41, -1) + self.assertEqual(sheet.A42, -1) + self.assertEqual(sheet.A43, -2) + self.assertEqual(sheet.A44, 0) + self.assertEqual(sheet.A45, 0) + self.assertEqual(sheet.A46, 2) + self.assertEqual(sheet.A47, 1) + self.assertEqual(sheet.A48, 1) + self.assertEqual(sheet.A49, 2) + self.assertEqual(sheet.A50, 0) + self.assertEqual(sheet.A51, 0) + self.assertEqual(sheet.A52, -2) + self.assertEqual(sheet.A53, 50) + self.assertEqual(sheet.A54, Quantity('9.7mm')) 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') @@ -515,6 +549,18 @@ class SpreadsheetCases(unittest.TestCase): 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)') + self.assertEqual(sheet.getContents('A41'), '=-1') + self.assertEqual(sheet.getContents('A42'), '=-1') + self.assertEqual(sheet.getContents('A43'), '=-(1 + 1)') + self.assertEqual(sheet.getContents('A44'), '=-(1 - 1)') + self.assertEqual(sheet.getContents('A45'), '=-(-1 + 1)') + self.assertEqual(sheet.getContents('A46'), '=-(-1 + -1)') + self.assertEqual(sheet.getContents('A47'), '=+1') + self.assertEqual(sheet.getContents('A48'), '=+1') + self.assertEqual(sheet.getContents('A49'), '=+(1 + 1)') + self.assertEqual(sheet.getContents('A50'), '=+(1 - 1)') + self.assertEqual(sheet.getContents('A51'), '=+(-1 + 1)') + self.assertEqual(sheet.getContents('A52'), '=+(-1 + -1)') def testNumbers(self): """ Test different numbers """