@@ -62,6 +62,11 @@ QUIZ_CASE(poincare_parsing_tokenize_numbers) {
assert_tokenizes_as_number ( " 1.ᴇ-4 " ) ;
assert_tokenizes_as_number ( " 1.ᴇ9999 " ) ;
const Token : : Type binaryType [ ] = { Token : : BinaryNumber , Token : : EndOfStream } ;
assert_tokenizes_as ( binaryType , " 0b0011010101 " ) ;
const Token : : Type hexadecimalType [ ] = { Token : : HexadecimalNumber , Token : : EndOfStream } ;
assert_tokenizes_as ( hexadecimalType , " 0x1234567890ABCDEF " ) ;
assert_tokenizes_as_undefined_token ( " 1ᴇ " ) ;
assert_tokenizes_as_undefined_token ( " 1.. " ) ;
assert_tokenizes_as_undefined_token ( " .. " ) ;
@@ -70,11 +75,13 @@ QUIZ_CASE(poincare_parsing_tokenize_numbers) {
assert_tokenizes_as_undefined_token ( " 1ᴇ--4 " ) ;
assert_tokenizes_as_undefined_token ( " 1.ᴇᴇ4 " ) ;
assert_tokenizes_as_undefined_token ( " 1ᴇ2ᴇ4 " ) ;
assert_tokenizes_as_undefined_token ( " 0b2 " ) ;
assert_tokenizes_as_undefined_token ( " 0xG " ) ;
}
QUIZ_CASE ( poincare_parsing_memory_exhaustion ) {
int initialPoolSize = pool_size ( ) ;
assert_parsed_expression_is ( " 2+3 " , Addition : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " 2+3 " , Addition : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_pool_size ( initialPoolSize ) ;
int memoryFailureHasBeenHandled = false ;
@@ -101,9 +108,9 @@ QUIZ_CASE(poincare_parsing_memory_exhaustion) {
QUIZ_CASE ( poincare_parsing_parse_numbers ) {
// Parse decimal
assert_parsed_expression_is ( " 0 " , Rational : : Builder ( 0 ) ) ;
assert_parsed_expression_is ( " 0 " , BasedInteger : : Builder ( 0 ) ) ;
assert_parsed_expression_is ( " 0.1 " , Decimal : : Builder ( 0.1 ) ) ;
assert_parsed_expression_is ( " 1. " , Rational : : Builder ( 1 ) ) ;
assert_parsed_expression_is ( " 1. " , BasedInteger : : Builder ( 1 ) ) ;
assert_parsed_expression_is ( " .1 " , Decimal : : Builder ( 0.1 ) ) ;
assert_parsed_expression_is ( " 0ᴇ2 " , Decimal : : Builder ( 0.0 ) ) ;
assert_parsed_expression_is ( " 0.1ᴇ2 " , Decimal : : Builder ( 10.0 ) ) ;
@@ -129,8 +136,12 @@ QUIZ_CASE(poincare_parsing_parse_numbers) {
assert_parsed_expression_is ( " 99299.9999999999 " , Decimal : : Builder ( Integer ( " 99300000000000 " ) , 4 ) ) ;
// Parse integer
assert_parsed_expression_is ( " 123456789012345678765434567 " , Rational : : Builder ( " 123456789012345678765434567 " ) ) ;
assert_parsed_expression_is ( MaxIntegerString ( ) , Rational : : Builder ( MaxIntegerString ( ) ) ) ;
assert_parsed_expression_is ( " 123456789012345678765434567 " , BasedInteger : : Builder ( " 123456789012345678765434567 " ) ) ;
assert_parsed_expression_is ( MaxIntegerString ( ) , BasedInteger : : Builder ( MaxIntegerString ( ) ) ) ;
// Parsed Based integer
assert_parsed_expression_is ( " 0b1011 " , BasedInteger : : Builder ( " 1011 " , 4 , Integer : : Base : : Binary ) ) ;
assert_parsed_expression_is ( " 0x12AC " , BasedInteger : : Builder ( " 12AC " , 4 , Integer : : Base : : Hexadecimal ) ) ;
// Integer parsed in Decimal because they overflow Integer
assert_parsed_expression_is ( OverflowedIntegerString ( ) , Decimal : : Builder ( Integer ( " 17976931348623 " ) , 308 ) ) ;
@@ -146,70 +157,70 @@ QUIZ_CASE(poincare_parsing_parse_numbers) {
}
QUIZ_CASE ( poincare_parsing_parse ) {
assert_parsed_expression_is ( " 1 " , Rational : : Builder ( 1 ) ) ;
assert_parsed_expression_is ( " (1) " , Parenthesis : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " ((1)) " , Parenthesis : : Builder ( ( Expression ) Parenthesis : : Builder ( Rational : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " 1+2 " , Addition : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " (1)+2 " , Addition : : Builder ( Parenthesis : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " (1+2) " , Parenthesis : : Builder ( Addition : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ) ;
Expression nAryChildren [ ] = { Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) } ;
assert_parsed_expression_is ( " 1 " , BasedInteger : : Builder ( 1 ) ) ;
assert_parsed_expression_is ( " (1) " , Parenthesis : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " ((1)) " , Parenthesis : : Builder ( ( Expression ) Parenthesis : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " 1+2 " , Addition : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " (1)+2 " , Addition : : Builder ( Parenthesis : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " (1+2) " , Parenthesis : : Builder ( Addition : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ) ;
Expression nAryChildren [ ] = { BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) } ;
assert_parsed_expression_is ( " 1+2+3 " , Addition : : Builder ( nAryChildren , 3 ) ) ;
nAryChildren [ 2 ] = Parenthesis : : Builder ( Addition : : Builder ( Rational : : Builder ( 3 ) , Rational : : Builder ( 4 ) ) ) ;
nAryChildren [ 2 ] = Parenthesis : : Builder ( Addition : : Builder ( BasedInteger : : Builder ( 3 ) , BasedInteger : : Builder ( 4 ) ) ) ;
assert_parsed_expression_is ( " 1+2+(3+4) " , Addition : : Builder ( nAryChildren , 3 ) ) ;
assert_parsed_expression_is ( " 1× 2 " , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
nAryChildren [ 2 ] = Rational : : Builder ( 3 ) ;
assert_parsed_expression_is ( " 1× 2 " , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
nAryChildren [ 2 ] = BasedInteger : : Builder ( 3 ) ;
assert_parsed_expression_is ( " 1× 2× 3 " , Multiplication : : Builder ( nAryChildren , 3 ) ) ;
assert_parsed_expression_is ( " 1+2× 3 " , Addition : : Builder ( Rational : : Builder ( 1 ) , Multiplication : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 1/2 " , Division : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " (1/2) " , Parenthesis : : Builder ( Division : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1/2/3 " , Division : : Builder ( Division : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " 1/2× 3 " , Multiplication : : Builder ( Division : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " (1/2× 3) " , Parenthesis : : Builder ( Multiplication : : Builder ( Division : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) , Rational : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 1× 2/3 " , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Division : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " (1× 2/3) " , Parenthesis : : Builder ( Multiplication : : Builder ( Rational : : Builder ( 1 ) , Division : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_is ( " (1/2/3) " , Parenthesis : : Builder ( Division : : Builder ( Division : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) , Rational : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 1^2 " , Power : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1^2^3 " , Power : : Builder ( Rational : : Builder ( 1 ) , Power : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 1=2 " , Equal : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1+2× 3 " , Addition : : Builder ( BasedInteger : : Builder ( 1 ) , Multiplication : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 1/2 " , Division : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " (1/2) " , Parenthesis : : Builder ( Division : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1/2/3 " , Division : : Builder ( Division : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " 1/2× 3 " , Multiplication : : Builder ( Division : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " (1/2× 3) " , Parenthesis : : Builder ( Multiplication : : Builder ( Division : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) , BasedInteger : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 1× 2/3 " , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Division : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " (1× 2/3) " , Parenthesis : : Builder ( Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Division : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_is ( " (1/2/3) " , Parenthesis : : Builder ( Division : : Builder ( Division : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) , BasedInteger : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 1^2 " , Power : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1^2^3 " , Power : : Builder ( BasedInteger : : Builder ( 1 ) , Power : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 1=2 " , Equal : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_text_not_parsable ( " =5 " ) ;
assert_text_not_parsable ( " 1=2=3 " ) ;
assert_parsed_expression_is ( " -1 " , Opposite : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " (-1) " , Parenthesis : : Builder ( Opposite : : Builder ( Rational : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " 1-2 " , Subtraction : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " -1-2 " , Subtraction : : Builder ( Opposite : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1-2-3 " , Subtraction : : Builder ( Subtraction : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " (1-2) " , Parenthesis : : Builder ( Subtraction : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1+-2 " , Addition : : Builder ( Rational : : Builder ( 1 ) , Opposite : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " --1 " , Opposite : : Builder ( ( Expression ) Opposite : : Builder ( Rational : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " (1+2)-3 " , Subtraction : : Builder ( Parenthesis : : Builder ( Addition : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " (2× -3) " , Parenthesis : : Builder ( Multiplication : : Builder ( Rational : : Builder ( 2 ) , Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_is ( " 1^(2)-3 " , Subtraction : : Builder ( Power : : Builder ( Rational : : Builder ( 1 ) , Parenthesis : : Builder ( Rational : : Builder ( 2 ) ) ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " 1^2-3 " , Subtraction : : Builder ( Power : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " 2^-3 " , Power : : Builder ( Rational : : Builder ( 2 ) , Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 2--2+-1 " , Addition : : Builder ( Subtraction : : Builder ( Rational : : Builder ( 2 ) , Opposite : : Builder ( Rational : : Builder ( 2 ) ) ) , Opposite : : Builder ( Rational : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " 2--2× -1 " , Subtraction : : Builder ( Rational : : Builder ( 2 ) , Opposite : : Builder ( Multiplication : : Builder ( Rational : : Builder ( 2 ) , Opposite : : Builder ( Rational : : Builder ( 1 ) ) ) ) ) ) ;
assert_parsed_expression_is ( " -1^2 " , Opposite : : Builder ( Power : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 2ℯ ^(3) " , Multiplication : : Builder ( Rational : : Builder ( 2 ) , Power : : Builder ( Constant : : Builder ( UCodePointScriptSmallE ) , Parenthesis : : Builder ( Rational : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_is ( " 2/-3/-4 " , Division : : Builder ( Division : : Builder ( Rational : : Builder ( 2 ) , Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) , Opposite : : Builder ( Rational : : Builder ( 4 ) ) ) ) ;
assert_parsed_expression_is ( " 1× 2-3× 4 " , Subtraction : : Builder ( Multiplication : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) , Multiplication : : Builder ( Rational : : Builder ( 3 ) , Rational : : Builder ( 4 ) ) ) ) ;
assert_parsed_expression_is ( " -1× 2 " , Opposite : : Builder ( Multiplication : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1! " , Factorial : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " 1+2! " , Addition : : Builder ( Rational : : Builder ( 1 ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!+2 " , Addition : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!+2! " , Addition : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1× 2! " , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!× 2 " , Multiplication : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!× 2! " , Multiplication : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1-2! " , Subtraction : : Builder ( Rational : : Builder ( 1 ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!-2 " , Subtraction : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!-2! " , Subtraction : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1/2! " , Division : : Builder ( Rational : : Builder ( 1 ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!/2 " , Division : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!/2! " , Division : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1^2! " , Power : : Builder ( Rational : : Builder ( 1 ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!^2 " , Power : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!^2! " , Power : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Factorial : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " (1)! " , Factorial : : Builder ( Parenthesis : : Builder ( Rational : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " -1 " , Opposite : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " (-1) " , Parenthesis : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " 1-2 " , Subtraction : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " -1-2 " , Subtraction : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1-2-3 " , Subtraction : : Builder ( Subtraction : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " (1-2) " , Parenthesis : : Builder ( Subtraction : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1+-2 " , Addition : : Builder ( BasedInteger : : Builder ( 1 ) , Opposite : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " --1 " , Opposite : : Builder ( ( Expression ) Opposite : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " (1+2)-3 " , Subtraction : : Builder ( Parenthesis : : Builder ( Addition : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " (2× -3) " , Parenthesis : : Builder ( Multiplication : : Builder ( BasedInteger : : Builder ( 2 ) , Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_is ( " 1^(2)-3 " , Subtraction : : Builder ( Power : : Builder ( BasedInteger : : Builder ( 1 ) , Parenthesis : : Builder ( BasedInteger : : Builder ( 2 ) ) ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " 1^2-3 " , Subtraction : : Builder ( Power : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " 2^-3 " , Power : : Builder ( BasedInteger : : Builder ( 2 ) , Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) ) ;
assert_parsed_expression_is ( " 2--2+-1 " , Addition : : Builder ( Subtraction : : Builder ( BasedInteger : : Builder ( 2 ) , Opposite : : Builder ( BasedInteger : : Builder ( 2 ) ) ) , Opposite : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " 2--2× -1 " , Subtraction : : Builder ( BasedInteger : : Builder ( 2 ) , Opposite : : Builder ( Multiplication : : Builder ( BasedInteger : : Builder ( 2 ) , Opposite : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ) ) ) ;
assert_parsed_expression_is ( " -1^2 " , Opposite : : Builder ( Power : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 2ℯ ^(3) " , Multiplication : : Builder ( BasedInteger : : Builder ( 2 ) , Power : : Builder ( Constant : : Builder ( UCodePointScriptSmallE ) , Parenthesis : : Builder ( BasedInteger : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_is ( " 2/-3/-4 " , Division : : Builder ( Division : : Builder ( BasedInteger : : Builder ( 2 ) , Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) , Opposite : : Builder ( BasedInteger : : Builder ( 4 ) ) ) ) ;
assert_parsed_expression_is ( " 1× 2-3× 4 " , Subtraction : : Builder ( Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) , Multiplication : : Builder ( BasedInteger : : Builder ( 3 ) , BasedInteger : : Builder ( 4 ) ) ) ) ;
assert_parsed_expression_is ( " -1× 2 " , Opposite : : Builder ( Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1! " , Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " 1+2! " , Addition : : Builder ( BasedInteger : : Builder ( 1 ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!+2 " , Addition : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!+2! " , Addition : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1× 2! " , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!× 2 " , Multiplication : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!× 2! " , Multiplication : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1-2! " , Subtraction : : Builder ( BasedInteger : : Builder ( 1 ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!-2 " , Subtraction : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!-2! " , Subtraction : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1/2! " , Division : : Builder ( BasedInteger : : Builder ( 1 ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!/2 " , Division : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!/2! " , Division : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1^2! " , Power : : Builder ( BasedInteger : : Builder ( 1 ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!^2 " , Power : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1!^2! " , Power : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , Factorial : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " (1)! " , Factorial : : Builder ( Parenthesis : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ) ;
assert_text_not_parsable ( " 1+ " ) ;
assert_text_not_parsable ( " ) " ) ;
assert_text_not_parsable ( " )( " ) ;
@@ -226,6 +237,8 @@ QUIZ_CASE(poincare_parsing_parse) {
assert_text_not_parsable ( " 0→x=0 " ) ;
assert_text_not_parsable ( " 0=0→x " ) ;
assert_text_not_parsable ( " 1ᴇ2ᴇ3 " ) ;
assert_text_not_parsable ( " 0b001112 " ) ;
//assert_text_not_parsable("0x123G");
}
Matrix BuildMatrix ( int rows , int columns , Expression entries [ ] ) {
@@ -242,13 +255,13 @@ Matrix BuildMatrix(int rows, int columns, Expression entries[]) {
}
QUIZ_CASE ( poincare_parsing_matrices ) {
Expression m1 [ ] = { Rational : : Builder ( 1 ) } ;
Expression m1 [ ] = { BasedInteger : : Builder ( 1 ) } ;
assert_parsed_expression_is ( " [[1]] " , BuildMatrix ( 1 , 1 , m1 ) ) ;
Expression m2 [ ] = { Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) } ;
Expression m2 [ ] = { BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) } ;
assert_parsed_expression_is ( " [[1,2,3]] " , BuildMatrix ( 1 , 3 , m2 ) ) ;
Expression m3 [ ] = { Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) , Rational : : Builder ( 4 ) , Rational : : Builder ( 5 ) , Rational : : Builder ( 6 ) } ;
Expression m3 [ ] = { BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) , BasedInteger : : Builder ( 4 ) , BasedInteger : : Builder ( 5 ) , BasedInteger : : Builder ( 6 ) } ;
assert_parsed_expression_is ( " [[1,2,3][4,5,6]] " , BuildMatrix ( 2 , 3 , m3 ) ) ;
Expression m4 [ ] = { Rational : : Builder ( 1 ) , BuildMatrix ( 1 , 1 , m1 ) } ;
Expression m4 [ ] = { BasedInteger : : Builder ( 1 ) , BuildMatrix ( 1 , 1 , m1 ) } ;
assert_parsed_expression_is ( " [[1,[[1]]]] " , BuildMatrix ( 1 , 2 , m4 ) ) ;
assert_text_not_parsable ( " [ " ) ;
assert_text_not_parsable ( " ] " ) ;
@@ -281,12 +294,12 @@ QUIZ_CASE(poincare_parsing_symbols_and_functions) {
// User-defined functions
assert_parsed_expression_is ( " f(x) " , Function : : Builder ( " f " , 1 , Symbol : : Builder ( " x " , 1 ) ) ) ;
assert_parsed_expression_is ( " f(1) " , Function : : Builder ( " f " , 1 , Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " f(1) " , Function : : Builder ( " f " , 1 , BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " ab12AB_(x) " , Function : : Builder ( " ab12AB_ " , 7 , Symbol : : Builder ( " x " , 1 ) ) ) ;
assert_parsed_expression_is ( " ab12AB_(1) " , Function : : Builder ( " ab12AB_ " , 7 , Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " ab12AB_(1) " , Function : : Builder ( " ab12AB_ " , 7 , BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " f(g(x)) " , Function : : Builder ( " f " , 1 , Function : : Builder ( " g " , 1 , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " f(g(1)) " , Function : : Builder ( " f " , 1 , Function : : Builder ( " g " , 1 , Rational : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " f((1)) " , Function : : Builder ( " f " , 1 , Parenthesis : : Builder ( Rational : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " f(g(1)) " , Function : : Builder ( " f " , 1 , Function : : Builder ( " g " , 1 , BasedInteger : : Builder ( 1 ) ) ) ) ;
assert_parsed_expression_is ( " f((1)) " , Function : : Builder ( " f " , 1 , Parenthesis : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ) ;
assert_text_not_parsable ( " f(1,2) " ) ;
assert_text_not_parsable ( " f(f) " ) ;
assert_text_not_parsable ( " abcdefgh(1) " ) ;
@@ -303,67 +316,67 @@ QUIZ_CASE(poincare_parsing_symbols_and_functions) {
assert_text_not_parsable ( " v " ) ;
// Reserved functions
assert_parsed_expression_is ( " acos(1) " , ArcCosine : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " acosh(1) " , HyperbolicArcCosine : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " abs(1) " , AbsoluteValue : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " arg(1) " , ComplexArgument : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " asin(1) " , ArcSine : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " asinh(1) " , HyperbolicArcSine : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " atan(1) " , ArcTangent : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " atanh(1) " , HyperbolicArcTangent : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " binomial(2,1) " , BinomialCoefficient : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " ceil(1) " , Ceiling : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " confidence(1,2) " , ConfidenceInterval : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " acos(1) " , ArcCosine : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " acosh(1) " , HyperbolicArcCosine : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " abs(1) " , AbsoluteValue : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " arg(1) " , ComplexArgument : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " asin(1) " , ArcSine : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " asinh(1) " , HyperbolicArcSine : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " atan(1) " , ArcTangent : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " atanh(1) " , HyperbolicArcTangent : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " binomial(2,1) " , BinomialCoefficient : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " ceil(1) " , Ceiling : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " confidence(1,2) " , ConfidenceInterval : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_text_not_parsable ( " diff(1,2,3) " ) ;
assert_parsed_expression_is ( " diff(1,x,3) " , Derivative : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " dim(1) " , MatrixDimension : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " conj(1) " , Conjugate : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " det(1) " , Determinant : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " cos(1) " , Cosine : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " cosh(1) " , HyperbolicCosine : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " factor(1) " , Factor : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " floor(1) " , Floor : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " frac(1) " , FracPart : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " gcd(1,2) " , GreatCommonDivisor : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " im(1) " , ImaginaryPart : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " int(1,x,2,3) " , Integral : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) , Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " diff(1,x,3) " , Derivative : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " dim(1) " , MatrixDimension : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " conj(1) " , Conjugate : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " det(1) " , Determinant : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " cos(1) " , Cosine : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " cosh(1) " , HyperbolicCosine : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " factor(1) " , Factor : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " floor(1) " , Floor : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " frac(1) " , FracPart : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " gcd(1,2) " , GreatCommonDivisor : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " im(1) " , ImaginaryPart : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " int(1,x,2,3) " , Integral : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) , BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_text_not_parsable ( " int(1,2,3,4) " ) ;
assert_parsed_expression_is ( " inverse(1) " , MatrixInverse : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " lcm(1,2) " , LeastCommonMultiple : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " ln(1) " , NaperianLogarithm : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " log(1) " , CommonLogarithm : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " log(1,2) " , Logarithm : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " log_{2}(1) " , Logarithm : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " permute(2,1) " , PermuteCoefficient : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " prediction95(1,2) " , PredictionInterval : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " prediction(1,2) " , SimplePredictionInterval : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " product(1,n,2,3) " , Product : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " n " , 1 ) , Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " inverse(1) " , MatrixInverse : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " lcm(1,2) " , LeastCommonMultiple : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " ln(1) " , NaperianLogarithm : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " log(1) " , CommonLogarithm : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " log(1,2) " , Logarithm : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " log_{2}(1) " , Logarithm : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " permute(2,1) " , PermuteCoefficient : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " prediction95(1,2) " , PredictionInterval : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " prediction(1,2) " , SimplePredictionInterval : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " product(1,n,2,3) " , Product : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " n " , 1 ) , BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_text_not_parsable ( " product(1,2,3,4) " ) ;
assert_parsed_expression_is ( " quo(1,2) " , DivisionQuotient : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " quo(1,2) " , DivisionQuotient : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " random() " , Random : : Builder ( ) ) ;
assert_parsed_expression_is ( " randint(1,2) " , Randint : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " re(1) " , RealPart : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " rem(1,2) " , DivisionRemainder : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " root(1,2) " , NthRoot : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " round(1,2) " , Round : : Builder ( Rational : : Builder ( 1 ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " sin(1) " , Sine : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " sign(1) " , SignFunction : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " sinh(1) " , HyperbolicSine : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " sum(1,n,2,3) " , Sum : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " n " , 1 ) , Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ;
assert_parsed_expression_is ( " randint(1,2) " , Randint : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " re(1) " , RealPart : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " rem(1,2) " , DivisionRemainder : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " root(1,2) " , NthRoot : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " round(1,2) " , Round : : Builder ( BasedInteger : : Builder ( 1 ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " sin(1) " , Sine : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " sign(1) " , SignFunction : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " sinh(1) " , HyperbolicSine : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " sum(1,n,2,3) " , Sum : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " n " , 1 ) , BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ;
assert_text_not_parsable ( " sum(1,2,3,4) " ) ;
assert_parsed_expression_is ( " tan(1) " , Tangent : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " tanh(1) " , HyperbolicTangent : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " trace(1) " , MatrixTrace : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " transpose(1) " , MatrixTranspose : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " √(1) " , SquareRoot : : Builder ( Rational : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " tan(1) " , Tangent : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " tanh(1) " , HyperbolicTangent : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " trace(1) " , MatrixTrace : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " transpose(1) " , MatrixTranspose : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_parsed_expression_is ( " √(1) " , SquareRoot : : Builder ( BasedInteger : : Builder ( 1 ) ) ) ;
assert_text_not_parsable ( " cos(1,2) " ) ;
assert_text_not_parsable ( " log(1,2,3) " ) ;
}
QUIZ_CASE ( poincare_parsing_parse_store ) {
assert_parsed_expression_is ( " 1→a " , Store : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " a " , 1 ) ) ) ;
assert_parsed_expression_is ( " 1→e " , Store : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " e " , 1 ) ) ) ;
assert_parsed_expression_is ( " 1→f(x) " , Store : : Builder ( Rational : : Builder ( 1 ) , Function : : Builder ( " f " , 1 , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " 1→a " , Store : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " a " , 1 ) ) ) ;
assert_parsed_expression_is ( " 1→e " , Store : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " e " , 1 ) ) ) ;
assert_parsed_expression_is ( " 1→f(x) " , Store : : Builder ( BasedInteger : : Builder ( 1 ) , Function : : Builder ( " f " , 1 , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " x→f(x) " , Store : : Builder ( Symbol : : Builder ( " x " , 1 ) , Function : : Builder ( " f " , 1 , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " n→f(x) " , Store : : Builder ( Symbol : : Builder ( " n " , 1 ) , Function : : Builder ( " f " , 1 , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
Expression m0 [ ] = { Symbol : : Builder ( ' x ' ) } ;
@@ -399,50 +412,50 @@ QUIZ_CASE(poincare_parsing_parse_store) {
QUIZ_CASE ( poincare_parsing_implicit_multiplication ) {
assert_text_not_parsable ( " .1.2 " ) ;
assert_text_not_parsable ( " 1 2 " ) ;
assert_parsed_expression_is ( " 1x " , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) ) ;
assert_parsed_expression_is ( " 1ans " , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " ans " , 3 ) ) ) ;
assert_parsed_expression_is ( " 1x " , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) ) ;
assert_parsed_expression_is ( " 1ans " , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " ans " , 3 ) ) ) ;
assert_parsed_expression_is ( " x1 " , Symbol : : Builder ( " x1 " , 2 ) ) ;
assert_parsed_expression_is ( " 1x+2 " , Addition : : Builder ( Multiplication : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1π " , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Constant : : Builder ( UCodePointGreekSmallLetterPi ) ) ) ;
assert_parsed_expression_is ( " 1x-2 " , Subtraction : : Builder ( Multiplication : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " -1x " , Opposite : : Builder ( Multiplication : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " 2× 1x " , Multiplication : : Builder ( Rational : : Builder ( 2 ) , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " 2^1x " , Multiplication : : Builder ( Power : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 1 ) ) , Symbol : : Builder ( " x " , 1 ) ) ) ;
assert_parsed_expression_is ( " 1x^2 " , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Power : : Builder ( Symbol : : Builder ( " x " , 1 ) , Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 2/1x " , Division : : Builder ( Rational : : Builder ( 2 ) , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " 1x/2 " , Division : : Builder ( Multiplication : : Builder ( Rational : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " (1)2 " , Multiplication : : Builder ( Parenthesis : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1(2) " , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Parenthesis : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " sin(1)2 " , Multiplication : : Builder ( Sine : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1cos(2) " , Multiplication : : Builder ( Rational : : Builder ( 1 ) , Cosine : : Builder ( Rational : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!2 " , Multiplication : : Builder ( Factorial : : Builder ( Rational : : Builder ( 1 ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 2ℯ ^(3) " , Multiplication : : Builder ( Rational : : Builder ( 2 ) , Power : : Builder ( Constant : : Builder ( UCodePointScriptSmallE ) , Parenthesis : : Builder ( Rational : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_is ( " \u0012 2^3 \u0013 3 " , Multiplication : : Builder ( Power : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) , Rational : : Builder ( 3 ) ) ) ;
Expression m1 [ ] = { Rational : : Builder ( 1 ) } ; Matrix M1 = BuildMatrix ( 1 , 1 , m1 ) ;
Expression m2 [ ] = { Rational : : Builder ( 2 ) } ; Matrix M2 = BuildMatrix ( 1 , 1 , m2 ) ;
assert_parsed_expression_is ( " 1x+2 " , Addition : : Builder ( Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1π " , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Constant : : Builder ( UCodePointGreekSmallLetterPi ) ) ) ;
assert_parsed_expression_is ( " 1x-2 " , Subtraction : : Builder ( Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " -1x " , Opposite : : Builder ( Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " 2× 1x " , Multiplication : : Builder ( BasedInteger : : Builder ( 2 ) , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " 2^1x " , Multiplication : : Builder ( Power : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 1 ) ) , Symbol : : Builder ( " x " , 1 ) ) ) ;
assert_parsed_expression_is ( " 1x^2 " , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Power : : Builder ( Symbol : : Builder ( " x " , 1 ) , BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 2/1x " , Division : : Builder ( BasedInteger : : Builder ( 2 ) , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) ) ) ;
assert_parsed_expression_is ( " 1x/2 " , Division : : Builder ( Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Symbol : : Builder ( " x " , 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " (1)2 " , Multiplication : : Builder ( Parenthesis : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1(2) " , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Parenthesis : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " sin(1)2 " , Multiplication : : Builder ( Sine : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 1cos(2) " , Multiplication : : Builder ( BasedInteger : : Builder ( 1 ) , Cosine : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ;
assert_parsed_expression_is ( " 1!2 " , Multiplication : : Builder ( Factorial : : Builder ( BasedInteger : : Builder ( 1 ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_is ( " 2ℯ ^(3) " , Multiplication : : Builder ( BasedInteger : : Builder ( 2 ) , Power : : Builder ( Constant : : Builder ( UCodePointScriptSmallE ) , Parenthesis : : Builder ( BasedInteger : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_is ( " \u0012 2^3 \u0013 3 " , Multiplication : : Builder ( Power : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) , BasedInteger : : Builder ( 3 ) ) ) ;
Expression m1 [ ] = { BasedInteger : : Builder ( 1 ) } ; Matrix M1 = BuildMatrix ( 1 , 1 , m1 ) ;
Expression m2 [ ] = { BasedInteger : : Builder ( 2 ) } ; Matrix M2 = BuildMatrix ( 1 , 1 , m2 ) ;
assert_parsed_expression_is ( " [[1]][[2]] " , Multiplication : : Builder ( M1 , M2 ) ) ;
}
QUIZ_CASE ( poincare_parsing_adding_missing_parentheses ) {
assert_parsed_expression_with_user_parentheses_is ( " 1+-2 " , Addition : : Builder ( Rational : : Builder ( 1 ) , Parenthesis : : Builder ( Opposite : : Builder ( Rational : : Builder ( 2 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 1--2 " , Subtraction : : Builder ( Rational : : Builder ( 1 ) , Parenthesis : : Builder ( Opposite : : Builder ( Rational : : Builder ( 2 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 1+conj(-2) " , Addition : : Builder ( Rational : : Builder ( 1 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( Rational : : Builder ( 2 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 1-conj(-2) " , Subtraction : : Builder ( Rational : : Builder ( 1 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( Rational : : Builder ( 2 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 3conj(1+𝐢 ) " , Multiplication : : Builder ( Rational : : Builder ( 3 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Addition : : Builder ( Rational : : Builder ( 1 ) , Constant : : Builder ( UCodePointMathematicalBoldSmallI ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2× -3 " , Multiplication : : Builder ( Rational : : Builder ( 2 ) , Parenthesis : : Builder ( Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2× -3 " , Multiplication : : Builder ( Rational : : Builder ( 2 ) , Parenthesis : : Builder ( Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " --2 " , Opposite : : Builder ( Parenthesis : : Builder ( Opposite : : Builder ( Rational : : Builder ( 2 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " \u0012 2/3 \u0013 ^2 " , Power : : Builder ( Parenthesis : : Builder ( Division : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " log(1+-2) " , CommonLogarithm : : Builder ( Addition : : Builder ( Rational : : Builder ( 1 ) , Parenthesis : : Builder ( Opposite : : Builder ( Rational : : Builder ( 2 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 1+-2 " , Addition : : Builder ( BasedInteger : : Builder ( 1 ) , Parenthesis : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 1--2 " , Subtraction : : Builder ( BasedInteger : : Builder ( 1 ) , Parenthesis : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 1+conj(-2) " , Addition : : Builder ( BasedInteger : : Builder ( 1 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 1-conj(-2) " , Subtraction : : Builder ( BasedInteger : : Builder ( 1 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 3conj(1+𝐢 ) " , Multiplication : : Builder ( BasedInteger : : Builder ( 3 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Addition : : Builder ( BasedInteger : : Builder ( 1 ) , Constant : : Builder ( UCodePointMathematicalBoldSmallI ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2× -3 " , Multiplication : : Builder ( BasedInteger : : Builder ( 2 ) , Parenthesis : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2× -3 " , Multiplication : : Builder ( BasedInteger : : Builder ( 2 ) , Parenthesis : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " --2 " , Opposite : : Builder ( Parenthesis : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " \u0012 2/3 \u0013 ^2 " , Power : : Builder ( Parenthesis : : Builder ( Division : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " log(1+-2) " , CommonLogarithm : : Builder ( Addition : : Builder ( BasedInteger : : Builder ( 1 ) , Parenthesis : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 2 ) ) ) ) ) ) ;
// Conjugate expressions
assert_parsed_expression_with_user_parentheses_is ( " conj(-3)+2 " , Addition : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2+conj(-3) " , Addition : : Builder ( Rational : : Builder ( 2 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " conj(-3)× 2 " , Multiplication : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2× conj(-3) " , Multiplication : : Builder ( Rational : : Builder ( 2 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " conj(-3)-2 " , Subtraction : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2-conj(-3) " , Subtraction : : Builder ( Rational : : Builder ( 2 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( Rational : : Builder ( 3 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " conj(2+3)^2 " , Power : : Builder ( Parenthesis : : Builder ( Conjugate : : Builder ( Addition : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ) , Rational : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " -conj(2+3) " , Opposite : : Builder ( Parenthesis : : Builder ( Conjugate : : Builder ( Addition : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " conj(2+3)! " , Factorial : : Builder ( Parenthesis : : Builder ( Conjugate : : Builder ( Addition : : Builder ( Rational : : Builder ( 2 ) , Rational : : Builder ( 3 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " conj(-3)+2 " , Addition : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2+conj(-3) " , Addition : : Builder ( BasedInteger : : Builder ( 2 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " conj(-3)× 2 " , Multiplication : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2× conj(-3) " , Multiplication : : Builder ( BasedInteger : : Builder ( 2 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " conj(-3)-2 " , Subtraction : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " 2-conj(-3) " , Subtraction : : Builder ( BasedInteger : : Builder ( 2 ) , Parenthesis : : Builder ( Conjugate : : Builder ( Opposite : : Builder ( BasedInteger : : Builder ( 3 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " conj(2+3)^2 " , Power : : Builder ( Parenthesis : : Builder ( Conjugate : : Builder ( Addition : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ) , BasedInteger : : Builder ( 2 ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " -conj(2+3) " , Opposite : : Builder ( Parenthesis : : Builder ( Conjugate : : Builder ( Addition : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ) ) ) ;
assert_parsed_expression_with_user_parentheses_is ( " conj(2+3)! " , Factorial : : Builder ( Parenthesis : : Builder ( Conjugate : : Builder ( Addition : : Builder ( BasedInteger : : Builder ( 2 ) , BasedInteger : : Builder ( 3 ) ) ) ) ) ) ;
}