diff --git a/poincare/src/n_ary_expression.cpp b/poincare/src/n_ary_expression.cpp index 538c1f21b..8cd1283b1 100644 --- a/poincare/src/n_ary_expression.cpp +++ b/poincare/src/n_ary_expression.cpp @@ -32,7 +32,12 @@ void NAryExpressionNode::sortChildrenInPlace(ExpressionOrder order, Context * co * multiplication) so we never swap 2 matrices. */ ExpressionNode * cj = childAtIndex(j); ExpressionNode * cj1 = childAtIndex(j+1); - if (order(cj, cj1, canBeInterrupted) > 0 && (canSwapMatrices || !(Expression(cj).deepIsMatrix(context) && Expression(cj1).deepIsMatrix(context)))) { + bool cjIsMatrix = Expression(cj).deepIsMatrix(context); + bool cj1IsMatrix = Expression(cj1).deepIsMatrix(context); + bool cj1GreaterThanCj = order(cj, cj1, canBeInterrupted) > 0; + if ((cjIsMatrix && !cj1IsMatrix) || // we always put matrices at the end of expressions + (cjIsMatrix && cj1IsMatrix && canSwapMatrices && cj1GreaterThanCj) || + (!cjIsMatrix && !cj1IsMatrix && cj1GreaterThanCj)) { reference.swapChildrenInPlace(j, j+1); isSorted = false; } diff --git a/poincare/test/expression_order.cpp b/poincare/test/expression_order.cpp index 57739d145..59ec0dc6c 100644 --- a/poincare/test/expression_order.cpp +++ b/poincare/test/expression_order.cpp @@ -216,4 +216,14 @@ QUIZ_CASE(poincare_expression_order_addition_multiplication) { assert_multiplication_or_addition_is_ordered_as(e1, e2); } + { + // ∑Matrix + 𝐢 -> 𝐢 + ∑Matrix + Expression childMatrix = Matrix::Builder(); + static_cast(childMatrix).addChildAtIndexInPlace(Rational::Builder(0), 0, 0); + Expression child1 = Sum::Builder(childMatrix, Symbol::Builder('n'), Rational::Builder(0), Rational::Builder(0)); + Expression child2 = Symbol::Builder(UCodePointMathematicalBoldSmallI); + Expression e1 = Addition::Builder(child1.clone(), child2.clone()); + Expression e2 = Addition::Builder(child2, child1); + assert_multiplication_or_addition_is_ordered_as(e1, e2); + } }