[poincare] Add parser tests

Change-Id: I2009700628b29be980792e6a31cd374cfdc74eaf
This commit is contained in:
Émilie Feral
2017-06-01 10:35:36 +02:00
parent ea04b00728
commit 25383b73e5
2 changed files with 37 additions and 31 deletions

View File

@@ -1,6 +1,8 @@
#ifndef POINCARE_H
#define POINCARE_H
#define MATRICES_ARE_DEFINED 1
#include <poincare/absolute_value.h>
#include <poincare/addition.h>
#include <poincare/arc_cosine.h>

View File

@@ -6,36 +6,40 @@
using namespace Poincare;
constexpr Expression::AngleUnit Degree = Expression::AngleUnit::Degree;
constexpr Expression::AngleUnit Radian = Expression::AngleUnit::Radian;
void assert_expression_parses_to(const char * text, float result, Context * context, Expression::AngleUnit angleUnit = Degree) {
char buffer_text[100] = {};
for (int i=0; i<strlen(text); i++) {
buffer_text[i] = text[i];
if (text[i] == 'E') {
buffer_text[i] = Ion::Charset::Exponent;
}
if (text[i] == 'e') {
buffer_text[i] = Ion::Charset::Exponential;
}
if (text[i] == 'I') {
buffer_text[i] = Ion::Charset::IComplex;
}
}
Expression * a = Expression::parse(buffer_text);
assert(fabsf(a->approximate(*context, angleUnit) - result) < 0.0001f);
}
QUIZ_CASE(poincare_parser) {
GlobalContext globalContext;
char text0[10] = {'1', '.', '2', '*', Ion::Charset::Exponential, '^', '(', '1', ')', 0};
Expression * a = Expression::parse(text0);
float f =1.2f*M_E;
assert(a->approximate(globalContext) == f);
char text1[10] = {Ion::Charset::Exponential, '^', '2', '*', Ion::Charset::Exponential, '^', '(', '1', ')', 0};
a = Expression::parse(text1);
f = powf(M_E, 2.0f)*M_E;
assert(a->approximate(globalContext) == f);
a = Expression::parse("2*3^4+2");
f = 2.0f*powf(3.0f, 4.0f)+2.0f;
assert(a->approximate(globalContext) == f);
a = Expression::parse("-2*3^4+2");
f = -2.0f*powf(3.0f, 4.0f)+2.0f;
assert(a->approximate(globalContext) == f);
a = Expression::parse("-sin(3)*2-3");
f = -sinf(3.0f)*2.0f-3.0f;
assert(a->approximate(globalContext, Expression::AngleUnit::Radian) == f);
a = Expression::parse("-.003");
f = -0.003f;
assert(a->approximate(globalContext) == f);
char text2[10] = {'.', '0', '2', Ion::Charset::Exponent, '2', 0};
a = Expression::parse(text2);
f = 2.0f;
assert(a->approximate(globalContext) == f);
}
assert_expression_parses_to("1.2*e^(1)", 1.2*M_E, &globalContext);
assert_expression_parses_to("e^2*e^(1)", powf(M_E, 2.0f)*M_E, &globalContext);
assert_expression_parses_to("2*3^4+2", 2.0f*powf(3.0f, 4.0f)+2.0f, &globalContext);
assert_expression_parses_to("-2*3^4+2", -2.0f*powf(3.0f, 4.0f)+2.0f, &globalContext);
assert_expression_parses_to("-sin(3)*2-3", -sinf(3.0f)*2.0f-3.0f, &globalContext, Radian);
assert_expression_parses_to("-.003", -0.003f, &globalContext);
assert_expression_parses_to(".02E2", 2.0f, &globalContext);
assert_expression_parses_to("5-2/3", 5.0f-2.0f/3.0f, &globalContext);
assert_expression_parses_to("2/3-5", 2.0f/3.0f-5.0f, &globalContext);
assert_expression_parses_to("-2/3-5", -2.0f/3.0f-5.0f, &globalContext);
assert_expression_parses_to("sin(3)2(4+2)", sinf(3.0f)*2.0f*(4.0f+2.0f), &globalContext, Radian);
assert_expression_parses_to("4/2*(2+3)", 4.0f/2.0f*(2.0f+3.0f), &globalContext, Radian);
assert_expression_parses_to("4/2*(2+3)", 4.0f/2.0f*(2.0f+3.0f), &globalContext, Radian);
}