From 78a1350f1518aaa70dbd7fcf26442582ddc6640b Mon Sep 17 00:00:00 2001 From: Gabriel Ozouf Date: Mon, 25 May 2020 12:18:16 +0200 Subject: [PATCH] [poincare/test/derivative.cpp] Added context-aware tests. New tests compute derivatives while replacing symbols with their definitions or undefined, as the device does. Change-Id: I99179bf6540182ff929938fb96a00a1ed2fbcf49 --- poincare/test/derivative.cpp | 150 +++++++++++++++++++++++++++-------- 1 file changed, 117 insertions(+), 33 deletions(-) diff --git a/poincare/test/derivative.cpp b/poincare/test/derivative.cpp index 298577469..f4da054b2 100644 --- a/poincare/test/derivative.cpp +++ b/poincare/test/derivative.cpp @@ -7,75 +7,159 @@ using namespace Poincare; -void assert_parses_and_reduces_as(const char * expression, const char * derivative) { - Shared::GlobalContext globalContext; - Expression d = parse_expression(derivative, &globalContext, false).reduce(ExpressionNode::ReductionContext(&globalContext, Cartesian, Radian, User)); - Expression e = parse_expression(expression, &globalContext, false); - Expression eReduced = e.reduce(ExpressionNode::ReductionContext(&globalContext, Cartesian, Radian, User)); - quiz_assert_print_if_failure(eReduced.isIdenticalTo(d), expression); +void fillGlobalContext() { + assert_reduce("-1→y"); + assert_reduce("9→a"); + assert_reduce("2→b"); + assert_reduce("3→c"); + assert_reduce("2x→f"); + assert_reduce("x^2→g"); +} + +void emptyGlobalContext() { + Ion::Storage::sharedStorage()->recordNamed("y.exp").destroy(); + Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy(); + Ion::Storage::sharedStorage()->recordNamed("b.exp").destroy(); + Ion::Storage::sharedStorage()->recordNamed("c.exp").destroy(); + Ion::Storage::sharedStorage()->recordNamed("f.exp").destroy(); + Ion::Storage::sharedStorage()->recordNamed("g.exp").destroy(); + +} + +void assert_parses_and_reduces_as(const char * expression, const char * simplifiedDerivative) { +#define SYMBOLIC 0 +#if SYMBOLIC + ExpressionNode::SymbolicComputation symbolicComputation = ReplaceAllDefinedSymbolsWithDefinition; +#else + ExpressionNode::SymbolicComputation symbolicComputation = ReplaceAllSymbolsWithDefinitionsOrUndefined; +#endif + + assert_parsed_expression_simplify_to(expression, simplifiedDerivative, User, Radian, Cartesian, symbolicComputation); } QUIZ_CASE(poincare_derivative_literals) { + fillGlobalContext(); + + assert_parses_and_reduces_as("diff(undef,x,0)", "undef"); + assert_parses_and_reduces_as("diff(1,x,1)", "0"); assert_parses_and_reduces_as("diff(1,x,y)", "0"); - assert_parses_and_reduces_as("diff(1,x,x)", "0"); assert_parses_and_reduces_as("diff(a,x,1)", "0"); assert_parses_and_reduces_as("diff(a,x,y)", "0"); - assert_parses_and_reduces_as("diff(a,x,x)", "0"); assert_parses_and_reduces_as("diff(x,x,1)", "1"); assert_parses_and_reduces_as("diff(x,x,y)", "1"); - assert_parses_and_reduces_as("diff(x,x,x)", "1"); - assert_parses_and_reduces_as("diff(undef,x,0)", "undef"); +#if SYMBOLIC + assert_parses_and_reduces_as("diff(1,x,z)", "0"); + assert_parses_and_reduces_as("diff(a,x,z)", "0"); + assert_parses_and_reduces_as("diff(x,x,z)", "1"); +#else + assert_parses_and_reduces_as("diff(1,x,z)", "undef"); + assert_parses_and_reduces_as("diff(a,x,z)", "undef"); + assert_parses_and_reduces_as("diff(x,x,z)", "undef"); +#endif + + emptyGlobalContext(); } QUIZ_CASE(poincare_derivative_additions) { + fillGlobalContext(); + assert_parses_and_reduces_as("diff(1+x,x,1)", "1"); - assert_parses_and_reduces_as("diff(x+a,x,x)", "1"); assert_parses_and_reduces_as("diff(a+b,x,y)", "0"); + +#if SYMBOLIC + assert_parses_and_reduces_as("diff(x+a,x,z)", "1"); +#else + assert_parses_and_reduces_as("diff(x+a,x,z)", "undef"); +#endif + + emptyGlobalContext(); } QUIZ_CASE(poincare_derivative_multiplications) { + fillGlobalContext(); + assert_parses_and_reduces_as("diff(2x,x,1)", "2"); - assert_parses_and_reduces_as("diff(x*a,x,y)", "a"); - assert_parses_and_reduces_as("diff(a*x+b,x,x)", "a"); + assert_parses_and_reduces_as("diff(x*a,x,y)", "9"); assert_parses_and_reduces_as("diff(a*b+c,x,1)", "0"); assert_parses_and_reduces_as("diff(-x,x,y)", "-1"); - assert_parses_and_reduces_as("diff(2-5x,x,x)", "-5"); + assert_parses_and_reduces_as("diff(f,x,1)", "2"); + +#if SYMBOLIC + assert_parses_and_reduces_as("diff(a*x+b,x,z)", "9"); + assert_parses_and_reduces_as("diff(2-5x,x,z)", "-5"); +#else + assert_parses_and_reduces_as("diff(a*x+b,x,z)", "undef"); + assert_parses_and_reduces_as("diff(2-5x,x,z)", "undef"); +#endif + + emptyGlobalContext(); } QUIZ_CASE(poincare_derivative_powers) { + fillGlobalContext(); + assert_parses_and_reduces_as("diff(x*x,x,1)", "2"); - assert_parses_and_reduces_as("diff(x^2,x,y)", "2y"); - assert_parses_and_reduces_as("diff(x^3/3,x,x)", "x^2"); + assert_parses_and_reduces_as("diff(x^2,x,y)", "-2"); + assert_parses_and_reduces_as("diff(x^3/3,x,y)", "1"); assert_parses_and_reduces_as("diff(1/x,x,1)", "-1"); - assert_parses_and_reduces_as("diff(2^x,x,y)", "ln(2)*2^y"); - assert_parses_and_reduces_as("diff(x^(-2),x,x)", "-2/(x^3)"); + assert_parses_and_reduces_as("diff(2^x,x,y)", "ln(2)/2"); + assert_parses_and_reduces_as("diff(x^(-2),x,2)", "-1/4"); assert_parses_and_reduces_as("diff(a^b,x,1)", "0"); - assert_parses_and_reduces_as("diff(x^a,x,y)", "a*y^(a-1)"); - assert_parses_and_reduces_as("diff(a*x^2+b*x+c,x,x)", "2a*x+b"); + assert_parses_and_reduces_as("diff(a*x^2+b*x+c,x,1)", "20"); assert_parses_and_reduces_as("diff((1+x)(2-x),x,1)", "-1"); - assert_parses_and_reduces_as("diff(diff(x^3/6,x,y),y,z)", "z"); + assert_parses_and_reduces_as("diff(g,x,3)", "6"); + +#if SYMBOLIC + assert_parses_and_reduces_as("diff(x^3/3,x,z)", "z^2"); + assert_parses_and_reduces_as("diff(x^(-2),x,z)", "-2/z^3"); + assert_parses_and_reduces_as("diff(a*x^2+b*x+c,x,z)", "18×z+2"); + assert_parses_and_reduces_as("diff(x^c,x,z)", "3×z^2"); + assert_parses_and_reduces_as("diff(diff(x^3/6,x,t),t,z)", "z"); +#else + assert_parses_and_reduces_as("diff(x^3/3,x,z)", "undef"); + assert_parses_and_reduces_as("diff(x^(-2),x,z)", "undef"); + assert_parses_and_reduces_as("diff(a*x^2+b*x+c,x,z)", "undef"); + assert_parses_and_reduces_as("diff(x^c,x,z)", "undef"); + assert_parses_and_reduces_as("diff(diff(x^3/6,x,t),t,z)", "undef"); +#endif + + emptyGlobalContext(); } QUIZ_CASE(poincare_derivative_functions) { - assert_parses_and_reduces_as("diff(sin(x),x,x)", "cos(x)"); - assert_parses_and_reduces_as("diff(cos(x),x,x)", "-sin(x)"); + fillGlobalContext(); + assert_parses_and_reduces_as("diff(tan(x),x,0)", "1"); assert_parses_and_reduces_as("diff(sin(a)+cos(b)+tan(c),x,y)", "0"); - assert_parses_and_reduces_as("diff(sin(cos(x)),x,y)", "-sin(y)*cos(cos(y))"); - - assert_parses_and_reduces_as("diff(ln(x),x,x)", "1/x"); - assert_parses_and_reduces_as("diff(ln(a*x),x,x)", "1/x"); - assert_parses_and_reduces_as("diff(log(x),x,x)", "(x*ln(10))^(-1)"); - assert_parses_and_reduces_as("diff(ln(cos(x)),x,x)", "-tan(x)"); - assert_parses_and_reduces_as("diff(diff(ln(x),x,1/tan(x)),x,x)", "1/(cos(x))^2"); + assert_parses_and_reduces_as("diff(sin(cos(x)),x,y)", "sin(1)×cos(cos(1))"); assert_parses_and_reduces_as("diff(ln(a),x,1)", "0"); - - assert_parses_and_reduces_as("diff(sinh(x),x,x)", "cosh(x)"); - assert_parses_and_reduces_as("diff(cosh(x),x,x)", "sinh(x)"); assert_parses_and_reduces_as("diff(tanh(x),x,0)", "1"); assert_parses_and_reduces_as("diff(ln(cosh(x)),x,0)", "0"); + assert_parses_and_reduces_as("diff(log(x,7),x,1/2)", "2/ln(7)"); + +#if SYMBOLIC + assert_parses_and_reduces_as("diff(sin(x),x,z)", "cos(z)"); + assert_parses_and_reduces_as("diff(cos(x),x,z)", "-sin(z)"); + assert_parses_and_reduces_as("diff(ln(x),x,z)", "1/z"); + assert_parses_and_reduces_as("diff(ln(c*x),x,z)", "1/z"); + assert_parses_and_reduces_as("diff(ln(cos(x)),x,z)", "-tan(z)"); + assert_parses_and_reduces_as("diff(diff(ln(x),x,1/tan(x)),x,z)", "1/cos(z)^2"); + assert_parses_and_reduces_as("diff(sinh(x),x,z)", "cosh(z)"); + assert_parses_and_reduces_as("diff(cosh(x),x,z)", "sinh(z)"); +#else + assert_parses_and_reduces_as("diff(sin(x),x,z)", "undef"); + assert_parses_and_reduces_as("diff(cos(x),x,z)", "undef"); + assert_parses_and_reduces_as("diff(ln(x),x,z)", "undef"); + assert_parses_and_reduces_as("diff(ln(c*x),x,z)", "undef"); + assert_parses_and_reduces_as("diff(ln(cos(x)),x,z)", "undef"); + assert_parses_and_reduces_as("diff(diff(ln(x),x,1/tan(x)),x,z)", "undef"); + assert_parses_and_reduces_as("diff(sinh(x),x,z)", "undef"); + assert_parses_and_reduces_as("diff(cosh(x),x,z)", "undef"); +#endif + + emptyGlobalContext(); } \ No newline at end of file