Skip to content

Commit 068d27c

Browse files
authored
Merge pull request #1428 from hcoles/feature/parameterized_categories
support categories for junit4 parameterised tests
2 parents dc12678 + 840f559 commit 068d27c

File tree

3 files changed

+118
-4
lines changed

3 files changed

+118
-4
lines changed

pitest/src/main/java/org/pitest/junit/JUnitCompatibleConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public int priority() {
5353
public TestUnitFinder testUnitFinder() {
5454
return new CompoundTestUnitFinder(Arrays.asList(
5555
new JUnitCustomRunnerTestUnitFinder(this.config, this.excludedRunners, this.includedTestMethods),
56-
new ParameterisedJUnitTestFinder()));
56+
new ParameterisedJUnitTestFinder(this.config)));
5757
}
5858

5959
@Override

pitest/src/main/java/org/pitest/junit/ParameterisedJUnitTestFinder.java

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,30 @@
1919
import java.util.List;
2020
import java.util.function.Function;
2121

22+
import org.junit.experimental.categories.Category;
2223
import org.junit.internal.runners.ErrorReportingRunner;
2324
import org.junit.runner.Description;
2425
import org.junit.runner.Runner;
2526
import org.junit.runners.Parameterized;
2627
import org.pitest.functional.FCollection;
2728
import java.util.Optional;
29+
import java.util.stream.Collectors;
30+
import java.util.stream.Stream;
31+
2832
import org.pitest.junit.adapter.AdaptedJUnitTestUnit;
33+
import org.pitest.testapi.TestGroupConfig;
2934
import org.pitest.testapi.TestUnit;
3035
import org.pitest.testapi.TestUnitExecutionListener;
3136
import org.pitest.testapi.TestUnitFinder;
3237

