From 43744bcae902b7211a81467d442188cd18958200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Wed, 15 Jul 2020 10:59:20 +0200 Subject: [PATCH] [poincare/power] Fix shallowReduce Scenario: f(x) = 0->0 In graph, go to x = e^(f(0)) --- poincare/src/power.cpp | 2 +- poincare/test/helper.cpp | 7 ++++++- poincare/test/helper.h | 2 ++ poincare/test/simplification.cpp | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index d5913e835..299221d86 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -406,7 +406,7 @@ Expression Power::shallowReduce(ExpressionNode::ReductionContext reductionContex // Step 1: Handle the units { Expression indexUnit; - index.removeUnit(&indexUnit); + index = index.removeUnit(&indexUnit); if (!indexUnit.isUninitialized()) { // There must be no unit in the exponent return replaceWithUndefinedInPlace(); diff --git a/poincare/test/helper.cpp b/poincare/test/helper.cpp index 5d14942c1..417fba00c 100644 --- a/poincare/test/helper.cpp +++ b/poincare/test/helper.cpp @@ -79,8 +79,13 @@ Poincare::Expression parse_expression(const char * expression, Context * context void assert_simplify(const char * expression, Preferences::AngleUnit angleUnit, Preferences::ComplexFormat complexFormat, ExpressionNode::ReductionTarget target) { Shared::GlobalContext globalContext; Expression e = parse_expression(expression, &globalContext, false); + assert_expression_simplify(e, angleUnit, complexFormat, target, expression); +} + +void assert_expression_simplify(Expression e, Preferences::AngleUnit angleUnit, Preferences::ComplexFormat complexFormat, ExpressionNode::ReductionTarget target, const char * printIfFailure) { + Shared::GlobalContext globalContext; e = e.reduce(ExpressionNode::ReductionContext(&globalContext, complexFormat, angleUnit, target)); - quiz_assert_print_if_failure(!(e.isUninitialized()), expression); + quiz_assert_print_if_failure(!(e.isUninitialized()), printIfFailure); } void assert_parsed_expression_simplify_to(const char * expression, const char * simplifiedExpression, ExpressionNode::ReductionTarget target, Preferences::AngleUnit angleUnit, Preferences::ComplexFormat complexFormat, ExpressionNode::SymbolicComputation symbolicComputation, ExpressionNode::UnitConversion unitConversion) { diff --git a/poincare/test/helper.h b/poincare/test/helper.h index 6ef23c361..335efb1a3 100644 --- a/poincare/test/helper.h +++ b/poincare/test/helper.h @@ -41,6 +41,8 @@ Poincare::Expression parse_expression(const char * expression, Poincare::Context void assert_simplify(const char * expression, Poincare::Preferences::AngleUnit angleUnit = Radian, Poincare::Preferences::ComplexFormat complexFormat = Cartesian, Poincare::ExpressionNode::ReductionTarget target = User); +void assert_expression_simplify(Poincare::Expression expression, Poincare::Preferences::AngleUnit angleUnit = Radian, Poincare::Preferences::ComplexFormat complexFormat = Cartesian, Poincare::ExpressionNode::ReductionTarget target = User, const char * printIfFailure = "Error"); + void assert_parsed_expression_simplify_to(const char * expression, const char * simplifiedExpression, Poincare::ExpressionNode::ReductionTarget target = User, Poincare::Preferences::AngleUnit angleUnit = Radian, Poincare::Preferences::ComplexFormat complexFormat = Cartesian, Poincare::ExpressionNode::SymbolicComputation symbolicComputation = ReplaceAllDefinedSymbolsWithDefinition, Poincare::ExpressionNode::UnitConversion unitConversion = DefaultUnitConversion); // Approximation diff --git a/poincare/test/simplification.cpp b/poincare/test/simplification.cpp index 32094d201..00a246928 100644 --- a/poincare/test/simplification.cpp +++ b/poincare/test/simplification.cpp @@ -1304,6 +1304,22 @@ QUIZ_CASE(poincare_simplification_user_function) { Ion::Storage::sharedStorage()->recordNamed("f.func").destroy(); } +QUIZ_CASE(poincare_simplification_user_function_with_convert) { + /* User defined function + * f: x → 0→0 + * It cannot be created with a const char *, so we create it by hand. */ + Expression e = Store::Builder( + UnitConvert::Builder( + Rational::Builder(0), + Rational::Builder(0)), + Function::Builder( + "f", 1, + Symbol::Builder('x'))); + assert_expression_simplify(e); + assert_simplify("e^(f(0))", Radian, Polar); + Ion::Storage::sharedStorage()->recordNamed("f.func").destroy(); +} + QUIZ_CASE(poincare_simplification_mix) { // Root at denominator assert_parsed_expression_simplify_to("1/(√(2)+√(3))", "√(3)-√(2)");