! math.inf - test harness for math.h (extended math support for Inform)
! Version 1.0 (19-Sep-2001)
!
! by Matt Albrecht -
[email protected]
!
! (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" );
];