package org.test4j.junit.filter.acceptor;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.test4j.junit.Test4JRunner;
import org.test4j.junit.filter.SuiteType;
import org.test4j.junit.filter.acceptor.TestInClasspathAcceptor;
import org.test4j.junit.filter.finder.FilterCondiction;
import org.test4j.junit.filter.finder.FilterCondictionTest_Suite;
import org.test4j.module.ICore;
@RunWith(Test4JRunner.class)
public class TestInClasspathAcceptorTest implements ICore {
public static class Anything {
}
private TestInClasspathAcceptor tester;
private SuiteType[] suiteTypes;
private Class<?>[] baseTypes;
private Class<?>[] excludedBaseTypes;
@Before
public void initTester() {
suiteTypes = new SuiteType[] { SuiteType.JUNT4_TEST_CLASSES };
baseTypes = new Class<?>[] { Object.class };
excludedBaseTypes = new Class<?>[] {};
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
}
@Test
public void acceptInnerClasses() {
assertTrue(tester.acceptInnerClass());
}
@Test
public void dontAcceptNonTestClass() {
assertFalse(tester.isCorrectTestType(forfilter.tests.p1.P1NoTest.class));
assertFalse(tester.isCorrectTestType(forfilter.suitetest.TestSuite.class));
}
@Test
public void acceptTestClass() {
assertTrue(tester.isCorrectTestType(forfilter.tests.p1.P1Test.class));
}
@Test
public void dontAcceptNonRunWithClassWhenSuiteTypeIsRunWith() {
suiteTypes = new SuiteType[] { SuiteType.SUITE_TEST_CLASSES };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertFalse(tester.isCorrectTestType(forfilter.tests.p1.P1Test.class));
assertFalse(tester.isCorrectTestType(forfilter.tests.p1.P1NoTest.class));
}
@Test
public void acceptRunWithClassesWhenSuiteTypeIsRunWith() {
suiteTypes = new SuiteType[] { SuiteType.SUITE_TEST_CLASSES };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.suitetest.TestSuite.class));
}
/**
* This is now (from JUnit45 on) possible since recursiion in suites will be
* detected
*/
@Test
public void alsoAcceptRunWithClassesThatUseClasspathSuiteThemselves() {
suiteTypes = new SuiteType[] { SuiteType.SUITE_TEST_CLASSES };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.suitetest.ACPTestSuite.class));
}
@Test
public void acceptRunWithAndTestClasses() {
suiteTypes = new SuiteType[] { SuiteType.SUITE_TEST_CLASSES, SuiteType.JUNT4_TEST_CLASSES };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.suitetest.TestSuite.class));
assertTrue(tester.isCorrectTestType(forfilter.tests.p1.P1Test.class));
assertFalse(tester.isCorrectTestType(forfilter.tests.p1.P1NoTest.class));
}
@Test
public void abstractTestClasses() {
assertFalse(tester.isCorrectClazType(forfilter.tests.p2.AbstractP2Test.class));
assertTrue(tester.isCorrectClazType(forfilter.tests.p2.ConcreteP2Test.class));
}
@Test
public void dontAcceptJUnit38TestClassByDefault() {
assertFalse(tester.isCorrectTestType(forfilter.tests.ju38.JU38ConcreteTest.class));
}
@Test
public void acceptJUnit38TestClassIfConfigured() {
suiteTypes = new SuiteType[] { SuiteType.JUNIT38_TEST_CLASSES };
FilterCondiction testFilter = new FilterCondiction(false, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.tests.ju38.JU38ConcreteTest.class));
assertFalse(tester.isCorrectClazType(forfilter.tests.ju38.JU38AbstractTest.class));
}
@Test
public void filterPatternsNull() {
assertTrue(tester.isAcceptedByPatterns("oops.MyClass"));
assertTrue(tester.isAcceptedByPatterns("TopLevel"));
}
@Test
public void oneFilterPattern() {
String[] patterns = new String[] { "oops.*" };
FilterCondiction testFilter = new FilterCondiction(true, patterns, suiteTypes, baseTypes, excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isAcceptedByPatterns("oops.MyClass"));
assertFalse(tester.isAcceptedByPatterns("TopLevel"));
}
@Test
public void twoFilterPatterns() {
FilterCondiction testFilter = new FilterCondiction();
reflector.invoke(testFilter, "setFilterPatterns", new Object[] { new String[] { "oops.*", ".*Test" } });
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isAcceptedByPatterns("oops.MyClass"));
assertFalse(tester.isAcceptedByPatterns("TopLevel"));
want.bool(tester.isAcceptedByPatterns("ppp.MyTest")).is(false);
}
@Test
public void negationFilter() {
// Accept all tests except those matching "oops.*"
String[] patterns = new String[] { "!oops.*" };
FilterCondiction testFilter = new FilterCondiction(true, patterns, suiteTypes, baseTypes, excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isAcceptedByPatterns("TopLevel"));
assertFalse(tester.isAcceptedByPatterns("oops.MyTest"));
}
@Test
public void filtersPlusNegationFilters() {
// Accept all tests that match any positive filter AND do not match any
// negation filter
String[] patterns = new String[] { "oops*", "!*Test", ".allo*", "!h*" };
FilterCondiction testFilter = new FilterCondiction(true, patterns, suiteTypes, baseTypes, excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertFalse(tester.isAcceptedByPatterns("TopLevel"));
assertFalse(tester.isAcceptedByPatterns("oops.MyTest"));
assertTrue(tester.isAcceptedByPatterns("oops.MyOops"));
assertFalse(tester.isAcceptedByPatterns("hallo.AnOops"));
assertTrue(tester.isAcceptedByPatterns(".allo.AnOops"));
}
@Test
public void baseTypeFilterIsAppliedOnTestClasses() {
suiteTypes = new SuiteType[] { SuiteType.JUNT4_TEST_CLASSES };
baseTypes = new Class<?>[] { Anything.class, forfilter.tests.p2.AbstractP2Test.class };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.tests.p2.ConcreteP2Test.class));
assertFalse(tester.isCorrectClazType(forfilter.tests.p1.P1Test.class));
}
@Test
public void baseTypeFilterIsAppliedOnJUnit38TestClasses() {
suiteTypes = new SuiteType[] { SuiteType.JUNIT38_TEST_CLASSES };
baseTypes = new Class<?>[] { Anything.class, forfilter.tests.ju38.JU38AbstractTest.class };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.tests.ju38.JU38ConcreteTest.class));
assertFalse(tester.isCorrectClazType(forfilter.tests.ju38.JU38TestWithoutBase.class));
}
@Test
public void baseTypeFilterIsNotAppliedOnRunWithClasses() {
suiteTypes = new SuiteType[] { SuiteType.SUITE_TEST_CLASSES };
baseTypes = new Class<?>[] { Anything.class };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.suitetest.TestSuite.class));
}
@Test
public void excludedBaseTypeFilterIsAppliedOnTestClasses() {
suiteTypes = new SuiteType[] { SuiteType.JUNT4_TEST_CLASSES };
excludedBaseTypes = new Class<?>[] { Anything.class, forfilter.tests.p2.AbstractP2Test.class };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.tests.p1.P1Test.class));
assertFalse(tester.isCorrectClazType(forfilter.tests.p2.ConcreteP2Test.class));
}
@Test
public void excludedBaseTypeFilterIsAppliedOnJUnit38TestClasses() {
suiteTypes = new SuiteType[] { SuiteType.JUNIT38_TEST_CLASSES };
excludedBaseTypes = new Class<?>[] { Anything.class, forfilter.tests.ju38.JU38AbstractTest.class };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.tests.ju38.JU38TestWithoutBase.class));
assertFalse(tester.isCorrectClazType(forfilter.tests.ju38.JU38ConcreteTest.class));
}
@Test
public void excludedBaseTypeFilterIsNotAppliedOnRunWithClasses() {
suiteTypes = new SuiteType[] { SuiteType.SUITE_TEST_CLASSES };
excludedBaseTypes = new Class<?>[] { Object.class };
FilterCondiction testFilter = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
tester = new TestInClasspathAcceptor(testFilter);
assertTrue(tester.isCorrectTestType(forfilter.suitetest.TestSuite.class));
}
@Test
public void searchInJars() {
FilterCondiction testFilter1 = new FilterCondiction(true, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
assertTrue(new TestInClasspathAcceptor(testFilter1).searchInJars());
FilterCondiction testFilter2 = new FilterCondiction(false, new String[0], suiteTypes, baseTypes,
excludedBaseTypes);
assertFalse(new TestInClasspathAcceptor(testFilter2).searchInJars());
}
@Test
public void testIsJunit4SuiteClaz() throws Exception {
TestInClasspathAcceptor acceptor = reflector.newInstance(TestInClasspathAcceptor.class);
Boolean isSuite = reflector.invoke(acceptor, "isJunit4SuiteClaz",
new Object[] { FilterCondictionTest_Suite.class });
want.bool(isSuite).is(true);
}
@Test
public void testIsJunit4SuiteClaz_RunwithRunner() throws Exception {
TestInClasspathAcceptor acceptor = reflector.newInstance(TestInClasspathAcceptor.class);
Boolean isSuite = reflector.invoke(acceptor, "isJunit4SuiteClaz",
new Object[] { TestInClasspathAcceptorTest.class });
want.bool(isSuite).is(false);
}
}