From b45612b739b4e57de07c303debc1ce95446c25d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 9 Mar 2017 18:19:57 +0100 Subject: [PATCH] [poincare] Add tests Change-Id: I54b53a280dc5b31d2fa90835a792d3d1b3df64e1 --- poincare/test/function.cpp | 245 +++++++++++++++++++++++++++++++++---- poincare/test/trigo.cpp | 92 +++++++++++++- 2 files changed, 313 insertions(+), 24 deletions(-) diff --git a/poincare/test/function.cpp b/poincare/test/function.cpp index 5dc3d5872..a9f0fdc0d 100644 --- a/poincare/test/function.cpp +++ b/poincare/test/function.cpp @@ -11,22 +11,93 @@ QUIZ_CASE(poincare_parse_function) { assert(e->type() == Expression::Type::AbsoluteValue); delete e; + char argText[10] = {'a', 'r', 'g', '(', '2', '+', Ion::Charset::IComplex, ')', 0}; + e = Expression::parse(argText); + assert(e->type() == Expression::Type::ComplexArgument); + delete e; + + e = Expression::parse("binomial(10, 4)"); + assert(e->type() == Expression::Type::BinomialCoefficient); + delete e; + + e = Expression::parse("ceil(0.2)"); + assert(e->type() == Expression::Type::Ceiling); + delete e; + e = Expression::parse("diff(2*x, 2)"); assert(e->type() == Expression::Type::Derivative); delete e; + e = Expression::parse("dim([[2]])"); + assert(e->type() == Expression::Type::MatrixDimension); + delete e; + + e = Expression::parse("det([[1,2,3][4,5,6][7,8,9]])"); + assert(e->type() == Expression::Type::Determinant); + delete e; + + e = Expression::parse("conj(2)"); + assert(e->type() == Expression::Type::Conjugate); + delete e; + + e = Expression::parse("floor(2.3)"); + assert(e->type() == Expression::Type::Floor); + delete e; + + e = Expression::parse("frac(2.3)"); + assert(e->type() == Expression::Type::FracPart); + delete e; + + e = Expression::parse("gcd(2,3)"); + assert(e->type() == Expression::Type::GreatCommonDivisor); + delete e; + + char imText[10] = {'i', 'm', '(', '2', '+', Ion::Charset::IComplex, ')', 0}; + e = Expression::parse(imText); + assert(e->type() == Expression::Type::ImaginaryPart); + delete e; + e = Expression::parse("int(x, 2, 3)"); assert(e->type() == Expression::Type::Integral); delete e; - e = Expression::parse("log(2)"); - assert(e->type() == Expression::Type::Logarithm); + e = Expression::parse("inverse([[1,2,3][4,5,6][7,8,9]])"); + assert(e->type() == Expression::Type::MatrixInverse); + delete e; + + e = Expression::parse("lcm(2,3)"); + assert(e->type() == Expression::Type::LeastCommonMultiple); delete e; e = Expression::parse("ln(2)"); assert(e->type() == Expression::Type::NaperianLogarithm); delete e; + e = Expression::parse("log(2)"); + assert(e->type() == Expression::Type::Logarithm); + delete e; + + e = Expression::parse("permute(10, 4)"); + assert(e->type() == Expression::Type::PermuteCoefficient); + delete e; + + e = Expression::parse("product(n, 4, 10)"); + assert(e->type() == Expression::Type::Product); + delete e; + + e = Expression::parse("quo(29, 10)"); + assert(e->type() == Expression::Type::DivisionQuotient); + delete e; + + char reText[10] = {'r', 'e', '(', '2', '+', Ion::Charset::IComplex, ')', 0}; + e = Expression::parse(reText); + assert(e->type() == Expression::Type::ReelPart); + delete e; + + e = Expression::parse("rem(29, 10)"); + assert(e->type() == Expression::Type::DivisionRemainder); + delete e; + e = Expression::parse("root(2,3)"); assert(e->type() == Expression::Type::NthRoot); delete e; @@ -36,31 +107,103 @@ QUIZ_CASE(poincare_parse_function) { assert(e->type() == Expression::Type::SquareRoot); delete e; - e = Expression::parse("det([[1,2,3][4,5,6][7,8,9]])"); - assert(e->type() == Expression::Type::Determinant); + e = Expression::parse("round(2,3)"); + assert(e->type() == Expression::Type::Round); delete e; - e = Expression::parse("inverse([[1,2,3][4,5,6][7,8,9]])"); - assert(e->type() == Expression::Type::MatrixInverse); + e = Expression::parse("sum(n, 4, 10)"); + assert(e->type() == Expression::Type::Sum); + delete e; + + e = Expression::parse("trace([[1,2,3][4,5,6][7,8,9]])"); + assert(e->type() == Expression::Type::MatrixTrace); + delete e; + + e = Expression::parse("transpose([[1,2,3][4,5,6][7,8,9]])"); + assert(e->type() == Expression::Type::MatrixTranspose); delete e; } + QUIZ_CASE(poincare_function_approximate) { GlobalContext globalContext; Expression * e = Expression::parse("abs(-1)"); assert(e->approximate(globalContext) == 1.0f); delete e; + char argText[10] = {'a', 'r', 'g', '(', '2', '+', Ion::Charset::IComplex, ')', 0}; + e = Expression::parse(argText); + assert(fabsf(e->approximate(globalContext)-atanf(0.5f)) <= 0.000001f); + delete e; + + e = Expression::parse("binomial(10, 4)"); + assert(e->approximate(globalContext) == 210.0f); + delete e; + + e = Expression::parse("ceil(0.2)"); + assert(e->approximate(globalContext) == 1.0f); + delete e; + e = Expression::parse("diff(2*x, 2)"); assert(e->approximate(globalContext) == 2.0f); delete e; + e = Expression::parse("det([[1,23,3][4,5,6][7,8,9]])"); + assert(fabsf(e->approximate(globalContext)-126.0f) <= 0.0001f); + delete e; + + e = Expression::parse("floor(2.3)"); + assert(e->approximate(globalContext) == 2.0f); + delete e; + + e = Expression::parse("frac(2.3)"); + assert(fabsf(e->approximate(globalContext)-0.3f) <= 0.000001f); + delete e; + + e = Expression::parse("gcd(234,394)"); + assert(e->approximate(globalContext) == 2.0f); + delete e; + + char imText[10] = {'i', 'm', '(', '2', '+', '3','*', Ion::Charset::IComplex, ')', 0}; + e = Expression::parse(imText); + assert(e->approximate(globalContext) == 3.0f); + delete e; + + e = Expression::parse("int(x, 1, 2)"); + assert(e->approximate(globalContext) == 3.0f/2.0f); + delete e; + + e = Expression::parse("lcm(234,394)"); + assert(e->approximate(globalContext) == 46098.0f); + delete e; + + e = Expression::parse("ln(2)"); + assert(e->approximate(globalContext) == logf(2.0f)); + delete e; + e = Expression::parse("log(2)"); assert(e->approximate(globalContext) == log10f(2.0f)); delete e; - e = Expression::parse("ln(2)"); - assert(e->approximate(globalContext) == logf(2.0f)); + e = Expression::parse("permute(10, 4)"); + assert(e->approximate(globalContext) == 5040.0f); + delete e; + + e = Expression::parse("product(n, 4, 10)"); + assert(e->approximate(globalContext) == 604800.0f); + delete e; + + e = Expression::parse("quo(29, 10)"); + assert(e->approximate(globalContext) == 2.0f); + delete e; + + char reText[10] = {'r', 'e', '(', '2', '+', Ion::Charset::IComplex, ')', 0}; + e = Expression::parse(reText); + assert(e->approximate(globalContext) == 2.0f); + delete e; + + e = Expression::parse("rem(29, 10)"); + assert(e->approximate(globalContext) == 9.0f); delete e; e = Expression::parse("root(2,3)"); @@ -72,8 +215,16 @@ QUIZ_CASE(poincare_function_approximate) { assert(e->approximate(globalContext) == sqrtf(2.0f)); delete e; - e = Expression::parse("det([[1,2,3][4,5,-6][7,8,9]])"); - assert(fabsf(e->approximate(globalContext)-(-72.0f)) <= 0.00001f); + e = Expression::parse("round(2.3245,3)"); + assert(e->approximate(globalContext) == 2.325f); + delete e; + + e = Expression::parse("sum(n, 4, 10)"); + assert(e->approximate(globalContext) == 49.0f); + delete e; + + e = Expression::parse("trace([[1,2,3][4,5,6][7,8,9]])"); + assert(e->approximate(globalContext) == 15.0f); delete e; } @@ -87,23 +238,18 @@ QUIZ_CASE(poincare_function_evaluate) { delete a; delete e; - char text1[20] ={'r','o', 'o','t', '(', '3', '+', Ion::Charset::IComplex, ',', '3',')', 0}; - a = Expression::parse(text1); + a = Expression::parse("dim([[1,2,3][4,5,-6]])"); e = a->evaluate(globalContext); - assert((1.45937f - 0.00001f) <= (((Complex *)e)->a()) && - (((Complex *)e)->a()) <= (1.45937f + 0.00001f) && - 0.15712f - 0.00001f <= (((Complex *)e)->b()) && - (((Complex *)e)->b()) <= 0.15712f + 0.00001f); + assert(fabsf(e->operand(0)->approximate(globalContext)-2.0f) <= 0.00001f); + assert(fabsf(e->operand(1)->approximate(globalContext) -3.0f) <= 0.00001f); delete a; delete e; - char text2[20] ={Ion::Charset::Root, '(', '3', '+', Ion::Charset::IComplex, ',', '3',')', 0}; - a = Expression::parse(text2); + char conjText[20] ={'c','o', 'n','j', '(', '3', '+', '2', '*', Ion::Charset::IComplex, ')', 0}; + a = Expression::parse(conjText); e = a->evaluate(globalContext); - assert((1.75532f - 0.00001f) <= (((Complex *)e)->a()) && - (((Complex *)e)->a()) <= (1.75532f + 0.00001f) && - 0.28485f - 0.00001f <= (((Complex *)e)->b()) && - (((Complex *)e)->b()) <= 0.28485f + 0.00001f); + assert(fabsf(3.0f - ((Complex *)e)->a()) <= 0.00001f && + fabsf(-2.0f - ((Complex *)e)->b()) <= 0.00001f); delete a; delete e; @@ -120,4 +266,59 @@ QUIZ_CASE(poincare_function_evaluate) { assert(fabsf(e->operand(8)->approximate(globalContext) -(1.0f/24.0f)) <= 0.00001f); delete a; delete e; + + char productText[20] ={'p', 'r', 'o', 'd', 'u', 'c', 't', '(', '2', '+', 'n', '*', Ion::Charset::IComplex, ',', '1', ',','5',')', 0}; + a = Expression::parse(productText); + e = a->evaluate(globalContext); + assert(fabsf(-100.0f - ((Complex *)e)->a()) <= 0.00001f && + fabsf(-540.0f - ((Complex *)e)->b()) <= 0.00001f); + delete a; + delete e; + + char rooText1[20] ={'r','o','o','t', '(', '3', '+', Ion::Charset::IComplex, ',', '3',')', 0}; + a = Expression::parse(rooText1); + e = a->evaluate(globalContext); + assert(fabsf(1.4593656008f - ((Complex *)e)->a()) <= 0.00001f && + fabsf(0.1571201229f - ((Complex *)e)->b()) <= 0.00001f); + delete e; + + char rooText2[20] ={'r','o','o','t', '(', '3', ',','3', '+', Ion::Charset::IComplex, ')', 0}; + a = Expression::parse(rooText2); + e = a->evaluate(globalContext); + assert(fabsf(1.38200696233f - ((Complex *)e)->a()) <= 0.00001f && + fabsf(-0.152442779f - ((Complex *)e)->b()) <= 0.00001f); + delete e; + + + char text2[20] ={Ion::Charset::Root, '(', '3', '+', Ion::Charset::IComplex, ',', '3',')', 0}; + a = Expression::parse(text2); + e = a->evaluate(globalContext); + assert((1.75532f - 0.00001f) <= (((Complex *)e)->a()) && + (((Complex *)e)->a()) <= (1.75532f + 0.00001f) && + 0.28485f - 0.00001f <= (((Complex *)e)->b()) && + (((Complex *)e)->b()) <= 0.28485f + 0.00001f); + delete a; + delete e; + + char sumText[20] ={'s', 'u', 'm', '(', '2', '+', 'n', '*', Ion::Charset::IComplex, ',', '1', ',','5',')', 0}; + a = Expression::parse(sumText); + e = a->evaluate(globalContext); + assert(fabsf(10.0f - ((Complex *)e)->a()) <= 0.00001f && + fabsf(15.0f - ((Complex *)e)->b()) <= 0.00001f); + delete a; + delete e; + + a = Expression::parse("transpose([[1,2,3][4,5,-6][7,8,9]])"); + e = a->evaluate(globalContext); + assert(fabsf(e->operand(0)->approximate(globalContext)-1.0f) <= 0.00001f); + assert(fabsf(e->operand(1)->approximate(globalContext) -4.0f) <= 0.00001f); + assert(fabsf(e->operand(2)->approximate(globalContext) -7.0f) <= 0.00001f); + assert(fabsf(e->operand(3)->approximate(globalContext) -2.0f) <= 0.00001f); + assert(fabsf(e->operand(4)->approximate(globalContext) -5.0f) <= 0.00001f); + assert(fabsf(e->operand(5)->approximate(globalContext) -8.0f) <= 0.00001f); + assert(fabsf(e->operand(6)->approximate(globalContext) -3.0f) <= 0.00001f); + assert(fabsf(e->operand(7)->approximate(globalContext) -(-6.0f)) <= 0.00001f); + assert(fabsf(e->operand(8)->approximate(globalContext) -9.0f) <= 0.00001f); + delete a; + delete e; } diff --git a/poincare/test/trigo.cpp b/poincare/test/trigo.cpp index 3b12452c7..a7dc784ae 100644 --- a/poincare/test/trigo.cpp +++ b/poincare/test/trigo.cpp @@ -27,6 +27,69 @@ QUIZ_CASE(poincare_parse_trigo) { delete e; delete e2; } + { + Expression * e = Expression::parse("cosh(0)"); + Expression * e2 = e->simplify(); + assert(e2->type() == Expression::Type::HyperbolicCosine); + delete e; + delete e2; + } + { + Expression * e = Expression::parse("sinh(0)"); + Expression * e2 = e->simplify(); + assert(e2->type() == Expression::Type::HyperbolicSine); + delete e; + delete e2; + } + { + Expression * e = Expression::parse("tanh(0)"); + Expression * e2 = e->simplify(); + assert(e2->type() == Expression::Type::HyperbolicTangent); + delete e; + delete e2; + } + { + Expression * e = Expression::parse("acos(0)"); + Expression * e2 = e->simplify(); + assert(e2->type() == Expression::Type::ArcCosine); + delete e; + delete e2; + } + { + Expression * e = Expression::parse("asin(0)"); + Expression * e2 = e->simplify(); + assert(e2->type() == Expression::Type::ArcSine); + delete e; + delete e2; + } + { + Expression * e = Expression::parse("atan(0)"); + Expression * e2 = e->simplify(); + assert(e2->type() == Expression::Type::ArcTangent); + delete e; + delete e2; + } + { + Expression * e = Expression::parse("acosh(0)"); + Expression * e2 = e->simplify(); + assert(e2->type() == Expression::Type::HyperbolicArcCosine); + delete e; + delete e2; + } + { + Expression * e = Expression::parse("asinh(0)"); + Expression * e2 = e->simplify(); + assert(e2->type() == Expression::Type::HyperbolicArcSine); + delete e; + delete e2; + } + { + Expression * e = Expression::parse("atanh(0)"); + Expression * e2 = e->simplify(); + assert(e2->type() == Expression::Type::HyperbolicArcTangent); + delete e; + delete e2; + } } QUIZ_CASE(poincare_trigo_approximate) { @@ -44,17 +107,42 @@ QUIZ_CASE(poincare_trigo_approximate) { delete e; e = Expression::parse("cosh(3)"); - assert(e->approximate(globalContext, Expression::AngleUnit::Radian) == 10.067662f); + assert(e->approximate(globalContext) == 10.067662f); delete e; e = Expression::parse("sinh(3)"); - assert(e->approximate(globalContext, Expression::AngleUnit::Radian) == 10.01787493f); + assert(e->approximate(globalContext) == 10.01787493f); delete e; e = Expression::parse("tanh(3)"); assert(0.9950547537f - 0.0000001f <= e->approximate(globalContext) && e->approximate(globalContext) <= 0.9950547537f + 0.0000001f); delete e; + + e = Expression::parse("acos(0.3)"); + assert(fabsf(1.266103673f - e->approximate(globalContext, Expression::AngleUnit::Radian)) <= 0.000001f); + delete e; + + e = Expression::parse("asin(0.3)"); + assert(fabsf(0.304692654f - e->approximate(globalContext, Expression::AngleUnit::Radian)) <= 0.000001f); + delete e; + + e = Expression::parse("atan(0.3)"); + assert(fabsf(0.2914567945f - e->approximate(globalContext, Expression::AngleUnit::Radian)) <= 0.000001f); + delete e; + + e = Expression::parse("acosh(3)"); + assert(fabsf(1.762747174f - e->approximate(globalContext)) <= 0.000001f); + delete e; + + e = Expression::parse("asinh(0.3)"); + assert(fabsf(0.2956730476f - e->approximate(globalContext)) <= 0.000001f); + delete e; + + e = Expression::parse("atanh(0.3)"); + assert(fabsf(0.3095196042f - e->approximate(globalContext)) <= 0.000001f); + delete e; + } QUIZ_CASE(poincare_trigo_evaluate) {