Expressions: Fixed issue #2879.

This commit is contained in:
Eivind Kvedalen 2017-01-28 22:28:04 +01:00 committed by wmayer
parent 715fa81fe2
commit 0d6f777099
2 changed files with 57 additions and 11 deletions

View File

@ -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<OperatorExpression>(left))
leftOperator = static_cast<OperatorExpression*>(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

View File

@ -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 """