package org.pitest.junit;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;
import com.example.TheoryTest;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class RunnerSuiteFinderTest {
private RunnerSuiteFinder testee;
@Before
public void setup() {
this.testee = new RunnerSuiteFinder();
}
@Test
public void shouldNotFindClassesInJUnitTheoryTest() {
final Collection<Class<?>> actual = findWithTestee(TheoryTest.class);
assertTrue(actual.isEmpty());
}
public static class CustomSuiteRunner extends Suite {
public CustomSuiteRunner(final Class<?> klass, final RunnerBuilder rb)
throws InitializationError {
super(klass, rb);
}
}
public static class One extends TestCase {
public void testSomething() {
}
}
public static class Two extends One {
}
@RunWith(CustomSuiteRunner.class)
@SuiteClasses({ One.class, Two.class })
static class CustomSuite {
}
@Test
public void shouldFindSuiteClassesInCustomSuite() {
final Collection<Class<?>> actual = findWithTestee(CustomSuite.class);
final Collection<Class<?>> expected = Arrays.<Class<?>> asList(One.class,
Two.class);
assertContains(expected, actual);
}
public static class JUnit3Suite extends TestCase {
public static junit.framework.Test suite() {
final TestSuite suite = new TestSuite();
suite.addTestSuite(One.class);
suite.addTestSuite(Two.class);
return suite;
}
}
@Test
public void shouldFindSuiteClassesInJUnit3Suite() {
final Collection<Class<?>> actual = findWithTestee(JUnit3Suite.class);
final Collection<Class<?>> expected = Arrays.<Class<?>> asList(One.class,
Two.class);
assertContains(expected, actual);
}
public static class JUnit3SuiteMethod extends TestCase {
public JUnit3SuiteMethod(final String testName) {
super(testName);
}
public static junit.framework.Test suite() {
final TestSuite suite = new TestSuite();
suite.addTest(new One());
suite.addTest(new Two());
return suite;
}
}
@Test
public void shouldFindSuiteClassesInJUnit3SuiteMethod() {
final Collection<Class<?>> actual = findWithTestee(JUnit3SuiteMethod.class);
final Collection<Class<?>> expected = Arrays.<Class<?>> asList(One.class,
Two.class);
assertContains(expected, actual);
}
@Test
public void shouldFindSuiteClasseInNestedJUnit3Suite() {
final Collection<Class<?>> actual = findWithTestee(com.example.JUnitThreeSuite.class);
final Collection<Class<?>> expected = Arrays
.<Class<?>> asList(com.example.JUnitThreeTest.class);
assertContains(expected, actual);
}
@Test
public void shouldNotHaltWhenRunnerThrowsRuntimeException() {
try {
findWithTestee(ThrowsOnDiscoverySuite.class);
// pass
} catch(RuntimeException ex) {
fail();
}
}
@RunWith(ThrowsOnDiscoveryRunner.class)
@SuiteClasses({ One.class, Two.class })
static class ThrowsOnDiscoverySuite {
}
public static class ThrowsOnDiscoveryRunner extends Suite {
public ThrowsOnDiscoveryRunner(final Class<?> klass, final RunnerBuilder rb)
throws InitializationError {
super(klass, rb);
}
@Override
public Description getDescription() {
throw new RuntimeException();
}
}
private Collection<Class<?>> findWithTestee(final Class<?> clazz) {
return this.testee.apply(clazz);
}
private void assertContains(final Collection<Class<?>> expected,
final Collection<Class<?>> actual) {
assertThat(actual).containsAll(expected);
}
}