! math.inf - test harness for math.h (extended math support for Inform) ! Version 1.0 (19-Sep-2001) ! ! by Matt Albrecht - groboclown@users.sourceforge.net ! ! (If you need to edit this file, note that indentations are 4 spaces ! and tabs are not used.) ! ! This has been donated to the Public Domain. Use, abuse, and don't blame me. ! Message "Compiling Extended Math unit tests"; Include "infunit"; ! Not optimized version Include "math"; [Main; StartTest( testNitfolBug ); StartTest( testPrint ); StartTest( testUnsignedShift ); StartTest( testUnsignedDiv ); StartTest( testUnsignedMod ); StartTest( testSignedShift ); ! StartTest( testSqureRoot ); report(); ]; [ testNitfolBug x; x = $8000; print "Display value: ",x,"^"; if (x > 0) { fail( "Encountered Nitfol bug: $8000 (-32768) is considered positive.", true ); } assertTrue( (x < 0), "Encountered Nitfol bug: $8000 (-32768) is not negative.", true ); ]; [ testPrint i; i = $ffff; print "$ffff = ", (math_unsigned)i, "^"; i = $fffe; print "$fffe = ", (math_unsigned)i, "^"; i = $0; print "$0000 = ", (math_unsigned)i, "^"; i = $ff00; print "$ff00 = ", (math_unsigned)i, "^"; i = $8000; print "$8000 = ", (math_unsigned)i, "^"; i = $8001; print "$8001 = ", (math_unsigned)i, "^"; i = $7fff; print "$7fff = ", (math_unsigned)i, "^"; i = $0080; print "$0080 = ", (math_unsigned)i, "^"; i = $01ff; print "$01ff = ", (math_unsigned)i, "^"; ]; [ testUnsignedShift ; assertEquals( 2, math_unsigned_shift( 1, 1 ), "1 << 1 not right" ); assertEquals( 4, math_unsigned_shift( 1, 2 ), "1 << 2 not right" ); assertEquals( $8000, math_unsigned_shift( $4000, 1 ), "$4000 << 1 not right" ); assertEquals( 0, math_unsigned_shift( $4000, 2 ), "$4000 << 2 not right" ); assertEquals( 0, math_unsigned_shift( 1, -1 ), "1 >>> 1 not right" ); assertEquals( 0, math_unsigned_shift( 0, -1 ), "0 >>> 1 not right" ); assertEquals( 1, math_unsigned_shift( $100, -8 ), "$100 >>> 8 not right" ); ! stuff that actually matters for unsigned situation assertEquals( $ff, math_unsigned_shift( $ffff, -8 ), "$ffff >>> 8 not right" ); assertEquals( $4000, math_unsigned_shift( $8000, -1 ), "$4000 >>> 1 not right" ); ]; [ testUnsignedDiv ; assertEquals( 0, math_unsigned_div( 0, 1 ), "0 / 1 not right" ); assertEquals( 1, math_unsigned_div( 1, 1 ), "1 / 1 not right" ); assertEquals( 0, math_unsigned_div( 2, 3 ), "2 / 3 not right" ); assertEquals( 1, math_unsigned_div( 3, 2 ), "3 / 2 not right" ); assertEquals( $ffff, math_unsigned_div( $ffff, 1 ), "$ffff / 1 not right" ); assertEquals( 1, math_unsigned_div( $ffff, $ffff ), "$ffff / $ffff not right" ); ! start stuff that actually matters about sign assertEquals( 0, math_unsigned_div( 2, $ffff ), "2 / $ffff not right" ); assertEquals( 1, math_unsigned_div( $ffff, $fffe ), "$ffff / $fffe not right" ); assertEquals( 0, math_unsigned_div( $8000, $8001 ), "$8000 / $8001 not right", true ); assertEquals( 1, math_unsigned_div( $8000, $8000 ), "$8000 / $8000 not right", true ); assertEquals( 1, math_unsigned_div( $8000, $7fff ), "$8000 / $7fff not right", true ); assertEquals( 1, math_unsigned_div( $8000, $7ffe ), "$8000 / $7ffe not right", true ); assertEquals( 2, math_unsigned_div( $8000, $4000 ), "$8000 / $4000 not right", true ); assertEquals( 1, math_unsigned_div( $8001, $7fff ), "$8001 / $7fff not right", true ); assertEquals( 1, math_unsigned_div( $8001, $7ffe ), "$8001 / $7ffe not right", true ); assertEquals( 0, math_unsigned_div( $7fff, $8000 ), "$7fff / $8000 not right", true ); assertEquals( 0, math_unsigned_div( $7ffe, $8000 ), "$7ffe / $8000 not right", true ); assertEquals( 0, math_unsigned_div( $4000, $8000 ), "$4000 / $8000 not right", true ); assertEquals( 0, math_unsigned_div( $7fff, $8001 ), "$7fff / $8001 not right", true ); assertEquals( 0, math_unsigned_div( $7ffe, $8001 ), "$7ffe / $8001 not right", true ); ]; [ testUnsignedMod ; assertEquals( 0, math_unsigned_mod( 0, 1 ), "0 % 1 not right" ); assertEquals( 0, math_unsigned_mod( 1, 1 ), "1 % 1 not right" ); assertEquals( 2, math_unsigned_mod( 2, 3 ), "2 % 3 not right" ); assertEquals( 1, math_unsigned_mod( 3, 2 ), "3 % 2 not right" ); assertEquals( 0, math_unsigned_mod( $ffff, 1 ), "$ffff % 1 not right" ); assertEquals( 0, math_unsigned_mod( $ffff, $ffff ), "$ffff % $ffff not right" ); ! start stuff that actually matters about sign assertEquals( 2, math_unsigned_mod( 2, $ffff ), "2 % $ffff not right" ); assertEquals( $fff0, math_unsigned_mod( $fff0, $ffff ), "$fff0 % $ffff not right" ); assertEquals( $f, math_unsigned_mod( $ffff, $fff0 ), "$ffff % $fff0 not right" ); assertEquals( $8000, math_unsigned_mod( $8000, $8001 ), "$8000 % $8001 not right", true ); assertEquals( 0, math_unsigned_mod( $8000, $8000 ), "$8000 % $8000 not right", true ); assertEquals( 1, math_unsigned_mod( $8000, $7fff ), "$8000 % $7fff not right", true ); assertEquals( 2, math_unsigned_mod( $8000, $7ffe ), "$8000 % $7ffe not right", true ); assertEquals( 0, math_unsigned_mod( $8000, $4000 ), "$8000 % $4000 not right", true ); assertEquals( $3fff, math_unsigned_mod( $8000, $4001 ), "$8000 % $4001 not right", true ); assertEquals( 2, math_unsigned_mod( $8001, $7fff ), "$8001 % $7fff not right" ); assertEquals( 3, math_unsigned_mod( $8001, $7ffe ), "$8001 % $7ffe not right" ); assertEquals( $7fff, math_unsigned_mod( $7fff, $8000 ), "$7fff % $8000 not right", true ); assertEquals( $7ffe, math_unsigned_mod( $7ffe, $8000 ), "$7ffe % $8000 not right", true ); assertEquals( $4000, math_unsigned_mod( $4000, $8000 ), "$4000 % $8000 not right", true ); assertEquals( $7fff, math_unsigned_mod( $7fff, $8001 ), "$7fff % $8001 not right" ); assertEquals( $7ffe, math_unsigned_mod( $7ffe, $8001 ), "$7ffe % $8001 not right" ); ]; [ testSignedShift ; assertEquals( 2, math_signed_shift( 1, 1 ), "1 << 1 not right" ); assertEquals( 4, math_signed_shift( 1, 2 ), "1 << 2 not right" ); assertEquals( $8000, math_signed_shift( $4000, 1 ), "$4000 << 1 not right" ); assertEquals( 0, math_signed_shift( $4000, 2 ), "$4000 << 2 not right" ); assertEquals( 0, math_signed_shift( 1, -1 ), "1 >>> 1 not right" ); assertEquals( 0, math_signed_shift( 0, -1 ), "0 >>> 1 not right" ); assertEquals( 1, math_signed_shift( $100, -8 ), "$100 >>> 8 not right" ); ! stuff that actually matters for signed situation assertEquals( $ffff, math_signed_shift( $ffff, -8 ), "$ffff >>> 8 not right" ); assertEquals( $c000, math_signed_shift( $8000, -1 ), "$4000 >>> 1 not right" ); ];