From 18df391e5ecbf807689e3c7a23a4a69bec383646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Mon, 27 May 2019 15:27:17 +0200 Subject: [PATCH] [poincare] Add tests about cursor positioning in layout --- poincare/Makefile | 1 + poincare/test/helper.cpp | 5 +++ poincare/test/helper.h | 1 + poincare/test/layout_cursor.cpp | 74 +++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 poincare/test/layout_cursor.cpp diff --git a/poincare/Makefile b/poincare/Makefile index 6689a9982..4845e3661 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -158,6 +158,7 @@ tests += $(addprefix poincare/test/,\ infinity.cpp\ integer.cpp\ layouts.cpp\ + layout_cursor.cpp\ logarithm.cpp\ matrix.cpp\ multiplication.cpp\ diff --git a/poincare/test/helper.cpp b/poincare/test/helper.cpp index ee9a2149d..fc3436671 100644 --- a/poincare/test/helper.cpp +++ b/poincare/test/helper.cpp @@ -193,6 +193,11 @@ void assert_parsed_expression_layout_serialize_to_self(const char * expressionLa quiz_assert(strcmp(expressionLayout, buffer) == 0); } +void assert_expression_layouts_as(Poincare::Expression expression, Poincare::Layout layout) { + Layout l = expression.createLayout(DecimalMode, PrintFloat::k_numberOfStoredSignificantDigits); + quiz_assert(l.isIdenticalTo(layout)); +} + void assert_expression_layout_serialize_to(Poincare::Layout layout, const char * serialization) { constexpr int bufferSize = 255; char buffer[bufferSize]; diff --git a/poincare/test/helper.h b/poincare/test/helper.h index 91c8bcb46..091d68d74 100644 --- a/poincare/test/helper.h +++ b/poincare/test/helper.h @@ -39,6 +39,7 @@ void assert_parsed_expression_approximates_with_value_for_symbol(Poincare::Expre void assert_parsed_expression_simplify_to(const char * expression, const char * simplifiedExpression, Poincare::ExpressionNode::ReductionTarget target = Poincare::ExpressionNode::ReductionTarget::User, Poincare::Preferences::AngleUnit angleUnit = Poincare::Preferences::AngleUnit::Radian, Poincare::Preferences::ComplexFormat complexFormat = Poincare::Preferences::ComplexFormat::Cartesian); void assert_parsed_expression_serialize_to(Poincare::Expression expression, const char * serializedExpression, Poincare::Preferences::PrintFloatMode mode = DecimalMode, int numberOfSignifiantDigits = 7); +void assert_expression_layouts_as(Poincare::Expression expression, Poincare::Layout layout); // Layouts diff --git a/poincare/test/layout_cursor.cpp b/poincare/test/layout_cursor.cpp new file mode 100644 index 000000000..ee883705c --- /dev/null +++ b/poincare/test/layout_cursor.cpp @@ -0,0 +1,74 @@ +#include +#include +#include "helper.h" + +using namespace Poincare; + +void assert_inserted_layout_points_to(Layout layoutToInsert, Expression * correspondingExpression, Layout layoutToPoint) { + quiz_assert(correspondingExpression != nullptr); + assert_expression_layouts_as(*correspondingExpression, layoutToInsert); + Layout layoutToPointComputed = layoutToInsert.layoutToPointWhenInserting(correspondingExpression); + quiz_assert(layoutToPointComputed.identifier() == layoutToPoint.identifier()); +} + +QUIZ_CASE(poincare_layout_cursor_computation) { + Layout l; + Expression e; + + // 1+2 + l = HorizontalLayout::Builder( + CodePointLayout::Builder('1'), + CodePointLayout::Builder('+'), + CodePointLayout::Builder('2')); + e = Addition::Builder(Rational::Builder(1), Rational::Builder(2)); + assert_inserted_layout_points_to(l, &e, l); + + // random() + HorizontalLayout hl = HorizontalLayout::Builder(); + hl.addChildAtIndex(CodePointLayout::Builder('r'), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(CodePointLayout::Builder('a'), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(CodePointLayout::Builder('n'), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(CodePointLayout::Builder('d'), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(CodePointLayout::Builder('o'), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(CodePointLayout::Builder('m'), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(LeftParenthesisLayout::Builder(), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(RightParenthesisLayout::Builder(), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + l = hl; + e = Random::Builder(); + assert_inserted_layout_points_to(l, &e, l); + + // cos(\x11) + hl = HorizontalLayout::Builder(); + hl.addChildAtIndex(CodePointLayout::Builder('c'), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(CodePointLayout::Builder('o'), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(CodePointLayout::Builder('s'), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(LeftParenthesisLayout::Builder(), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + hl.addChildAtIndex(RightParenthesisLayout::Builder(), hl.numberOfChildren(), hl.numberOfChildren(), nullptr); + l = hl; + e = Cosine::Builder(EmptyExpression::Builder()); + assert_inserted_layout_points_to(l, &e, l.childAtIndex(3)); + + // •^• + l = HorizontalLayout::Builder( + EmptyLayout::Builder(), + VerticalOffsetLayout::Builder( + EmptyLayout::Builder(), + VerticalOffsetLayoutNode::Position::Superscript) + ); + e = Power::Builder(EmptyExpression::Builder(), EmptyExpression::Builder()); + assert_inserted_layout_points_to(l, &e, l.childAtIndex(0)); + + // int(•, x, •, •) + l = IntegralLayout::Builder( + EmptyLayout::Builder(), + HorizontalLayout::Builder( + CodePointLayout::Builder('x')), + EmptyLayout::Builder(), + EmptyLayout::Builder()); + e = Integral::Builder( + EmptyExpression::Builder(), + Symbol::Builder('x'), + EmptyExpression::Builder(), + EmptyExpression::Builder()); + assert_inserted_layout_points_to(l, &e, l.childAtIndex(2)); +}