[poincare] add tests on Function properties

This commit is contained in:
Émilie Feral
2018-11-16 15:50:27 +01:00
parent 6530d87805
commit fb57ac73d7
2 changed files with 17 additions and 1 deletions

View File

@@ -32,7 +32,6 @@ private:
char m_name[0]; // MUST be the last member variable
size_t nodeSize() const override { return sizeof(FunctionNode); }
VariableContext xContext(Context & parentContext) const;
// Layout
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;
int serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;
@@ -46,6 +45,7 @@ private:
};
class Function : public SymbolAbstract {
friend class FunctionNode;
public:
Function(const char * name, size_t length);
Function(const FunctionNode * n) : SymbolAbstract(n) {}
@@ -65,6 +65,9 @@ public:
Expression replaceSymbolWithExpression(const SymbolAbstract & symbol, const Expression & expression);
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit, bool replaceSymbols = true);
Expression replaceReplaceableSymbols(Context & context);
private:
Expression expand(Context & context);
VariableContext unknownXContext(Context & parentContext) const;
};
}

View File

@@ -53,6 +53,9 @@ QUIZ_CASE(poincare_polynomial_degree) {
assert_parsed_expression_polynomial_degree("prediction(0.2,10)+1", -1);
assert_parsed_expression_polynomial_degree("2-x-x^3", 3);
assert_parsed_expression_polynomial_degree("P*x", 1);
// f: x->x^2+Px+1
assert_simplify("1+P*x+x^2>f(x)");
assert_parsed_expression_polynomial_degree("f(x)", 2);
}
void assert_expression_has_characteristic_range(Expression e, float range, Preferences::AngleUnit angleUnit = Preferences::AngleUnit::Degree) {
@@ -78,6 +81,8 @@ QUIZ_CASE(poincare_characteristic_range) {
assert_expression_has_characteristic_range(Addition(Cosine::Builder(Rational(3)),Rational(2)), 0.0f);
assert_expression_has_characteristic_range(CommonLogarithm::Builder(Cosine::Builder(Multiplication(Rational(40),Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)))), 9.0f);
assert_expression_has_characteristic_range(Cosine::Builder((Expression)Cosine::Builder(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX))), 360.0f);
assert_simplify("cos(x)>f(x)");
assert_expression_has_characteristic_range(Function("f",1,Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)), 360.0f);
}
void assert_parsed_expression_has_variables(const char * expression, const char * variables[], int trueNumberOfVariables) {
@@ -112,6 +117,10 @@ QUIZ_CASE(poincare_get_variables) {
assert_parsed_expression_has_variables("BBBBBB", variableBuffer5, 1);
const char * variableBuffer6[] = {""};
assert_parsed_expression_has_variables("a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+aa+bb+cc+dd+ee+ff+gg+hh+ii+jj+kk+ll+mm+nn+oo", variableBuffer6, -1);
// f: x->1+Px+x^2+toto
assert_simplify("1+P*x+x^2+toto>f(x)");
const char * variableBuffer7[] = {"tata","toto", ""};
assert_parsed_expression_has_variables("f(tata)", variableBuffer7, 2);
}
void assert_parsed_expression_has_polynomial_coefficient(const char * expression, const char * symbolName, const char ** coefficients, Preferences::AngleUnit angleUnit = Preferences::AngleUnit::Degree) {
@@ -141,4 +150,8 @@ QUIZ_CASE(poincare_get_polynomial_coefficients) {
//assert_parsed_expression_has_polynomial_coefficient("2*(n+1)^3-4n+32*x", "n", coefficient2);
const char * coefficient3[] = {"1", "-P", "1", 0}; //x^2-Pi*x+1
assert_parsed_expression_has_polynomial_coefficient("x^2-P*x+1", "x", coefficient3);
// f: x->x^2+Px+1
const char * coefficient4[] = {"1", "P", "1", 0}; //x^2+Pi*x+1
assert_simplify("1+P*x+x^2>f(x)");
assert_parsed_expression_has_polynomial_coefficient("f(x)", "x", coefficient4);
}