# 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"