package org.junit.tests.manipulation;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import java.util.List;
import junit.framework.JUnit4TestAdapter;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;
import org.junit.runner.RunWith;
import org.junit.runner.Runner;
import org.junit.runner.manipulation.Filter;
import org.junit.runner.manipulation.Filterable;
import org.junit.runner.manipulation.NoTestsRemainException;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
public class SingleMethodTest {
public static int count;
static public class OneTimeSetup {
@BeforeClass
public static void once() {
count++;
}
@Test
public void one() {
}
@Test
public void two() {
}
}
@Test
public void oneTimeSetup() throws Exception {
count = 0;
Runner runner = Request.method(OneTimeSetup.class, "one").getRunner();
Result result = new JUnitCore().run(runner);
assertEquals(1, count);
assertEquals(1, result.getRunCount());
}
@RunWith(Parameterized.class)
static public class ParameterizedOneTimeSetup {
@Parameters
public static List<Object[]> params() {
return Arrays.asList(new Object[]{1}, new Object[]{2});
}
public ParameterizedOneTimeSetup(int x) {
}
@Test
public void one() {
}
}
@Test
public void parameterizedFilterToSingleMethod() throws Exception {
count = 0;
Runner runner = Request.method(ParameterizedOneTimeSetup.class,
"one[0]").getRunner();
Result result = new JUnitCore().run(runner);
assertEquals(1, result.getRunCount());
}
@RunWith(Parameterized.class)
static public class ParameterizedOneTimeBeforeClass {
@Parameters
public static List<Object[]> params() {
return Arrays.asList(new Object[]{1}, new Object[]{2});
}
public ParameterizedOneTimeBeforeClass(int x) {
}
@BeforeClass
public static void once() {
count++;
}
@Test
public void one() {
}
}
@Test
public void parameterizedBeforeClass() throws Exception {
count = 0;
JUnitCore.runClasses(ParameterizedOneTimeBeforeClass.class);
assertEquals(1, count);
}
@Test
public void filteringAffectsPlan() throws Exception {
Runner runner = Request.method(OneTimeSetup.class, "one").getRunner();
assertEquals(1, runner.testCount());
}
@Test
public void nonexistentMethodCreatesFailure() throws Exception {
assertEquals(1, new JUnitCore().run(
Request.method(OneTimeSetup.class, "thisMethodDontExist"))
.getFailureCount());
}
@Test(expected = NoTestsRemainException.class)
public void filteringAwayEverythingThrowsException() throws NoTestsRemainException {
Filterable runner = (Filterable) Request.aClass(OneTimeSetup.class).getRunner();
runner.filter(new Filter() {
@Override
public boolean shouldRun(Description description) {
return false;
}
@Override
public String describe() {
return null;
}
});
}
public static class TestOne {
@Test
public void a() {
}
@Test
public void b() {
}
}
public static class TestTwo {
@Test
public void a() {
}
@Test
public void b() {
}
}
@RunWith(Suite.class)
@SuiteClasses({TestOne.class, TestTwo.class})
public static class OneTwoSuite {
}
@Test
public void eliminateUnnecessaryTreeBranches() throws Exception {
Runner runner = Request.aClass(OneTwoSuite.class).filterWith(
Description.createTestDescription(TestOne.class, "a"))
.getRunner();
Description description = runner.getDescription();
assertEquals(1, description.getChildren().size());
}
public static class HasSuiteMethod {
@Test
public void a() {
}
@Test
public void b() {
}
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(HasSuiteMethod.class);
}
}
@Test
public void classesWithSuiteMethodsAreFiltered() {
int testCount = Request.method(HasSuiteMethod.class, "a").getRunner().getDescription().testCount();
assertThat(testCount, is(1));
}
}