#include #include #include #include #include #include #include "helper.h" using namespace Poincare; template void assert_exp_is_bounded(Expression exp, T lowBound, T upBound, bool upBoundIncluded = false) { Shared::GlobalContext globalContext; T result = exp.approximateToScalar(globalContext, Cartesian, Radian); quiz_assert(result >= lowBound); quiz_assert(result < upBound || (result == upBound && upBoundIncluded)); } QUIZ_CASE(poincare_parse_function) { assert_parsed_expression_type("abs(-1)", ExpressionNode::Type::AbsoluteValue); assert_parsed_expression_type("binomial(10, 4)", ExpressionNode::Type::BinomialCoefficient); assert_parsed_expression_type("ceil(0.2)", ExpressionNode::Type::Ceiling); assert_parsed_expression_type("arg(2+𝐒)", ExpressionNode::Type::ComplexArgument); assert_parsed_expression_type("det([[1,2,3][4,5,6][7,8,9]])", ExpressionNode::Type::Determinant); assert_parsed_expression_type("diff(2Γ—x, x, 2)", ExpressionNode::Type::Derivative); #if MATRICES_ARE_DEFINED assert_parsed_expression_type("dim([[2]])", ExpressionNode::Type::MatrixDimension); #endif assert_parsed_expression_type("confidence(0.1, 100)", ExpressionNode::Type::ConfidenceInterval); assert_parsed_expression_type("conj(2)", ExpressionNode::Type::Conjugate); assert_parsed_expression_type("factor(23/42)", ExpressionNode::Type::Factor); assert_parsed_expression_type("floor(2.3)", ExpressionNode::Type::Floor); assert_parsed_expression_type("frac(2.3)", ExpressionNode::Type::FracPart); assert_parsed_expression_type("gcd(2,3)", ExpressionNode::Type::GreatCommonDivisor); assert_parsed_expression_type("im(2+𝐒)", ExpressionNode::Type::ImaginaryPart); assert_parsed_expression_type("lcm(2,3)", ExpressionNode::Type::LeastCommonMultiple); assert_parsed_expression_type("int(x, x, 2, 3)", ExpressionNode::Type::Integral); #if MATRICES_ARE_DEFINED assert_parsed_expression_type("inverse([[1,2,3][4,5,6][7,8,9]])", ExpressionNode::Type::MatrixInverse); #endif assert_parsed_expression_type("ln(2)", ExpressionNode::Type::NaperianLogarithm); assert_parsed_expression_type("log(2)", ExpressionNode::Type::Logarithm); assert_parsed_expression_type("permute(10, 4)", ExpressionNode::Type::PermuteCoefficient); assert_parsed_expression_type("prediction(0.1, 100)", ExpressionNode::Type::ConfidenceInterval); assert_parsed_expression_type("prediction95(0.1, 100)", ExpressionNode::Type::PredictionInterval); assert_parsed_expression_type("product(y,y, 4, 10)", ExpressionNode::Type::Product); assert_parsed_expression_type("quo(29, 10)", ExpressionNode::Type::DivisionQuotient); assert_parsed_expression_type("random()", ExpressionNode::Type::Random); assert_parsed_expression_type("randint(1, 2)", ExpressionNode::Type::Randint); assert_parsed_expression_type("re(2+𝐒)", ExpressionNode::Type::RealPart); assert_parsed_expression_type("rem(29, 10)", ExpressionNode::Type::DivisionRemainder); assert_parsed_expression_type("root(2,3)", ExpressionNode::Type::NthRoot); assert_parsed_expression_type("√(2)", ExpressionNode::Type::SquareRoot); assert_parsed_expression_type("round(2,3)", ExpressionNode::Type::Round); assert_parsed_expression_type("sign(3)", ExpressionNode::Type::SignFunction); assert_parsed_expression_type("sum(n,n, 4, 10)", ExpressionNode::Type::Sum); #if MATRICES_ARE_DEFINED assert_parsed_expression_type("trace([[1,2,3][4,5,6][7,8,9]])", ExpressionNode::Type::MatrixTrace); assert_parsed_expression_type("transpose([[1,2,3][4,5,6][7,8,9]])", ExpressionNode::Type::MatrixTranspose); #endif assert_parsed_expression_type("6!", ExpressionNode::Type::Factorial); } QUIZ_CASE(poincare_function_evaluate) { assert_parsed_expression_evaluates_to("abs(-1)", "1"); assert_parsed_expression_evaluates_to("abs(-1)", "1"); assert_parsed_expression_evaluates_to("abs(3+2𝐒)", "3.605551"); assert_parsed_expression_evaluates_to("abs(3+2𝐒)", "3.605551275464"); assert_parsed_expression_evaluates_to("abs([[1,-2][3,-4]])", "[[1,2][3,4]]"); assert_parsed_expression_evaluates_to("abs([[1,-2][3,-4]])", "[[1,2][3,4]]"); assert_parsed_expression_evaluates_to("abs([[3+2𝐒,3+4𝐒][5+2𝐒,3+2𝐒]])", "[[3.605551,5][5.385165,3.605551]]"); assert_parsed_expression_evaluates_to("abs([[3+2𝐒,3+4𝐒][5+2𝐒,3+2𝐒]])", "[[3.605551275464,5][5.3851648071345,3.605551275464]]"); assert_parsed_expression_evaluates_to("binomial(10, 4)", "210"); assert_parsed_expression_evaluates_to("binomial(10, 4)", "210"); assert_parsed_expression_evaluates_to("ceil(0.2)", "1"); assert_parsed_expression_evaluates_to("ceil(0.2)", "1"); #if MATRICES_ARE_DEFINED assert_parsed_expression_evaluates_to("det([[1,23,3][4,5,6][7,8,9]])", "126", System, Degree, Cartesian, 6); // FIXME: the determinant computation is not precised enough to be displayed with 7 significant digits assert_parsed_expression_evaluates_to("det([[1,23,3][4,5,6][7,8,9]])", "126"); assert_parsed_expression_evaluates_to("det([[𝐒,23-2𝐒,3×𝐒][4+𝐒,5×𝐒,6][7,8×𝐒+2,9]])", "126-231×𝐒", System, Degree, Cartesian, 6); // FIXME: the determinant computation is not precised enough to be displayed with 7 significant digits assert_parsed_expression_evaluates_to("det([[𝐒,23-2𝐒,3×𝐒][4+𝐒,5×𝐒,6][7,8×𝐒+2,9]])", "126-231×𝐒"); #endif assert_parsed_expression_evaluates_to("diff(2Γ—x, x, 2)", "2"); assert_parsed_expression_evaluates_to("diff(2Γ—x, x, 2)", "2"); assert_parsed_expression_evaluates_to("diff(2Γ—TO^2, TO, 7)", "28"); assert_parsed_expression_evaluates_to("diff(2Γ—TO^2, TO, 7)", "28"); assert_parsed_expression_evaluates_to("floor(2.3)", "2"); assert_parsed_expression_evaluates_to("floor(2.3)", "2"); assert_parsed_expression_evaluates_to("frac(2.3)", "0.3"); assert_parsed_expression_evaluates_to("frac(2.3)", "0.3"); assert_parsed_expression_evaluates_to("gcd(234,394)", "2"); assert_parsed_expression_evaluates_to("gcd(234,394)", "2"); assert_parsed_expression_evaluates_to("im(2+3𝐒)", "3"); assert_parsed_expression_evaluates_to("im(2+3𝐒)", "3"); assert_parsed_expression_evaluates_to("lcm(234,394)", "46098"); assert_parsed_expression_evaluates_to("lcm(234,394)", "46098"); assert_parsed_expression_evaluates_to("int(x,x, 1, 2)", "1.5"); assert_parsed_expression_evaluates_to("int(x,x, 1, 2)", "1.5"); assert_parsed_expression_evaluates_to("ln(2)", "0.6931472"); assert_parsed_expression_evaluates_to("ln(2)", "6.9314718055995ᴇ-1"); assert_parsed_expression_evaluates_to("log(2)", "0.30103"); assert_parsed_expression_evaluates_to("log(2)", "3.0102999566398ᴇ-1"); assert_parsed_expression_evaluates_to("permute(10, 4)", "5040"); assert_parsed_expression_evaluates_to("permute(10, 4)", "5040"); assert_parsed_expression_evaluates_to("product(n,n, 4, 10)", "604800"); assert_parsed_expression_evaluates_to("product(n,n, 4, 10)", "604800"); assert_parsed_expression_evaluates_to("quo(29, 10)", "2"); assert_parsed_expression_evaluates_to("quo(29, 10)", "2"); assert_parsed_expression_evaluates_to("re(2+𝐒)", "2"); assert_parsed_expression_evaluates_to("re(2+𝐒)", "2"); assert_parsed_expression_evaluates_to("rem(29, 10)", "9"); assert_parsed_expression_evaluates_to("rem(29, 10)", "9"); assert_parsed_expression_evaluates_to("root(2,3)", "1.259921"); assert_parsed_expression_evaluates_to("root(2,3)", "1.2599210498949"); assert_parsed_expression_evaluates_to("√(2)", "1.414214"); assert_parsed_expression_evaluates_to("√(2)", "1.4142135623731"); assert_parsed_expression_evaluates_to("√(-1)", "𝐒"); assert_parsed_expression_evaluates_to("√(-1)", "𝐒"); assert_parsed_expression_evaluates_to("sum(r,r, 4, 10)", "49"); assert_parsed_expression_evaluates_to("sum(k,k, 4, 10)", "49"); #if MATRICES_ARE_DEFINED assert_parsed_expression_evaluates_to("trace([[1,2,3][4,5,6][7,8,9]])", "15"); assert_parsed_expression_evaluates_to("trace([[1,2,3][4,5,6][7,8,9]])", "15"); #endif assert_parsed_expression_evaluates_to("confidence(0.1, 100)", "[[0,0.2]]"); assert_parsed_expression_evaluates_to("confidence(0.1, 100)", "[[0,0.2]]"); #if MATRICES_ARE_DEFINED assert_parsed_expression_evaluates_to("dim([[1,2,3][4,5,-6]])", "[[2,3]]"); assert_parsed_expression_evaluates_to("dim([[1,2,3][4,5,-6]])", "[[2,3]]"); #endif assert_parsed_expression_evaluates_to("conj(3+2×𝐒)", "3-2×𝐒"); assert_parsed_expression_evaluates_to("conj(3+2×𝐒)", "3-2×𝐒"); assert_parsed_expression_evaluates_to("factor(-23/4)", "-5.75"); assert_parsed_expression_evaluates_to("factor(-123/24)", "-5.125"); #if MATRICES_ARE_DEFINED assert_parsed_expression_evaluates_to("inverse([[1,2,3][4,5,-6][7,8,9]])", "[[-1.2917,-0.083333,0.375][1.0833,0.16667,-0.25][0.041667,-0.083333,0.041667]]", System, Degree, Cartesian, 5); // inverse is not precise enough to display 7 significative digits assert_parsed_expression_evaluates_to("inverse([[1,2,3][4,5,-6][7,8,9]])", "[[-1.2916666666667,-8.3333333333333ᴇ-2,0.375][1.0833333333333,1.6666666666667ᴇ-1,-0.25][4.1666666666667ᴇ-2,-8.3333333333333ᴇ-2,4.1666666666667ᴇ-2]]"); assert_parsed_expression_evaluates_to("inverse([[𝐒,23-2𝐒,3×𝐒][4+𝐒,5×𝐒,6][7,8×𝐒+2,9]])", "[[-0.0118-0.0455×𝐒,-0.5-0.727×𝐒,0.318+0.489×𝐒][0.0409+0.00364×𝐒,0.04-0.0218×𝐒,-0.0255+0.00091×𝐒][0.00334-0.00182×𝐒,0.361+0.535×𝐒,-0.13-0.358×𝐒]]", System, Degree, Cartesian, 3); // inverse is not precise enough to display 7 significative digits assert_parsed_expression_evaluates_to("inverse([[𝐒,23-2𝐒,3×𝐒][4+𝐒,5×𝐒,6][7,8×𝐒+2,9]])", "[[-0.0118289353958-0.0454959053685×𝐒,-0.500454959054-0.727024567789×𝐒,0.31847133758+0.488626023658×𝐒][0.0409463148317+3.63967242948ᴇ-3×𝐒,0.0400363967243-0.0218380345769×𝐒,-0.0254777070064+9.0991810737ᴇ-4×𝐒][3.33636639369ᴇ-3-1.81983621474ᴇ-3×𝐒,0.36093418259+0.534728541098×𝐒,-0.130118289354-0.357597816197×𝐒]]", System, Degree, Cartesian, 12); // FIXME: inverse is not precise enough to display 14 significative digits #endif assert_parsed_expression_evaluates_to("prediction(0.1, 100)", "[[0,0.2]]"); assert_parsed_expression_evaluates_to("prediction(0.1, 100)", "[[0,0.2]]"); assert_parsed_expression_evaluates_to("prediction95(0.1, 100)", "[[0.0412,0.1588]]"); assert_parsed_expression_evaluates_to("prediction95(0.1, 100)", "[[0.0412,0.1588]]"); assert_parsed_expression_evaluates_to("product(2+k×𝐒,k, 1, 5)", "-100-540×𝐒"); assert_parsed_expression_evaluates_to("product(2+o×𝐒,o, 1, 5)", "-100-540×𝐒"); assert_parsed_expression_evaluates_to("root(3+𝐒, 3)", "1.459366+0.1571201×𝐒"); assert_parsed_expression_evaluates_to("root(3+𝐒, 3)", "1.4593656008684+1.5712012294394ᴇ-1×𝐒"); assert_parsed_expression_evaluates_to("root(3, 3+𝐒)", "1.382007-0.1524428×𝐒"); assert_parsed_expression_evaluates_to("root(3, 3+𝐒)", "1.3820069623326-0.1524427794159×𝐒"); assert_parsed_expression_evaluates_to("root(5^((-𝐒)3^9),𝐒)", "3.504", System, Degree, Cartesian, 4); assert_parsed_expression_evaluates_to("root(5^((-𝐒)3^9),𝐒)", "3.5039410843", System, Degree, Cartesian, 11); assert_parsed_expression_evaluates_to("√(3+𝐒)", "1.755317+0.2848488×𝐒"); assert_parsed_expression_evaluates_to("√(3+𝐒)", "1.7553173018244+2.8484878459314ᴇ-1×𝐒"); assert_parsed_expression_evaluates_to("sign(-23+1)", "-1"); assert_parsed_expression_evaluates_to("sign(inf)", "1"); assert_parsed_expression_evaluates_to("sign(-inf)", "-1"); assert_parsed_expression_evaluates_to("sign(0)", "0"); assert_parsed_expression_evaluates_to("sign(-0)", "0"); assert_parsed_expression_evaluates_to("sign(x)", "undef"); assert_parsed_expression_evaluates_to("sign(2+𝐒)", "undef"); assert_parsed_expression_evaluates_to("sign(undef)", "undef"); assert_parsed_expression_evaluates_to("sum(2+n×𝐒,n,1,5)", "10+15×𝐒"); assert_parsed_expression_evaluates_to("sum(2+n×𝐒,n,1,5)", "10+15×𝐒"); #if MATRICES_ARE_DEFINED assert_parsed_expression_evaluates_to("transpose([[1,2,3][4,5,-6][7,8,9]])", "[[1,4,7][2,5,8][3,-6,9]]"); assert_parsed_expression_evaluates_to("transpose([[1,7,5][4,2,8]])", "[[1,4][7,2][5,8]]"); assert_parsed_expression_evaluates_to("transpose([[1,2][4,5][7,8]])", "[[1,4,7][2,5,8]]"); assert_parsed_expression_evaluates_to("transpose([[1,2,3][4,5,-6][7,8,9]])", "[[1,4,7][2,5,8][3,-6,9]]"); assert_parsed_expression_evaluates_to("transpose([[1,7,5][4,2,8]])", "[[1,4][7,2][5,8]]"); assert_parsed_expression_evaluates_to("transpose([[1,2][4,5][7,8]])", "[[1,4,7][2,5,8]]"); #endif assert_parsed_expression_evaluates_to("round(2.3246,3)", "2.325"); assert_parsed_expression_evaluates_to("round(2.3245,3)", "2.325"); assert_parsed_expression_evaluates_to("6!", "720"); assert_parsed_expression_evaluates_to("6!", "720"); assert_parsed_expression_evaluates_to("√(-1)", "𝐒"); assert_parsed_expression_evaluates_to("√(-1)", "𝐒"); assert_parsed_expression_evaluates_to("root(-1,3)", "0.5+0.8660254×𝐒"); assert_parsed_expression_evaluates_to("root(-1,3)", "0.5+8.6602540378444ᴇ-1×𝐒"); assert_parsed_expression_evaluates_to("int(int(xΓ—x,x,0,x),x,0,4)", "21.33333"); assert_parsed_expression_evaluates_to("int(int(xΓ—x,x,0,x),x,0,4)", "21.333333333333"); assert_parsed_expression_evaluates_to("int(1+cos(e),e, 0, 180)", "180"); assert_parsed_expression_evaluates_to("int(1+cos(e),e, 0, 180)", "180"); Expression exp = parse_expression("random()"); assert_exp_is_bounded(exp, 0.0f, 1.0f); assert_exp_is_bounded(exp, 0.0, 1.0); exp = parse_expression("randint(4,45)"); assert_exp_is_bounded(exp, 4.0f, 45.0f, true); assert_exp_is_bounded(exp, 4.0, 45.0, true); } QUIZ_CASE(poincare_function_simplify) { assert_parsed_expression_simplify_to("abs(Ο€)", "Ο€"); assert_parsed_expression_simplify_to("abs(-Ο€)", "Ο€"); assert_parsed_expression_simplify_to("abs(1+𝐒)", "√(2)"); assert_parsed_expression_simplify_to("abs(0)", "0"); assert_parsed_expression_simplify_to("arg(1+𝐒)", "Ο€/4"); assert_parsed_expression_simplify_to("binomial(20,3)", "1140"); assert_parsed_expression_simplify_to("binomial(20,10)", "184756"); assert_parsed_expression_simplify_to("ceil(-1.3)", "-1"); assert_parsed_expression_simplify_to("conj(1/2)", "1/2"); assert_parsed_expression_simplify_to("quo(19,3)", "6"); assert_parsed_expression_simplify_to("quo(19,0)", Infinity::Name()); assert_parsed_expression_simplify_to("quo(-19,3)", "-7"); assert_parsed_expression_simplify_to("rem(19,3)", "1"); assert_parsed_expression_simplify_to("rem(-19,3)", "2"); assert_parsed_expression_simplify_to("rem(19,0)", Infinity::Name()); assert_parsed_expression_simplify_to("99!", "933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000"); assert_parsed_expression_simplify_to("factor(-10008/6895)", "-(2^3Γ—3^2Γ—139)/(5Γ—7Γ—197)"); assert_parsed_expression_simplify_to("factor(1008/6895)", "(2^4Γ—3^2)/(5Γ—197)"); assert_parsed_expression_simplify_to("factor(10007)", "10007"); assert_parsed_expression_simplify_to("factor(10007^2)", Undefined::Name()); assert_parsed_expression_simplify_to("floor(-1.3)", "-2"); assert_parsed_expression_simplify_to("frac(-1.3)", "7/10"); assert_parsed_expression_simplify_to("gcd(123,278)", "1"); assert_parsed_expression_simplify_to("gcd(11,121)", "11"); assert_parsed_expression_simplify_to("im(1+5×𝐒)", "5"); assert_parsed_expression_simplify_to("lcm(123,278)", "34194"); assert_parsed_expression_simplify_to("lcm(11,121)", "121"); assert_parsed_expression_simplify_to("√(4)", "2"); assert_parsed_expression_simplify_to("re(1+5×𝐒)", "1"); assert_parsed_expression_simplify_to("root(4,3)", "root(4,3)"); assert_parsed_expression_simplify_to("root(4,Ο€)", "4^(1/Ο€)"); assert_parsed_expression_simplify_to("root(27,3)", "3"); assert_parsed_expression_simplify_to("round(4.235,2)", "106/25"); assert_parsed_expression_simplify_to("round(4.23,0)", "4"); assert_parsed_expression_simplify_to("round(4.9,0)", "5"); assert_parsed_expression_simplify_to("round(12.9,-1)", "10"); assert_parsed_expression_simplify_to("round(12.9,-2)", "0"); assert_parsed_expression_simplify_to("sign(-23)", "-1"); assert_parsed_expression_simplify_to("sign(-𝐒)", "sign(-𝐒)"); assert_parsed_expression_simplify_to("sign(0)", "0"); assert_parsed_expression_simplify_to("sign(inf)", "1"); assert_parsed_expression_simplify_to("sign(-inf)", "-1"); assert_parsed_expression_simplify_to("sign(undef)", "undef"); assert_parsed_expression_simplify_to("sign(23)", "1"); assert_parsed_expression_simplify_to("sign(log(18))", "1"); assert_parsed_expression_simplify_to("sign(-√(2))", "-1"); assert_parsed_expression_simplify_to("sign(x)", "sign(x)"); assert_parsed_expression_simplify_to("sign(2+𝐒)", "sign(2+𝐒)"); assert_parsed_expression_simplify_to("permute(99,4)", "90345024"); assert_parsed_expression_simplify_to("permute(20,-10)", Undefined::Name()); assert_parsed_expression_simplify_to("re(1/2)", "1/2"); }