3338
public class ParameterisedJUnitTestFinder implements TestUnitFinder {
34-
@Override
39+
private final TestGroupConfig config;
40+
41+
public ParameterisedJUnitTestFinder(TestGroupConfig config) {
42+
this.config = config;
43+
}
44+
45+
@Override
3546
public List<TestUnit> findTestUnits(final Class<?> clazz, TestUnitExecutionListener unused) {
3647

3748
final Runner runner = AdaptedJUnitTestUnit.createRunner(clazz);
@@ -40,7 +51,7 @@ public List<TestUnit> findTestUnits(final Class<?> clazz, TestUnitExecutionListe
4051
return Collections.emptyList();
4152
}
4253

43-
if (isParameterizedTest(runner)) {
54+
if (isParameterizedTest(runner) && isIncluded(clazz)) {
4455
return handleParameterizedTest(clazz, runner.getDescription());
4556
}
4657

@@ -67,4 +78,36 @@ private boolean isParameterizedTest(final Runner runner) {
6778
return Parameterized.class.isAssignableFrom(runner.getClass());
6879
}
6980

81+
private boolean isIncluded(final Class<?> a) {
82+
return isIncludedCategory(a) && !isExcludedCategory(a);
83+
}
84+
85+
86+
private boolean isIncludedCategory(final Class<?> a) {
87+
final List<String> included = this.config.getIncludedGroups();
88+
return included.isEmpty() || !Collections.disjoint(included, getCategories(a));
89+
}
90+
91+
private boolean isExcludedCategory(final Class<?> a) {
92+
final List<String> excluded = this.config.getExcludedGroups();
93+
return !excluded.isEmpty() && !Collections.disjoint(excluded, getCategories(a));
94+
}
95+
96+
private List<String> getCategories(final Class<?> a) {
97+
final Category c = a.getAnnotation(Category.class);
98+
return Stream.of(c)
99+
.flatMap(toCategoryNames())
100+
.collect(Collectors.toList());
101+
}
102+
103+
private Function<Category, Stream<String>> toCategoryNames() {
104+
return a -> {
105+
if (a == null) {
106+
return Stream.empty();
107+
}
108+
return Stream.of(a.value())
109+
.map(Class::getName);
110+
};
111+
}
112+
70113
}

pitest/src/test/java/org/pitest/junit/ParameterisedJUnitTestFinderTest.java

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,22 @@
1414
*/
1515
package org.pitest.junit;
1616

17+
import static org.assertj.core.api.Assertions.assertThat;
1718
import static org.junit.Assert.assertEquals;
1819
import static org.junit.Assert.assertTrue;
20+
import static org.pitest.testapi.TestGroupConfig.emptyConfig;
1921

2022
import java.util.Arrays;
2123
import java.util.Collection;
2224

2325
import org.junit.Before;
2426
import org.junit.Test;
27+
import org.junit.experimental.categories.Category;
2528
import org.junit.runner.RunWith;
2629
import org.junit.runners.Parameterized;
2730
import org.junit.runners.Parameterized.Parameters;
2831
import org.pitest.testapi.NullExecutionListener;
32+
import org.pitest.testapi.TestGroupConfig;
2933
import org.pitest.testapi.TestUnit;
3034

3135
public class ParameterisedJUnitTestFinderTest {
@@ -34,7 +38,7 @@ public class ParameterisedJUnitTestFinderTest {
3438

3539
@Before
3640
public void setup() {
37-
this.testee = new ParameterisedJUnitTestFinder();
41+
this.testee = new ParameterisedJUnitTestFinder(emptyConfig());
3842
}
3943

4044
@RunWith(Parameterized.class)
@@ -72,8 +76,75 @@ public void shouldReturnNoTestForNonParameterisedTest() {
7276
assertTrue(actual.isEmpty());
7377
}
7478

79+
@Test
80+
public void includesSuppliedCategories() {
81+
setConfig(emptyConfig()
82+
.withIncludedGroups(ACategory.class.getName()));
83+
final Collection<TestUnit> actual = findWithTestee(Tagged.class);
84+
assertThat(actual).hasSize(2);
85+
}
86+
87+
@Test
88+
public void excludesSuppliedCategories() {
89+
setConfig(emptyConfig()
90+
.withIncludedGroups(ACategory.class.getName())
91+
.withExcludedGroups(AnotherCategory.class.getName()));
92+
final Collection<TestUnit> actual = findWithTestee(Tagged.class);
93+
assertThat(actual).isEmpty();
94+
}
95+
96+
@Test
97+
public void excludesInheritedCategories() {
98+
setConfig(emptyConfig()
99+
.withIncludedGroups(ACategory.class.getName())
100+
.withExcludedGroups(AnotherCategory.class.getName()));
101+
final Collection<TestUnit> actual = findWithTestee(IndirectlyTagged.class);
102+
assertThat(actual).isEmpty();
103+
}
104+
105+
private void setConfig(TestGroupConfig config) {
106+
this.testee = new ParameterisedJUnitTestFinder(config);
107+
}
108+
109+
75110
private Collection<TestUnit> findWithTestee(final Class<?> clazz) {
76111
return this.testee.findTestUnits(clazz, new NullExecutionListener());
77112
}
78113

114+
interface ACategory {
115+
116+
}
117+
118+
interface AnotherCategory {
119+
120+
}
121+
122+
@Category({ACategory.class, AnotherCategory.class})
123+
@RunWith(Parameterized.class)
124+
public static class Tagged {
125+
@Parameterized.Parameter
126+
public String vt;
127+
@Parameterized.Parameter(1)
128+
public String vtp;
129+
130+
@Parameterized.Parameters(name = "P {1}")
131+
public static Iterable<Object[]> versions() {
132+
return Arrays.asList(new Object[][] {
133+
{"foo-1.4", "1.4"},
134+
{"foo-2.4", "2.4"}
135+
});
136+
}
137+
138+
@Test
139+
public void aTest() {
140+
}
141+
}
142+
143+
public static class IndirectlyTagged extends Tagged {
144+
@Test
145+
public void anotherTest() {
146+
}
147+
}
148+
149+
79150
}

0 commit comments

Comments
 (0)