package org.cdlib.xtf.util;
/**
* Copyright (c) 2004, Regents of the University of California
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the University of California nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
import java.util.Iterator;
import java.util.LinkedList;
/**
* Handles tedious details of making a little regression test for a given
* class.
*
* @author Martin Haye
*/
public abstract class Tester
{
/**
* List of all tests (or at least, tests for all classes that have been
* loaded.
*/
private static LinkedList allTests = new LinkedList();
/** Name of this test */
private String name;
/** True after test has been tried */
private boolean testedAlready;
/** Add this test to the global list of tests */
public Tester(String name) {
this.name = name;
allTests.add(this);
}
/**
* Run all registered tests. It doesn't matter which runs first, since if
* a test has a dependency it should directly call those tests it depends
* on.
*/
public static final void testAll() {
for (Iterator iter = allTests.iterator(); iter.hasNext();)
((Tester)iter.next()).test();
} // testAll()
/**
* Run this particular test. If it has already been run, the test is
* skipped.
*/
public final void test()
{
// Don't run this test again if it already ran.
if (testedAlready)
return;
testedAlready = true;
// Make sure assertions are turned on.
boolean ok = false;
assert (ok = true) == true;
if (!ok)
throw new AssertionError("Must turn on assertions for test()");
// Run the test
Trace.info("Running test '" + name + "'...");
try {
testImpl();
}
catch (Exception e) {
Trace.error("... Test '" + name + "' failed: " + e);
if (e instanceof RuntimeException)
throw (RuntimeException)e;
else
throw new RuntimeException(e);
}
Trace.info("... Test '" + name + "' passed.");
} // test()
/**
* Derived classes should override this method to perform the actual
* work of the test.
*/
protected abstract void testImpl()
throws Exception;
} // class Tester