diff --git a/poincare/test/helper.cpp b/poincare/test/helper.cpp index ac173bb4c..9ef5a106a 100644 --- a/poincare/test/helper.cpp +++ b/poincare/test/helper.cpp @@ -59,14 +59,23 @@ void translate_in_ASCII_chars(char * expression) { } } -Expression parse_expression(const char * expression) { +Expression parse_expression(const char * expression, bool canBeUnparsable) { + quiz_print(expression); char buffer[500]; strlcpy(buffer, expression, sizeof(buffer)); translate_in_special_chars(buffer); Expression result = Expression::parse(buffer); + if (!canBeUnparsable) { + quiz_assert(!result.isUninitialized()); + } return result; } +void assert_expression_not_parsable(const char * expression) { + Expression e = parse_expression(expression, true); + quiz_assert(e.isUninitialized()); +} + void assert_parsed_expression_type(const char * expression, Poincare::ExpressionNode::Type type) { Expression e = parse_expression(expression); quiz_assert(e.type() == type); diff --git a/poincare/test/helper.h b/poincare/test/helper.h index a1a7b782b..e9befed7d 100644 --- a/poincare/test/helper.h +++ b/poincare/test/helper.h @@ -17,7 +17,8 @@ constexpr Poincare::Preferences::PrintFloatMode ScientificMode = Poincare::Prefe void translate_in_special_chars(char * expression); void translate_in_ASCII_chars(char * expression); -Poincare::Expression parse_expression(const char * expression); +Poincare::Expression parse_expression(const char * expression, bool canBeUnparsable = false); +void assert_expression_not_parsable(const char * expression); void assert_parsed_expression_type(const char * expression, Poincare::ExpressionNode::Type type); void assert_parsed_expression_is(const char * expression, Poincare::Expression r); void assert_parsed_expression_polynomial_degree(const char * expression, int degree, const char * symbolName = "x"); diff --git a/poincare/test/store.cpp b/poincare/test/store.cpp index 08f7b7e5b..f0e858f3c 100644 --- a/poincare/test/store.cpp +++ b/poincare/test/store.cpp @@ -58,3 +58,27 @@ QUIZ_CASE(poincare_store_user_variable) { Ion::Storage::sharedStorage()->recordNamed("f2.func").destroy(); Ion::Storage::sharedStorage()->recordNamed("funcBoth.func").destroy(); } + +QUIZ_CASE(poincare_store_that_should_fail) { + // Create a helper function + assert_parsed_expression_simplify_to("1>g(x)", "1"); + + // Store only works on variables or functions + assert_expression_not_parsable("2>f(2)"); + assert_expression_not_parsable("3>f(g(4))"); + + // Clean the storage for other tests + Ion::Storage::sharedStorage()->recordNamed("g.func").destroy(); +} + +QUIZ_CASE(poincare_store_overwrite) { + assert_parsed_expression_simplify_to("-1>g(x)", "-1"); + assert_parsed_expression_simplify_to("1+g(x)>f(x)", "1+g(?)"); + assert_parsed_expression_simplify_to("2>g", "2"); + assert_parsed_expression_evaluates_to("g(4)", "undef"); + assert_parsed_expression_evaluates_to("f(4)", "undef"); + + // Clean the storage for other tests + Ion::Storage::sharedStorage()->recordNamed("f.func").destroy(); + Ion::Storage::sharedStorage()->recordNamed("g.exp").destroy(); +}