From 0c4434d088fcee41461190faec00194f6913acfb Mon Sep 17 00:00:00 2001 From: Ruben Dashyan Date: Tue, 17 Mar 2020 10:17:42 +0100 Subject: [PATCH] [poincare/expression] getUnit returns an uninitialized Expression when there is no Unit instead of Undefined --- poincare/src/addition.cpp | 6 +++++- poincare/src/expression_node.cpp | 2 +- poincare/src/multiplication.cpp | 4 ++-- poincare/src/power.cpp | 2 +- poincare/src/unit_convert.cpp | 2 +- poincare/test/expression_properties.cpp | 2 +- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/poincare/src/addition.cpp b/poincare/src/addition.cpp index 5d99cce4b..02167bf56 100644 --- a/poincare/src/addition.cpp +++ b/poincare/src/addition.cpp @@ -160,8 +160,12 @@ Expression Addition::shallowReduce(ExpressionNode::ReductionContext reductionCon * the result is not homogeneous. */ { Expression unit = childAtIndex(0).getUnit(); + const bool hasUnit = !unit.isUninitialized(); for (int i = 1; i < childrenCount; i++) { - if (!unit.isIdenticalTo(childAtIndex(i).getUnit())) { + Expression otherUnit = childAtIndex(i).getUnit(); + if (hasUnit == otherUnit.isUninitialized() || + (hasUnit && !unit.isIdenticalTo(otherUnit))) + { return replaceWithUndefinedInPlace(); } } diff --git a/poincare/src/expression_node.cpp b/poincare/src/expression_node.cpp index 94115d40e..1ac78e729 100644 --- a/poincare/src/expression_node.cpp +++ b/poincare/src/expression_node.cpp @@ -137,7 +137,7 @@ bool ExpressionNode::isOfType(Type * types, int length) const { } Expression ExpressionNode::getUnit() const { - return Undefined::Builder(); + return Expression(); } void ExpressionNode::setChildrenInPlace(Expression other) { diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index 68e366239..14ba43034 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -264,13 +264,13 @@ Expression Multiplication::getUnit() const { int resultChildrenCount = 0; for (int i = 0; i < childrenCount; i++) { Expression currentUnit = childAtIndex(i).getUnit(); - if (!currentUnit.isUndefined()) { + if (!currentUnit.isUninitialized()) { result.addChildAtIndexInPlace(currentUnit, resultChildrenCount, resultChildrenCount); resultChildrenCount++; } } if (resultChildrenCount == 0) { - return Undefined::Builder(); + return Expression(); } return std::move(result); } diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index da0579f72..d6f27e7bb 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -987,7 +987,7 @@ Expression Power::getUnit() const { return clone(); } Expression baseUnit = childAtIndex(0).getUnit(); - if (baseUnit.isUndefined()) { + if (baseUnit.isUninitialized()) { return baseUnit; } return Power::Builder(baseUnit, childAtIndex(1).clone()); diff --git a/poincare/src/unit_convert.cpp b/poincare/src/unit_convert.cpp index 4dfc699ba..0002bb500 100644 --- a/poincare/src/unit_convert.cpp +++ b/poincare/src/unit_convert.cpp @@ -42,7 +42,7 @@ Expression UnitConvert::shallowReduce(ExpressionNode::ReductionContext reduction reductionContext.target(), ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithUndefinedAndReplaceUnits); Expression unit = childAtIndex(1).clone().reduce(reductionContextWithUnits).getUnit(); - if (unit.isUndefined()) { + if (unit.isUninitialized()) { // There is no unit on the right return replaceWithUndefinedInPlace(); } diff --git a/poincare/test/expression_properties.cpp b/poincare/test/expression_properties.cpp index 88f49370f..854888d5b 100644 --- a/poincare/test/expression_properties.cpp +++ b/poincare/test/expression_properties.cpp @@ -378,7 +378,7 @@ void assert_reduced_expression_unit(const char * expression, const char * unit, Expression u2 = parse_expression(unit, &globalContext, false); u2 = u2.reduce(redContext); u2 = u2.getUnit(); - quiz_assert_print_if_failure(u1.isIdenticalTo(u2), expression); + quiz_assert_print_if_failure(u1.isUninitialized() == u2.isUninitialized() && (u1.isUninitialized() || u1.isIdenticalTo(u2)), expression); } QUIZ_CASE(poincare_properties_get_unit) {