Files
Upsilon/poincare/test/expression.cpp
2020-06-04 14:50:03 +02:00

134 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <quiz.h>
#include <poincare/addition.h>
#include <poincare/decimal.h>
#include <poincare/expression.h>
#include <poincare/rational.h>
#include <poincare/unit.h>
#include <apps/shared/global_context.h>
#include "tree/helpers.h"
#include "helper.h"
using namespace Poincare;
QUIZ_CASE(poincare_expression_can_start_uninitialized) {
Expression e;
{
Rational i = Rational::Builder(1);
e = i;
}
}
QUIZ_CASE(poincare_expression_can_be_copied_even_if_uninitialized) {
Expression e;
Expression f;
f = e;
}
QUIZ_CASE(poincare_expression_cast_does_not_copy) {
Rational i1 = Rational::Builder(1);
Rational i2 = Rational::Builder(2);
Addition j = Addition::Builder(i1, i2);
Expression k = j;
quiz_assert(k.identifier() == (static_cast<Addition&>(k)).identifier());
quiz_assert(i1.identifier() == (static_cast<Expression&>(i1)).identifier());
quiz_assert(k.identifier() == (static_cast<Expression&>(k)).identifier());
}
static inline void assert_equal(const Decimal i, const Decimal j) {
quiz_assert(i.isIdenticalTo(j));
}
static inline void assert_not_equal(const Decimal i, const Decimal j) {
quiz_assert(!i.isIdenticalTo(j));
}
QUIZ_CASE(poincare_expression_decimal_constructor) {
int initialPoolSize = pool_size();
Decimal a = Decimal::Builder("123",2);
Decimal b = Decimal::Builder("3456", -4);
Decimal c = Decimal::Builder(2.34f);
Decimal d = Decimal::Builder(2322.34);
assert_pool_size(initialPoolSize+4);
assert_equal(Decimal::Builder("25", 3), Decimal::Builder("25", 3));
assert_equal(Decimal::Builder("25", 3), Decimal::Builder(25, 3));
assert_not_equal(Decimal::Builder("1000", -3), Decimal::Builder("1", -3));
assert_not_equal(Decimal::Builder("1000", 3), Decimal::Builder("1", 3));
assert_not_equal(Decimal::Builder(123,234), Decimal::Builder(42, 108));
assert_not_equal(Decimal::Builder(12,2), Decimal::Builder(123, 2));
assert_not_equal(Decimal::Builder(1234,2), Decimal::Builder(1234,3));
assert_not_equal(Decimal::Builder(12345,2), Decimal::Builder(1235,2));
assert_not_equal(Decimal::Builder(123456, -2),Decimal::Builder(1234567, -3));
assert_not_equal(Decimal::Builder(12345678, -2),Decimal::Builder(1234567, -2));
}
QUIZ_CASE(poincare_expression_rational_constructor) {
int initialPoolSize = pool_size();
Rational a = Rational::Builder("123","324");
Rational b = Rational::Builder("3456");
Rational c = Rational::Builder(123,324);
Rational d = Rational::Builder(3456789);
Integer overflow = Integer::Overflow(false);
Rational e = Rational::Builder(overflow);
Rational f = Rational::Builder(overflow, overflow);
assert_pool_size(initialPoolSize+6);
}
void assert_seconds_split_to(double totalSeconds, const char * splittedTime, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) {
Expression time = Unit::BuildTimeSplit(totalSeconds, context, complexFormat, angleUnit);
constexpr static int bufferSize = 100;
char buffer[bufferSize];
time.serialize(buffer, bufferSize, DecimalMode);
quiz_assert_print_if_failure(strcmp(buffer, splittedTime) == 0, splittedTime);
}
QUIZ_CASE(poincare_expression_unit_constructor) {
Shared::GlobalContext globalContext;
ExpressionNode::ReductionContext reductionContext = ExpressionNode::ReductionContext(&globalContext, Cartesian, Degree, User);
// 1. Time
// 1.a. Test Unit::Second constructor
Unit s = Unit::Second();
// 1.b. Test Unit::isSecond helper
quiz_assert(s.isSecond());
quiz_assert(!s.isMeter());
// 1.c. Test Unit::BuildTimeSplit constructor
assert_seconds_split_to(1234567890, "39×_year+1×_month+13×_day+19×_h+1×_min+30×_s", &globalContext, Cartesian, Degree);
assert_seconds_split_to(-122, "-2×_min-2×_s", &globalContext, Cartesian, Degree);
// 2. Speed
// 2.a. test Unit::Kilometer and Unit::Hour constructors
Expression kilometerPerHour = Multiplication::Builder(
Unit::Kilometer(),
Power::Builder(
Unit::Hour(),
Rational::Builder(-1)
)
);
kilometerPerHour = kilometerPerHour.reduce(reductionContext);
Expression meterPerSecond;
kilometerPerHour = kilometerPerHour.removeUnit(&meterPerSecond);
// 2.b. Test Unit::IsISSpeed helper
quiz_assert(Unit::IsISSpeed(meterPerSecond));
// 3. Volume
// 3.a. test Unit::Liter constructor
Expression liter = Unit::Liter();
liter = liter.reduce(reductionContext);
Expression meter3;
liter = liter.removeUnit(&meter3);
// 3.b. Test Unit::IsISVolume helper
quiz_assert(Unit::IsISVolume(meter3));
// 4. Energy
// 4.a. test Unit::Watt and Unit::Hour constructors
Expression wattHour = Multiplication::Builder(
Unit::Watt(),
Unit::Hour()
);
wattHour = wattHour.reduce(reductionContext);
Expression kilogramMeter2PerSecond2;
wattHour = wattHour.removeUnit(&kilogramMeter2PerSecond2);
// 4.b. Test Unit::IsISEnergy helper
quiz_assert(Unit::IsISEnergy(kilogramMeter2PerSecond2));
}