package junit.tests.framework;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestFailure;
import junit.framework.TestResult;
import junit.framework.TestSuite;
import junit.tests.WasRun;
/**
* A test case testing the testing framework.
*/
public class TestCaseTest extends TestCase {
static class TornDown extends TestCase {
boolean fTornDown = false;
@Override
protected void tearDown() {
fTornDown = true;
}
@Override
protected void runTest() {
throw new Error("running");
}
}
public void testCaseToString() {
// This test wins the award for twisted snake tail eating while
// writing self tests. And you thought those weird anonymous
// inner classes were bad...
assertEquals("testCaseToString(junit.tests.framework.TestCaseTest)", toString());
}
public void testError() {
TestCase error = new TestCase("error") {
@Override
protected void runTest() {
throw new Error();
}
};
verifyError(error);
}
public void testRunAndTearDownFails() {
TornDown fails = new TornDown() {
@Override
protected void tearDown() {
super.tearDown();
throw new Error();
}
@Override
protected void runTest() {
throw new Error();
}
};
verifyError(fails);
assertTrue(fails.fTornDown);
}
public void testSetupFails() {
TestCase fails = new TestCase("success") {
@Override
protected void setUp() {
throw new Error();
}
@Override
protected void runTest() {
}
};
verifyError(fails);
}
public void testSuccess() {
TestCase success = new TestCase("success") {
@Override
protected void runTest() {
}
};
verifySuccess(success);
}
public void testFailure() {
TestCase failure = new TestCase("failure") {
@Override
protected void runTest() {
fail();
}
};
verifyFailure(failure);
}
public void testTearDownAfterError() {
TornDown fails = new TornDown();
verifyError(fails);
assertTrue(fails.fTornDown);
}
public void testTearDownFails() {
TestCase fails = new TestCase("success") {
@Override
protected void tearDown() {
throw new Error();
}
@Override
protected void runTest() {
}
};
verifyError(fails);
}
public void testTearDownSetupFails() {
TornDown fails = new TornDown() {
@Override
protected void setUp() {
throw new Error();
}
};
verifyError(fails);
assertTrue(!fails.fTornDown);
}
public void testWasRun() {
WasRun test = new WasRun();
test.run();
assertTrue(test.fWasRun);
}
public void testExceptionRunningAndTearDown() {
// With 1.4, we should
// wrap the exception thrown while running with the exception thrown
// while tearing down
Test t = new TornDown() {
@Override
public void tearDown() {
throw new Error("tearingDown");
}
};
TestResult result = new TestResult();
t.run(result);
TestFailure failure = result.errors().nextElement();
assertEquals("running", failure.thrownException().getMessage());
}
public void testErrorTearingDownDoesntMaskErrorRunning() {
final Exception running = new Exception("Running");
TestCase t = new TestCase() {
@Override
protected void runTest() throws Throwable {
throw running;
}
@Override
protected void tearDown() throws Exception {
throw new Error("Tearing down");
}
};
try {
t.runBare();
} catch (Throwable thrown) {
assertSame(running, thrown);
}
}
public void testNoArgTestCasePasses() {
Test t = new TestSuite(NoArgTestCaseTest.class);
TestResult result = new TestResult();
t.run(result);
assertTrue(result.runCount() == 1);
assertTrue(result.failureCount() == 0);
assertTrue(result.errorCount() == 0);
}
public void testNamelessTestCase() {
TestCase t = new TestCase() {
};
TestResult result = t.run();
assertEquals(1, result.failureCount());
}
void verifyError(TestCase test) {
TestResult result = test.run();
assertTrue(result.runCount() == 1);
assertTrue(result.failureCount() == 0);
assertTrue(result.errorCount() == 1);
}
void verifyFailure(TestCase test) {
TestResult result = test.run();
assertTrue(result.runCount() == 1);
assertTrue(result.failureCount() == 1);
assertTrue(result.errorCount() == 0);
}
void verifySuccess(TestCase test) {
TestResult result = test.run();
assertTrue(result.runCount() == 1);
assertTrue(result.failureCount() == 0);
assertTrue(result.errorCount() == 0);
}
}