# This html document was prepared by gri2html based on the Gri script named
# tst_rpn.gri
# Gri is available for free at http://gri.sourceforge.net
show "doc/tst_suite/tst_rpn.gri     ..." ...

rpnfunction same - abs 1e-5 >		# Are numbers virtually same?

# Simple arithmetic
.a. = 0
assert {rpn .a. !}			  " failed test 1.1"
.a. += 1
assert .a.				  " failed test 1.2"
.a. += 1
assert {rpn .a. 2 same}			  " failed test 1.3"
.a. *= 2
assert {rpn .a. 4 same}			  " failed test 1.4"
.a. /= 4
assert {rpn .a. 1 same}			  " failed test 1.5"
assert {rpn 2 1 - 1 same}                 " failed test 1.6"
assert {rpn 2 1 + 3 same}                 " failed test 1.7"
assert {rpn 3 2 * 6 same}                 " failed test 1.8"
assert {rpn 4 2 / 2 same}                 " failed test 1.9"


# Conversions (lower-case ok on input, but output is upper-case)
assert {rpn "aa" hex2dec  170 ==}         " failed test 2.1"
assert {rpn "AB" hex2dec  171 ==}         " failed test 2.2"
assert {rpn  63  dec2hex "3F" ==}         " failed test 2.3"
assert {rpn 193  dec2hex "C1" ==}         " failed test 2.4"

# Logic
assert {rpn 1 0 or}                       " failed test 3.1"
assert {rpn 0 1 or}                       " failed test 3.2"
assert {rpn 1 0 |}                        " failed test 3.3"
assert {rpn 0 1 |}                        " failed test 3.4"
assert {rpn 1 0 and not}                  " failed test 3.5"
assert {rpn 1 0 & !}                      " failed test 3.6"

# Logs, powers
.a. _= 10
assert {rpn .a. 0 same}			  " failed test 4.1"
.a. = 2
.a. ^= 8
assert {rpn .a. 256 same}		  " failed test 4.2"
assert {rpn -2 4 power 16 ==}             " failed test 4.3"
assert {rpn -2 3 power -8 ==}             " failed test 4.4"
assert {rpn -2 2 power  4 ==}             " failed test 4.5"
assert {rpn  2 3 power  8 ==}             " failed test 4.6"


# String operations
\a = {rpn "file" ".dat" strcat}
assert {rpn "\a" "file.dat" ==}		  " failed test 5.1"
\sentence = "This sentence has five words"
\w1 = word 0 of "\sentence "
assert {rpn "\w1" "This" ==}		  " failed test 5.2"
\w2 = word 1 of "\sentence "
assert {rpn "\w2" "sentence" ==}	  " failed test 5.3"
assert {rpn 0 4 "hello" substr "hell" ==} " failed test 5.4"


# Q: will the below work on all OS?????
# NB. better to switch with something more universal
\six = system "date | wc | awk '{print $2}'"
assert {rpn \six 6 ==}			  " failed test 6.1"

# Statistical operations
read columns x
1 
3
2
9
3

assert {rpn x mean     3.6      same}     " failed test 7.1"
assert {rpn x stddev   3.1305   same}     " failed test 7.2"
assert {rpn x skewness 0.882432 same}     " failed test 7.3"
assert {rpn x kurtosis 1.88008  same}     " failed test 7.4"

# ----------- FILL IN LATER -----------------
# Math functions (e.g. sin, ...)
# Stack operations  push, pop, and exch.
assert {rpn 45 cos 0.7071 same}           " failed test 8.1"
assert {rpn 45 sin 0.7071 same}           " failed test 8.2"
assert {rpn 45 tan 1      same}           " failed test 8.3"

# Missing-values
set missing value -99
read .x. .y.
1 -99
assert {rpn .y. ismissing}                " failed test 9.1"
assert {rpn .y. -99 ==   }                " failed test 9.2"
assert {rpn .y. -99 !=  !}                " failed test 9.3"
assert {rpn .y.   0 !=   }                " failed test 9.4"
# some boolean tests need not check that both values exist
assert {rpn .y.   0  &  !}                " failed test 9.5"
assert {rpn  0   .y. &  !}                " failed test 9.6"
assert {rpn .y.   1  &   }                " failed test 9.7"
assert {rpn .y.   1  |   }                " failed test 9.8"
assert {rpn  1   .y. |   }                " failed test 9.9"
if {rpn .y. -99 !=}
    show                                  " failed test 9.10"
end if
		    
show " passed"