#include <symengine/expression.h> using SymEngine::Expression; using SymEngine::symbol; using SymEngine::eq; using SymEngine::integer; using SymEngine::real_double; using SymEngine::complex_double; using SymEngine::sin; using SymEngine::pi; TEST_CASE("Constructors of Expression", "[Expression]") { Expression e0 = symbol("x"); REQUIRE(eq(*e0.get_basic(), *symbol("x"))); Expression e1 = 20; REQUIRE(eq(*e1.get_basic(), *integer(20))); Expression e2 = 10.0; REQUIRE(eq(*e2.get_basic(), *real_double(10.0))); Expression e3 = std::complex<double>(1.0, 2.0); REQUIRE( eq(*e3.get_basic(), *complex_double(std::complex<double>(1.0, 2.0)))); } TEST_CASE("Printing of Expression", "[Expression]") { Expression e0 = symbol("x");
RCP<const Number> r3 = real_mpfr(std::move(c)); RCP<const Number> r4 = real_mpfr(std::move(d)); RCP<const Number> r5 = subnum(integer(0), r1); RCP<const Number> i1 = integer(1); RCP<const Number> i2 = integer(2); RCP<const Number> half = integer(1)->div(*integer(2)); RCP<const Number> c1 = Complex::from_two_nums(*i1, *i1); RCP<const Number> rat1 = Rational::from_two_ints(*integer(10), *integer(3)); RCP<const Number> rd1 = real_double(10.0); RCP<const Number> cd1 = complex_double(std::complex<double>(1, 2)); REQUIRE(not r1->is_one()); REQUIRE(not r1->is_minus_one()); REQUIRE(not r1->is_complex()); REQUIRE(eq(*r2, *addnum(r1, r1))); REQUIRE(is_a<RealMPFR>(*addnum(r1, rat1))); REQUIRE(eq(*r2, *addnum(r1, rd1))); REQUIRE(eq(*r1, *subnum(r1, integer(0)))); REQUIRE(is_a<RealMPFR>(*subnum(r2, rat1))); REQUIRE(eq(*r1, *subnum(r2, rd1))); REQUIRE(is_a<RealMPFR>(*subnum(rat1, r2))); REQUIRE(eq(*neg(r1), *subnum(rd1, r2))); REQUIRE(eq(*r2, *mulnum(r1, i2))); REQUIRE(eq(*r2, *mulnum(i2, r1))); REQUIRE(eq(*r3, *mulnum(r1, rd1))); REQUIRE(is_a<RealMPFR>(*mulnum(rat1, r1))); REQUIRE(eq(*r3, *mulnum(r1, r1))); REQUIRE(eq(*r1, *divnum(r2, i2))); REQUIRE(eq(*r1, *divnum(r3, rd1))); REQUIRE(is_a<RealMPFR>(*divnum(r3, rat1)));
using SymEngine::Xor; using SymEngine::Not; TEST_CASE("BooleanAtom : Basic", "[basic]") { REQUIRE(boolTrue->__str__() == "True"); REQUIRE(boolFalse->__str__() == "False"); vec_basic v = boolTrue->get_args(); vec_basic u; REQUIRE(unified_eq(v, u)); auto x = symbol("x"); CHECK_THROWS_AS(boolTrue->diff(x), SymEngineException &); REQUIRE(not eq(*boolTrue, *boolFalse)); REQUIRE(eq(*boolFalse, *boolean(false))); } TEST_CASE("Contains", "[logic]") { auto x = symbol("x"); auto y = symbol("y"); auto int1 = interval(integer(1), integer(2), false, false); auto int2 = interval(integer(1), integer(2), true, true); auto p = contains(integer(1), int2); REQUIRE(eq(*p, *boolFalse)); p = contains(integer(2), int2); REQUIRE(eq(*p, *boolFalse));
mpfr_class a(100), b(100), d(100), c(100); mpfr_set_ui(a.get_mpfr_t(), 10, MPFR_RNDN); mpfr_set_ui(b.get_mpfr_t(), 20, MPFR_RNDN); mpfr_set_ui(c.get_mpfr_t(), 100, MPFR_RNDN); mpfr_set_ui(d.get_mpfr_t(), 1024, MPFR_RNDN); RCP<const Number> r1 = real_mpfr(std::move(a)); RCP<const Number> r2 = real_mpfr(std::move(b)); RCP<const Number> r3 = real_mpfr(std::move(c)); RCP<const Number> r4 = real_mpfr(std::move(d)); RCP<const Number> r5 = subnum(integer(0), r1); RCP<const Number> i1 = integer(1); RCP<const Number> i2 = integer(2); RCP<const Number> half = integer(1)->div(*integer(2)); RCP<const Number> c1 = Complex::from_two_nums(*i1, *i1); REQUIRE(eq(*r2, *addnum(r1, r1))); REQUIRE(eq(*r2, *mulnum(r1, i2))); REQUIRE(eq(*r2, *mulnum(i2, r1))); REQUIRE(eq(*r1, *divnum(r2, i2))); REQUIRE(eq(*divnum(i1, r1), *divnum(i2, r2))); REQUIRE(eq(*r1, *subnum(r2, r1))); REQUIRE(eq(*r1, *subnum(integer(20), r1))); REQUIRE(eq(*r1, *mulnum(r2, half))); REQUIRE(eq(*r3, *pownum(r1, i2))); REQUIRE(eq(*r4, *pownum(i2, r1))); REQUIRE(eq(*r1, *pownum(r3, half))); REQUIRE(eq(*divnum(i1, r4), *half->pow(*r1))); #ifdef HAVE_SYMENGINE_MPC REQUIRE(is_a<ComplexMPC>(*addnum(r1, c1))); REQUIRE(is_a<ComplexMPC>(*mulnum(c1, r2))); REQUIRE(is_a<ComplexMPC>(*pownum(r5, half)));