################################################################
# The general testcase syntax is 
#    assertionType  expectedValue   functionUnderTest [args ... ]
#
# where assertionType is either of:
#    Code      to indicate the (bash-style) integer return code
#    String    to indicate the string "printed" as a side effect
#
# and functionUnderTest is the function name
# with the "_shellmath_" prefix removed.
################################################################

################################
# Tests for SUPPORTING FUNCTIONS
################################

# Tests for getReturnCode()
Code 0   getReturnCode SUCCESS
Code 1   getReturnCode FAIL
Code 2   getReturnCode ILLEGAL_NUMBER

## Tests for validateAndParse():
## Validate a number, determine its type and sign, split it into parts

# Detect Invalid input
Code    2      validateAndParse NaN
String    ""   validateAndParse NaN
# Positive integers
String  "4 0 0 0 0"    validateAndParse 4
# Negative integers
String  "9 0 1 0 0"    validateAndParse -9
# Decimals
String  "4 2 0 1 0"  validateAndParse 4.2
# Negative decimals
String "4 2 1 1 0"  validateAndParse -4.2
# Scientific / exponential notation: Check all code branches
String  "340000 0 0 0 1" validateAndParse 3.4e5
String  "344 4 0 1 1"    validateAndParse 3.444e2
String  "34567 0 0 0 1"  validateAndParse 3.4567e4
String  "0 003456 0 1 1" validateAndParse 3.456e-3
String  "34 56 0 1 1"    validateAndParse 345.6e-1
String  "0 23011 0 1 1"  validateAndParse 23.011e-2
String  "23 011 0 1 1"   validateAndParse 23.011e0

####################
# Tests for ADDITION
####################
String 4     add 4
String 9     add 4 5

# Same-length decimal tails with no leading zeros, no carry across decimal point
String 2.214    add 1.105 1.109

# Carry across decimal point
String 3.8    add 1.9 1.9
String -3.8    add -1.9 -1.9

# Different-length decimals, one with leading zero
String 2.195    add 1.105 1.09
String -2.195    add -1.105 -1.09

# Same-length tails having leading zeros
String 2.014    add 1.005 1.009
String -2.014    add -1.005 -1.009
# Different-length tails with and without leading zeros
String 3.31462    add 1.905 1.40962
String 2.01462    add 1.005 1.00962

# Subtraction
String 2.5   subtract 5.2 2.7
String -2.5   subtract 2.7 5.2
String 2.5   add 5.2 -2.7

# Integer part equal to 0
String 1.5  add 0.6 0.9
String 1.5  add .6 .9
String -0.3 add 0.6 -0.9
String -0.3 add .6 -.9

# Recursive/multiple addition
String 12     add 2 4 6
String 6.6    add 1.1 2.2 3.3

##########################
# Tests for MULTIPLICATION
##########################
String 4     multiply 4
String 20     multiply 4 5

String 21.32   multiply 4.1 5.2
String -21.32   multiply -4.1 5.2

# Carry-heavy products
String 98.901  multiply 9.9 9.99

# Leading zeros after decimal point:
# Track place value with zero-padding
String 1.0201  multiply 1.01 1.01
String 0.0001  multiply 0.01 0.01
String 0.0001  add 0 0.0001

# Staggered decimal precisions
String 0.000001 multiply 0.01 0.0001

# Interpret in base 10
String 2.2781  multiply 1.09 2.09

# Recursive multiplication
String 35.1384  multiply 1.1 2.2 3.3 4.4

####################
# Tests for DIVISION
####################
String 4     divide 4
String 4     divide 20 5

String 0.5   divide 1 2
String -0.5   divide -1 2

# Mixed fractions
String 34.54   divide 3454 100

# Non-terminating decimals
String 0.166666666666666667   divide  1 6

# Decimal arguments
String 0.25     divide 0.5 2
String 0.04165  divide 0.1666 4

###########################
# Tests for scientific math
###########################
String 8.8e4      add  1.1e4  7.7e4
String 4.239e1    add  1.224e1 3.015e1
String -6.6e4     add  1.1e4  -7.7e4
String -66000     add  11000  -77000
String 1.23123e2  add 1.23e2 1.23e-1
String 8.1403e7   multiply 2.03e5 4.01e2
String 1.0e-7     multiply 1.0e-3 1.0e-4
String 1.0e-7     multiply 1e-3 1e-4


