! 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" );
];