// $Id: Tester.java,v 1.5 1999/09/11 19:54:01 leavens Exp $

package lib;

public abstract class Tester {

    private static java.io.PrintStream out = System.out;

    private static int numWrong = 0;

    public static int getNumWrong() { return numWrong; }

    /** report on how many errors have occurred so far. */
    public static void testReport() {
	if (numWrong == 0) {
	    out.println("All tests passed!");
	} else {
	    out.println("TOTAL UNEXPECTED RESULTS THIS TEST RUN: " + numWrong);
	}
    }

    private static final String arrowString = "        ==> ";
    private static final String expectedString = "  EXPECTED: ";

    /** print code, an arrow, then compare result to expected using .equals */
    public static void evalsTo(String code, Object result, Object expected) {
	out.println(code);
	out.println(arrowString + result);
	if ((expected != null && !(expected.equals(result)))
	    || (expected == null && result != null)) {
	    numWrong++;
	    out.println(expectedString + expected);
	}
    }

    /** print code, an arrow, then compare result to expected using == */
    public static void evalsTo(String code, long result, long expected) {
	out.println(code);
	out.println(arrowString + result);
	if (result != expected) {
	    numWrong++;
	    out.println(expectedString + expected);
	}
    }

    /** print code, an arrow, then compare result to expected using == */
    public static void evalsTo(String code, int result, int expected) {
	out.println(code);
	out.println(arrowString + result);
	if (result != expected) {
	    numWrong++;
	    out.println(expectedString + expected);
	}
    }

    /** print code, an arrow, then compare result to expected using == */
    public static void evalsTo(String code, short result, short expected) {
	out.println(code);
	out.println(arrowString + result);
	if (result != expected) {
	    numWrong++;
	    out.println(expectedString + expected);
	}
    }

    /** print code, an arrow, then compare result to expected using == */
    public static void evalsTo(String code, byte result, byte expected) {
	out.println(code);
	out.println(arrowString + result);
	if (result != expected) {
	    numWrong++;
	    out.println(expectedString + expected);
	}
    }

    /** print code, an arrow, then compare result to expected using == */
    public static void evalsTo(String code, double result, double expected) {
	out.println(code);
	out.println(arrowString + result);
	if (result != expected) {
	    numWrong++;
	    out.println(expectedString + expected);
	}
    }

    /** print code, an arrow, then compare result to expected using == */
    public static void evalsTo(String code, float result, float expected) {
	out.println(code);
	out.println(arrowString + result);
	if (result != expected) {
	    numWrong++;
	    out.println(expectedString + expected);
	}
    }

    /** print code, an arrow, then compare result to expected using == */
    public static void evalsTo(String code, char result, char expected) {
	out.println(code);
	out.println(arrowString + result);
	if (result != expected) {
	    numWrong++;
	    out.println(expectedString + expected);
	}
    }

    /** print code, an arrow, then compare result to expected using == */
    public static void evalsTo(String code, boolean result, boolean expected) {
	out.println(code);
	out.println(arrowString + result);
	if (result != expected) {
	    numWrong++;
	    out.println(expectedString + expected);
	}
    }

    /** is given approximately equal to expected? */
    public static boolean approxEqual(double given, double expected) {
	return Math.abs(given-expected) < 0.000000001;
    }

}
