Files
Upsilon/poincare/test/complex.cpp
2019-01-10 11:42:03 +01:00

153 lines
8.7 KiB
C++

#include <quiz.h>
#include <ion.h>
#include <assert.h>
#include <apps/shared/global_context.h>
#include "helper.h"
using namespace Poincare;
void assert_expression_has_complex_cartesian_parts(const char * expression, const char * real, const char * imag, Preferences::AngleUnit angleUnit = Degree) {
Shared::GlobalContext context;
Expression e = parse_expression(expression);
Expression r = e.realPart(context, angleUnit);
if (r.isUninitialized()) {
assert(real == nullptr);
} else {
r = r.simplify(context, angleUnit);
assert_parsed_expression_serialize_to(r, real);
}
Expression i = e.imaginaryPart(context, angleUnit);
if (i.isUninitialized()) {
assert(imag == nullptr);
} else {
i = i.simplify(context, angleUnit);
assert_parsed_expression_serialize_to(i, imag);
}
}
void assert_expression_has_complex_polar_parts(const char * expression, const char * norm, const char * arg, Preferences::AngleUnit angleUnit = Degree) {
Shared::GlobalContext context;
Expression e = parse_expression(expression);
Expression n = e.complexNorm(context, angleUnit);
if (n.isUninitialized()) {
assert(norm == nullptr);
} else {
n = n.simplify(context, angleUnit);
assert_parsed_expression_serialize_to(n, norm);
}
Expression a = e.complexArgument(context, angleUnit);
if (a.isUninitialized()) {
assert(arg == nullptr);
} else {
a = a.simplify(context, angleUnit);
assert_parsed_expression_serialize_to(a, arg);
}
}
QUIZ_CASE(poincare_complex_parts) {
assert_expression_has_complex_cartesian_parts("-2.3E3", "-2300", "0");
assert_expression_has_complex_cartesian_parts("3", "3", "0");
assert_expression_has_complex_cartesian_parts("inf", "inf", "0");
assert_expression_has_complex_cartesian_parts("1+2+I", "3", "1");
assert_expression_has_complex_cartesian_parts("-(5+2*I)", "-5", "-2");
assert_expression_has_complex_cartesian_parts("(5+2*I)", "5", "2");
assert_expression_has_complex_cartesian_parts("I+I", "0", "2");
assert_expression_has_complex_cartesian_parts("-2+2*I", "-2", "2");
assert_expression_has_complex_cartesian_parts("(3+I)-(2+4*I)", "1", "-3");
assert_expression_has_complex_cartesian_parts("(2+3*I)*(4-2*I)", "14", "8");
assert_expression_has_complex_cartesian_parts("(3+I)/2", "3/2", "1/2");
assert_expression_has_complex_cartesian_parts("(3+I)/(2+I)", "7/5", "-1/5");
assert_expression_has_complex_cartesian_parts("(3+I)^(2+I)", "10*cos((-4*atan(3)+ln(2)+ln(5)+2*P)/2)*X^((2*atan(3)-P)/2)", "10*sin((-4*atan(3)+ln(2)+ln(5)+2*P)/2)*X^((2*atan(3)-P)/2)", Radian);
assert_expression_has_complex_cartesian_parts("R(1+6I)", "R(2+2*R(37))/2", "R(-2+2*R(37))/2");
assert_expression_has_complex_cartesian_parts("(1+I)^2", "0", "2");
assert_expression_has_complex_cartesian_parts("2*I", "0", "2");
assert_expression_has_complex_cartesian_parts("I!", "undef", "0");
assert_expression_has_complex_cartesian_parts("3!", "6", "0");
assert_expression_has_complex_cartesian_parts("x!", "x!", "0");
assert_expression_has_complex_cartesian_parts("X", "X", "0");
assert_expression_has_complex_cartesian_parts("P", "P", "0");
assert_expression_has_complex_cartesian_parts("I", "0", "1");
assert_expression_has_complex_cartesian_parts("abs(-3)", "3", "0");
assert_expression_has_complex_cartesian_parts("abs(-3+I)", "R(10)", "0");
assert_expression_has_complex_cartesian_parts("atan(2)", "atan(2)", "0");
assert_expression_has_complex_cartesian_parts("atan(2+I)", nullptr, nullptr);
assert_expression_has_complex_cartesian_parts("binomial(10, 4)", "210", "0");
assert_expression_has_complex_cartesian_parts("ceil(-1.3)", "-1", "0");
assert_expression_has_complex_cartesian_parts("arg(-2)", "P", "0");
// TODO: confidence is not simplified yet
//assert_expression_has_complex_cartesian_parts("confidence(-2,-3)", "confidence(-2)", "0");
assert_expression_has_complex_cartesian_parts("conj(-2)", "-2", "0");
assert_expression_has_complex_cartesian_parts("conj(-2+2*I+I)", "-2", "-3");
assert_expression_has_complex_cartesian_parts("cos(12)", "cos(12)", "0");
assert_expression_has_complex_cartesian_parts("cos(12+I)", nullptr, nullptr);
assert_expression_has_complex_cartesian_parts("diff(3*x, x, 3)", "diff(3*x,x,3)", "0");
assert_expression_has_complex_cartesian_parts("quo(34,x)", "quo(34,x)", "0");
assert_expression_has_complex_cartesian_parts("rem(5,3)", "2", "0");
assert_expression_has_complex_cartesian_parts("floor(x)", "floor(x)", "0");
assert_expression_has_complex_cartesian_parts("frac(x)", "frac(x)", "0");
assert_expression_has_complex_cartesian_parts("gcd(x,y)", "gcd(x,y)", "0");
assert_expression_has_complex_cartesian_parts("im(1+I)", "1", "0");
assert_expression_has_complex_cartesian_parts("int(x^2, x, 1, 2)", "int(x^2,x,1,2)", "0");
assert_expression_has_complex_cartesian_parts("lcm(x,y)", "lcm(x,y)", "0");
// TODO: dim is not simplified yet
//assert_expression_has_complex_cartesian_parts("dim(x)", "dim(x)", "0");
assert_expression_has_complex_cartesian_parts("root(2,I)", "cos(ln(2))", "-sin(ln(2))", Radian);
assert_expression_has_complex_cartesian_parts("root(2,I+1)", "R(2)*cos((90*ln(2))/P)", "-R(2)*sin((90*ln(2))/P)");
assert_expression_has_complex_cartesian_parts("root(2,I+1)", "R(2)*cos(ln(2)/2)", "-R(2)*sin(ln(2)/2)", Radian);
assert_expression_has_complex_cartesian_parts("permute(10, 4)", "5040", "0");
// TODO: prediction is not simplified yet
//assert_expression_has_complex_cartesian_parts("prediction(-2,-3)", "prediction(-2)", "0");
assert_expression_has_complex_cartesian_parts("randint(2,4)", "randint(2,4)", "0");
assert_expression_has_complex_cartesian_parts("random()", "random()", "0");
assert_expression_has_complex_cartesian_parts("re(x)", "x", "0");
assert_expression_has_complex_cartesian_parts("round(x,y)", "round(x,y)", "0");
assert_expression_has_complex_cartesian_parts("sign(x)", "sign(x)", "0");
assert_expression_has_complex_cartesian_parts("sin(23)", "sin(23)", "0");
assert_expression_has_complex_cartesian_parts("sin(23+I)", nullptr, nullptr);
assert_expression_has_complex_cartesian_parts("R(1-I)", "R(2+2*R(2))/2", "-R(-2+2*R(2))/2");
assert_expression_has_complex_cartesian_parts("tan(23)", "tan(23)", "0");
assert_expression_has_complex_cartesian_parts("tan(23+I)", nullptr, nullptr);
// User defined variable
assert_expression_has_complex_cartesian_parts("a", "a", "0");
// a = 2+i
assert_simplify("2+I>a");
assert_expression_has_complex_cartesian_parts("a", "2", "1");
// Clean the storage for other tests
Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy();
// User defined function
assert_expression_has_complex_cartesian_parts("f(3)", "f(3)", "0");
// f: x -> x+1
assert_simplify("x+1+I>f(x)");
assert_expression_has_complex_cartesian_parts("f(3)", "4", "1");
// Clean the storage for other tests
Ion::Storage::sharedStorage()->recordNamed("f.func").destroy();
assert_expression_has_complex_polar_parts("-2.3E3", "2300", "P");
assert_expression_has_complex_polar_parts("3", "3", "0");
assert_expression_has_complex_polar_parts("inf", "inf", "0");
assert_expression_has_complex_polar_parts("1+2+I", "R(10)", "(-2*atan(3)+P)/2", Radian);
assert_expression_has_complex_polar_parts("1+2+I", "R(10)", "(90*P-atan(3)*P)/180");
assert_expression_has_complex_polar_parts("-(5+2*I)", "R(29)", "(-2*atan(5/2)-P)/2", Radian);
assert_expression_has_complex_polar_parts("(5+2*I)", "R(29)", "(-2*atan(5/2)+P)/2", Radian);
assert_expression_has_complex_polar_parts("I+I", "2", "P/2", Radian);
assert_expression_has_complex_polar_parts("I+I", "2", "P/2");
assert_expression_has_complex_polar_parts("-2+2*I", "2*R(2)", "(3*P)/4", Radian);
assert_expression_has_complex_polar_parts("(3+I)-(2+4*I)", "R(10)", "(2*atan(1/3)-P)/2", Radian);
assert_expression_has_complex_polar_parts("(2+3*I)*(4-2*I)", "2*R(65)", "(-2*atan(7/4)+P)/2", Radian);
assert_expression_has_complex_polar_parts("(3+I)/2", "R(10)/2", "(-2*atan(3)+P)/2", Radian);
assert_expression_has_complex_polar_parts("(3+I)/(2+I)", "R(2)", "(2*atan(7)-P)/2", Radian);
assert_expression_has_complex_polar_parts("(3+I)^(2+I)", "10*X^((2*atan(3)-P)/2)", "(-4*atan(3)+ln(2)+ln(5)+2*P)/2", Radian);
assert_expression_has_complex_polar_parts("(1+I)^2", "2", "P/2");
assert_expression_has_complex_polar_parts("2*I", "2", "P/2");
assert_expression_has_complex_polar_parts("3!", "6", "0");
assert_expression_has_complex_polar_parts("x!", "x!", "0");
assert_expression_has_complex_polar_parts("X", "X", "0");
assert_expression_has_complex_polar_parts("P", "P", "0");
assert_expression_has_complex_polar_parts("I", "1", "P/2");
assert_expression_has_complex_polar_parts("abs(-3)", "3", "0");
assert_expression_has_complex_polar_parts("abs(-3+I)", "R(10)", "0");
}