Numworks Epsilon  1.4.1
Graphing Calculator Operating System
helper.cpp
Go to the documentation of this file.
1 #include <quiz.h>
2 #include <poincare.h>
3 #include <string.h>
4 #include <ion.h>
5 #include <stdlib.h>
6 #include <assert.h>
7 #include <cmath>
8 #if POINCARE_TESTS_PRINT_EXPRESSIONS
9 #include "../src/expression_debug.h"
10 #include <iostream>
11 using namespace std;
12 #endif
13 
14 using namespace Poincare;
15 
16 void translate_in_special_chars(char * expression) {
17  for (char *c = expression; *c; c++) {
18  switch (*c) {
19  case 'E': *c = Ion::Charset::Exponent; break;
20  case 'X': *c = Ion::Charset::Exponential; break;
21  case 'I': *c = Ion::Charset::IComplex; break;
22  case 'R': *c = Ion::Charset::Root; break;
23  case 'P': *c = Ion::Charset::SmallPi; break;
24  case '*': *c = Ion::Charset::MultiplicationSign; break;
25  case '>': *c = Ion::Charset::Sto; break;
26  }
27  }
28 }
29 
30 void translate_in_ASCII_chars(char * expression) {
31  for (char *c = expression; *c; c++) {
32  switch (*c) {
33  case Ion::Charset::Exponent: *c = 'E'; break;
34  case Ion::Charset::Exponential: *c = 'X'; break;
35  case Ion::Charset::IComplex: *c = 'I'; break;
36  case Ion::Charset::Root: *c = 'R'; break;
37  case Ion::Charset::SmallPi: *c = 'P'; break;
38  case Ion::Charset::MultiplicationSign: *c = '*'; break;
39  case Ion::Charset::Sto: *c = '>'; break;
40  }
41  }
42 }
43 
44 Expression * parse_expression(const char * expression) {
45  quiz_print(expression);
46  char buffer[200];
47  strlcpy(buffer, expression, sizeof(buffer));
49  Expression * result = Expression::parse(buffer);
50  assert(result);
51  return result;
52 }
53 
54 void assert_parsed_expression_type(const char * expression, Poincare::Expression::Type type) {
55  Expression * e = parse_expression(expression);
56  assert(e->type() == type);
57  delete e;
58 }
59 
60 void assert_parsed_expression_polynomial_degree(const char * expression, int degree, char symbolName) {
61  GlobalContext globalContext;
62  Expression * e = parse_expression(expression);
63  Expression::Simplify(&e, globalContext);
64  assert(e->polynomialDegree(symbolName) == degree);
65  delete e;
66 }
67 
68 template<typename T>
69 void assert_parsed_expression_evaluates_to(const char * expression, Complex<T> * results, int numberOfRows, int numberOfColumns, Expression::AngleUnit angleUnit) {
70  GlobalContext globalContext;
71  Expression * a = parse_expression(expression);
72  Expression * m = a->approximate<T>(globalContext, angleUnit);
73  assert(m);
75  if (m->type() == Expression::Type::Matrix) {
76  assert(static_cast<Matrix *>(m)->numberOfRows() == numberOfRows);
77  assert(static_cast<Matrix *>(m)->numberOfColumns() == numberOfColumns);
78  for (int i = 0; i < m->numberOfOperands(); i++) {
79  assert(std::fabs(static_cast<const Complex<T> *>(m->operand(i))->a() - results[i].a()) < 0.0001f);
80  assert(std::fabs(static_cast<const Complex<T> *>(m->operand(i))->b() - results[i].b()) < 0.0001f);
81  }
82  } else {
83  assert(std::fabs(static_cast<const Complex<T> *>(m)->a() - results[0].a()) < 0.0001f);
84  assert(std::fabs(static_cast<const Complex<T> *>(m)->b() - results[0].b()) < 0.0001f);
85  }
86  delete a;
87  delete m;
88 }
89 
90 void assert_parsed_expression_simplify_to(const char * expression, const char * simplifiedExpression, Expression::AngleUnit angleUnit) {
91  GlobalContext globalContext;
92  Expression * e = parse_expression(expression);
93 #if POINCARE_TESTS_PRINT_EXPRESSIONS
94  cout << "---- Simplify: " << expression << "----" << endl;
95 #endif
96  Expression::Simplify(&e, globalContext, angleUnit);
97  char buffer[500];
98  e->writeTextInBuffer(buffer, sizeof(buffer));
100 #if POINCARE_TESTS_PRINT_EXPRESSIONS
101  print_expression(e, 0);
102  cout << "---- serialize to: " << buffer << " ----" << endl;
103  cout << "----- compared to: " << simplifiedExpression << " ----\n" << endl;
104 #endif
105  assert(strcmp(buffer, simplifiedExpression) == 0);
106  delete e;
107 }
108 
template void assert_parsed_expression_evaluates_to< double >(char const *, Poincare::Complex< double > *, int, int, Poincare::Expression::AngleUnit)
void translate_in_ASCII_chars(char *expression)
Definition: helper.cpp:30
#define assert(e)
Definition: assert.h:9
Expression * approximate(Context &context, AngleUnit angleUnit=AngleUnit::Default) const
Definition: expression.cpp:338
#define T(x)
Definition: events.cpp:26
T a() const
Definition: complex.cpp:99
size_t strlcpy(char *dst, const char *src, size_t len)
Definition: strlcpy.c:3
Expression * parse_expression(const char *expression)
Definition: helper.cpp:44
void assert_parsed_expression_type(const char *expression, Poincare::Expression::Type type)
Definition: helper.cpp:54
void assert_parsed_expression_polynomial_degree(const char *expression, int degree, char symbolName)
Definition: helper.cpp:60
#define fabs(x)
Definition: math.h:178
c(generic_all_nodes)
virtual int numberOfOperands() const =0
void assert_parsed_expression_simplify_to(const char *expression, const char *simplifiedExpression, Expression::AngleUnit angleUnit)
Definition: helper.cpp:90
void print_expression(const Expression *e, int indentationLevel)
void assert_parsed_expression_evaluates_to(const char *expression, Complex< T > *results, int numberOfRows, int numberOfColumns, Expression::AngleUnit angleUnit)
Definition: helper.cpp:69
constexpr uint8_t numberOfColumns
Definition: keyboard.h:39
template void assert_parsed_expression_evaluates_to< float >(char const *, Poincare::Complex< float > *, int, int, Poincare::Expression::AngleUnit)
void quiz_print(const char *message)
Definition: runner.cpp:7
constexpr uint8_t numberOfRows
Definition: keyboard.h:35
int strcmp(const char *s1, const char *s2)
Definition: strcmp.c:3
const Expression * operand(int i) const
Definition: expression.cpp:78
void translate_in_special_chars(char *expression)
Definition: helper.cpp:16
virtual int polynomialDegree(char symbolName) const
Definition: expression.cpp:202
virtual Type type() const =0
virtual int writeTextInBuffer(char *buffer, int bufferSize, int numberOfSignificantDigits=PrintFloat::k_numberOfStoredSignificantDigits) const =0