mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-18 16:27:34 +01:00
168 lines
7.2 KiB
C++
168 lines
7.2 KiB
C++
#include <poincare_layouts.h>
|
|
#include "helper.h"
|
|
|
|
using namespace Poincare;
|
|
|
|
QUIZ_CASE(poincare_layout_constructors) {
|
|
EmptyLayout e0 = EmptyLayout::Builder();
|
|
AbsoluteValueLayout e1 = AbsoluteValueLayout::Builder(e0);
|
|
CodePointLayout e2 = CodePointLayout::Builder('a');
|
|
BinomialCoefficientLayout e3 = BinomialCoefficientLayout::Builder(e1, e2);
|
|
CeilingLayout e4 = CeilingLayout::Builder(e3);
|
|
RightParenthesisLayout e5 = RightParenthesisLayout::Builder();
|
|
RightSquareBracketLayout e6 = RightSquareBracketLayout::Builder();
|
|
CondensedSumLayout e7 = CondensedSumLayout::Builder(e4, e5, e6);
|
|
ConjugateLayout e8 = ConjugateLayout::Builder(e7);
|
|
LeftParenthesisLayout e10 = LeftParenthesisLayout::Builder();
|
|
FloorLayout e11 = FloorLayout::Builder(e10);
|
|
FractionLayout e12 = FractionLayout::Builder(e8, e11);
|
|
HorizontalLayout e13 = HorizontalLayout::Builder();
|
|
LeftSquareBracketLayout e14 = LeftSquareBracketLayout::Builder();
|
|
IntegralLayout e15 = IntegralLayout::Builder(e11, e12, e13, e14);
|
|
NthRootLayout e16 = NthRootLayout::Builder(e15);
|
|
MatrixLayout e17 = MatrixLayout::Builder();
|
|
EmptyLayout e18 = EmptyLayout::Builder();
|
|
EmptyLayout e19 = EmptyLayout::Builder();
|
|
EmptyLayout e20 = EmptyLayout::Builder();
|
|
ProductLayout e21 = ProductLayout::Builder(e17, e18, e19, e20);
|
|
EmptyLayout e22 = EmptyLayout::Builder();
|
|
EmptyLayout e23 = EmptyLayout::Builder();
|
|
EmptyLayout e24 = EmptyLayout::Builder();
|
|
SumLayout e25 = SumLayout::Builder(e21, e22, e23, e24);
|
|
VerticalOffsetLayout e26 = VerticalOffsetLayout::Builder(e25, VerticalOffsetLayoutNode::Position::Superscript);
|
|
}
|
|
|
|
QUIZ_CASE(poincare_layout_comparison) {
|
|
Layout e0 = CodePointLayout::Builder('a');
|
|
Layout e1 = CodePointLayout::Builder('a');
|
|
Layout e2 = CodePointLayout::Builder('b');
|
|
quiz_assert(e0.isIdenticalTo(e1));
|
|
quiz_assert(!e0.isIdenticalTo(e2));
|
|
|
|
Layout e3 = EmptyLayout::Builder();
|
|
Layout e4 = EmptyLayout::Builder();
|
|
quiz_assert(e3.isIdenticalTo(e4));
|
|
quiz_assert(!e3.isIdenticalTo(e0));
|
|
|
|
Layout e5 = NthRootLayout::Builder(e0);
|
|
Layout e6 = NthRootLayout::Builder(e1);
|
|
Layout e7 = NthRootLayout::Builder(e2);
|
|
quiz_assert(e5.isIdenticalTo(e6));
|
|
quiz_assert(!e5.isIdenticalTo(e7));
|
|
quiz_assert(!e5.isIdenticalTo(e0));
|
|
|
|
Layout e8 = VerticalOffsetLayout::Builder(e5, VerticalOffsetLayoutNode::Position::Superscript);
|
|
Layout e9 = VerticalOffsetLayout::Builder(e6, VerticalOffsetLayoutNode::Position::Superscript);
|
|
Layout e10 = VerticalOffsetLayout::Builder(NthRootLayout::Builder(CodePointLayout::Builder('a')), VerticalOffsetLayoutNode::Position::Subscript);
|
|
quiz_assert(e8.isIdenticalTo(e9));
|
|
quiz_assert(!e8.isIdenticalTo(e10));
|
|
quiz_assert(!e8.isIdenticalTo(e0));
|
|
|
|
Layout e11 = SumLayout::Builder(e0, e3, e6, e2);
|
|
Layout e12 = SumLayout::Builder(CodePointLayout::Builder('a'), EmptyLayout::Builder(), NthRootLayout::Builder(CodePointLayout::Builder('a')), CodePointLayout::Builder('b'));
|
|
Layout e13 = ProductLayout::Builder(CodePointLayout::Builder('a'), EmptyLayout::Builder(), NthRootLayout::Builder(CodePointLayout::Builder('a')), CodePointLayout::Builder('b'));
|
|
quiz_assert(e11.isIdenticalTo(e12));
|
|
quiz_assert(!e11.isIdenticalTo(e13));
|
|
}
|
|
|
|
QUIZ_CASE(poincare_layout_fraction_create) {
|
|
|
|
/* 12
|
|
* 12|34+5 -> "Divide" -> --- + 5
|
|
* |34
|
|
* */
|
|
Layout layout = LayoutHelper::String("1234+5", 6);
|
|
LayoutCursor cursor(layout.childAtIndex(2), LayoutCursor::Position::Left);
|
|
cursor.addFractionLayoutAndCollapseSiblings();
|
|
assert_layout_serialize_to(layout, "\u0012\u001212\u0013/\u001234\u0013\u0013+5");
|
|
quiz_assert(cursor.isEquivalentTo(LayoutCursor(layout.childAtIndex(0).childAtIndex(1), LayoutCursor::Position::Left)));
|
|
|
|
/*
|
|
* 1 1 3
|
|
* --- 3|4 -> "Divide" -> --- ---
|
|
* 2 2 4
|
|
* */
|
|
Layout l1 = HorizontalLayout::Builder(
|
|
FractionLayout::Builder(
|
|
HorizontalLayout::Builder(CodePointLayout::Builder('1')),
|
|
HorizontalLayout::Builder(CodePointLayout::Builder('2'))),
|
|
CodePointLayout::Builder('3'),
|
|
CodePointLayout::Builder('4'));
|
|
LayoutCursor c1(l1.childAtIndex(2), LayoutCursor::Position::Left);
|
|
c1.addFractionLayoutAndCollapseSiblings();
|
|
assert_layout_serialize_to(l1, "\u0012\u00121\u0013/\u00122\u0013\u0013\u0012\u00123\u0013/\u00124\u0013\u0013");
|
|
|
|
/*
|
|
* sin(x)cos(x)
|
|
* sin(x)cos(x)|2 -> "Divide" -> --------------
|
|
* 2
|
|
* */
|
|
|
|
Layout l2 = LayoutHelper::String("sin(x)cos(x)2", 13);
|
|
LayoutCursor c2(l2.childAtIndex(12), LayoutCursor::Position::Left);
|
|
c2.addFractionLayoutAndCollapseSiblings();
|
|
assert_layout_serialize_to(l2, "\u0012\u0012sin(x)cos(x)\u0013/\u00122\u0013\u0013");
|
|
}
|
|
|
|
QUIZ_CASE(poincare_layout_power) {
|
|
/*
|
|
* 2|
|
|
* 12| -> "Square" -> 12 |
|
|
*
|
|
* */
|
|
Layout l1 = LayoutHelper::String("12", 2);
|
|
LayoutCursor c1(l1.childAtIndex(1), LayoutCursor::Position::Right);
|
|
c1.addEmptySquarePowerLayout();
|
|
assert_layout_serialize_to(l1, "12^\u00122\u0013");
|
|
|
|
/* 2|
|
|
* 2| ( 2) |
|
|
* 1 | -> "Square" -> (1 ) |
|
|
*
|
|
* */
|
|
Layout l2 = HorizontalLayout::Builder(
|
|
CodePointLayout::Builder('1'),
|
|
VerticalOffsetLayout::Builder(CodePointLayout::Builder('2'), VerticalOffsetLayoutNode::Position::Superscript));
|
|
LayoutCursor c2(l2.childAtIndex(1), LayoutCursor::Position::Right);
|
|
c2.addEmptySquarePowerLayout();
|
|
assert_layout_serialize_to(l2, "(1^\u00122\u0013)^\u00122\u0013");
|
|
|
|
/* ( 2|)
|
|
* ( 2)| (( 2) |)
|
|
* (1 )| -> "Left" "Square" -> ((1 ) |)
|
|
* */
|
|
Layout l3 = HorizontalLayout::Builder(
|
|
LeftParenthesisLayout::Builder(),
|
|
CodePointLayout::Builder('1'),
|
|
VerticalOffsetLayout::Builder(CodePointLayout::Builder('2'), VerticalOffsetLayoutNode::Position::Superscript),
|
|
RightParenthesisLayout::Builder());
|
|
LayoutCursor c3(l3.childAtIndex(3), LayoutCursor::Position::Right);
|
|
c3.moveLeft(nullptr);
|
|
c3.addEmptySquarePowerLayout();
|
|
assert_layout_serialize_to(l3, "((1^\u00122\u0013)^\u00122\u0013)");
|
|
}
|
|
|
|
QUIZ_CASE(poincare_layout_parentheses_size) {
|
|
/* 3
|
|
* (2+(---)6)1
|
|
* 4
|
|
* Assert that the first and last parentheses have the same size.
|
|
*/
|
|
HorizontalLayout layout = HorizontalLayout::Builder();
|
|
LeftParenthesisLayout leftPar = LeftParenthesisLayout::Builder();
|
|
RightParenthesisLayout rightPar = RightParenthesisLayout::Builder();
|
|
layout.addChildAtIndex(leftPar, 0, 0, nullptr);
|
|
layout.addChildAtIndex(CodePointLayout::Builder('2'), 1, 1, nullptr);
|
|
layout.addChildAtIndex(CodePointLayout::Builder('+'), 2, 2, nullptr);
|
|
layout.addChildAtIndex(LeftParenthesisLayout::Builder(), 3, 3, nullptr);
|
|
layout.addChildAtIndex(FractionLayout::Builder(
|
|
CodePointLayout::Builder('3'),
|
|
CodePointLayout::Builder('4')),
|
|
4, 4, nullptr);
|
|
layout.addChildAtIndex(RightParenthesisLayout::Builder(), 4, 4, nullptr);
|
|
layout.addChildAtIndex(CodePointLayout::Builder('6'), 5, 5, nullptr);
|
|
layout.addChildAtIndex(rightPar, 7, 7, nullptr);
|
|
layout.addChildAtIndex(CodePointLayout::Builder('1'), 8, 8, nullptr);
|
|
quiz_assert(leftPar.layoutSize().height() == rightPar.layoutSize().height());
|
|
}
|