! infunit.h - An outline test harness for Inform, based on jUnit.
!   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.
!


System_file;


Message "Adding Inform Unit Test library";

! You must provide your own Main method to execute each of your tests.

Global infunit__errorCount = 0;
Global infunit__testCount = 0;
Global infunit__exception;


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! At the end of the Main, you should call this routine.
[ report
    k; ! locals
    
    print "*************************^
     * infUnit test results:^
     *    number of tests run: ",infunit__testCount,"^
     *    number of successful tests: ",
        (infunit__testCount - infunit__errorCount),"^
     *    number of errors: ",infunit__errorCount,"^
     *************************^";
    print "Press any key to continue.";
    @read_char 1 -> k;
    "";
];


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! At the start of each test method, this should be called.
[ StartTest
    testRoutine;    ! parameter
    ++infunit__testCount;
    @catch -> infunit__exception;
    
    testRoutine();
    
    rfalse;
];


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Ensure that the 1st parameter is true.  If not, report the error with the
! optional text in the second parameter.
!
! Returns true if the assertion failed (indicating the test should exit), or
! false if the assertion is good.
[ assertTrue
    isTrue optErrorText   !  parameters
    doContinue ! optional parameter
    ;

    if (infunit__assertTrue( isTrue, optErrorText, false ))
    {
        infunit__throw( doContinue );
        rtrue;
    }
    ! else
    rfalse;
];


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Asserts that the first two parameters are equal.
[ assertEquals
    first second optErrorText   ! parameters
    doContinue ! optional parameter
    ;
    
!print "[[ first = ",first,", second = ",second,"; first == second = ",(first == second),"]]^";
    if (infunit__assertTrue( first == second, optErrorText, true ))
    {
        print "[ expected ",first,", but found ",second,"]^";
        infunit__throw( doContinue );
        rtrue;
    }
    ! else
    rfalse;
];




!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Asserts that the first parameter is not equal to nothing
[ assertNotNothing
    first optErrorText   ! parameters
    doContinue ! optional parameter
    ;
    
    if (infunit__assertTrue( first ~= nothing, optErrorText, true ))
    {
        print "[value is nothing]^";
        infunit__throw( doContinue );
        rtrue;
    }
    ! else
    rfalse;
];





!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Sends a failure signal.
[ fail
    optErrorText   ! parameters
    doContinue ! optional parameter
    ;
    
    infunit__assertTrue( false, optErrorText, true );
    print "[failure]^";
    infunit__throw( doContinue );
    rtrue;
];




!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Internal method to handle basic assertions.
[ infunit__assertTrue
    isTrue optErrorText   !  parameters
    dontPrintEOL   ! hidden parameter
    ;

    if (isTrue == false)
    {
        ++infunit__errorCount;
        print "** Error: an assertion failed!";
        if (optErrorText ~= nothing)
        {
            print " ",(string)optErrorText;
        }
        if (dontPrintEOL == false)
            print "^";
        else
            print " ";
        rtrue;
    }
    ! else
    rfalse;
];


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Internal method to throw exceptions.
[ infunit__throw
    doContinue; ! parameters
    
    if (doContinue == false)
    {
        @throw "Assert failed" infunit__exception;
    }
];


