diff --git a/poincare/include/poincare/opposite.h b/poincare/include/poincare/opposite.h index f19ea55e1..809aa4c43 100644 --- a/poincare/include/poincare/opposite.h +++ b/poincare/include/poincare/opposite.h @@ -13,6 +13,7 @@ public: Expression * clone() const override; Type type() const override; int polynomialDegree(char symbolName) const override; + Sign sign() const override; template static Complex compute(const Complex c, AngleUnit angleUnit); private: /* Layout */ diff --git a/poincare/src/opposite.cpp b/poincare/src/opposite.cpp index a20245e23..a394e6f4f 100644 --- a/poincare/src/opposite.cpp +++ b/poincare/src/opposite.cpp @@ -27,6 +27,16 @@ int Opposite::polynomialDegree(char symbolName) const { return operand(0)->polynomialDegree(symbolName); } +Expression::Sign Opposite::sign() const { + if (operand(0)->sign() == Sign::Positive) { + return Sign::Negative; + } + if (operand(0)->sign() == Sign::Negative) { + return Sign::Positive; + } + return Sign::Unknown; +} + /* Layout */ bool Opposite::needParenthesisWithParent(const Expression * e) const { diff --git a/poincare/test/properties.cpp b/poincare/test/properties.cpp index e19c2250d..ab8dffefb 100644 --- a/poincare/test/properties.cpp +++ b/poincare/test/properties.cpp @@ -6,6 +6,34 @@ using namespace Poincare; +constexpr Poincare::Expression::Sign Positive = Poincare::Expression::Sign::Positive; +constexpr Poincare::Expression::Sign Negative = Poincare::Expression::Sign::Negative; +constexpr Poincare::Expression::Sign Unknown = Poincare::Expression::Sign::Unknown; + +void assert_parsed_expression_sign(const char * expression, Poincare::Expression::Sign sign) { + GlobalContext globalContext; + Expression * e = parse_expression(expression); + Expression::Simplify(&e, globalContext); + assert(e->sign() == sign); + delete e; +} + +QUIZ_CASE(poincare_sign) { + assert_parsed_expression_sign("abs(-cos(2))", Positive); + assert_parsed_expression_sign("2.345E-23", Positive); + assert_parsed_expression_sign("-2.345E-23", Negative); + assert_parsed_expression_sign("2*(-3)*abs(-32)", Negative); + assert_parsed_expression_sign("2*(-3)*abs(-32)*cos(3)", Unknown); + assert_parsed_expression_sign("2^(-abs(3))", Positive); + assert_parsed_expression_sign("(-2)^4", Positive); + assert_parsed_expression_sign("(-2)^3", Negative); + assert_parsed_expression_sign("random()", Positive); + assert_parsed_expression_sign("42/3", Positive); + assert_parsed_expression_sign("-23/32", Negative); + assert_parsed_expression_sign("P", Positive); + assert_parsed_expression_sign("X", Positive); +} + QUIZ_CASE(poincare_polynomial_degree) { assert_parsed_expression_polynomial_degree("x+1", 1); assert_parsed_expression_polynomial_degree("cos(2)+1", 0);