Skip to content

Commit c967276

Browse files
authored
Issue 3223/tests filtered (#3228)
1 parent 93f5bed commit c967276

File tree

5 files changed

+59
-34
lines changed

5 files changed

+59
-34
lines changed

kotest-framework/kotest-framework-api/src/commonMain/kotlin/io/kotest/core/filter/TestFilter.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ interface TestFilter : Filter {
1818
}
1919

2020
sealed interface TestFilterResult {
21-
object Include : TestFilterResult
21+
object Include : TestFilterResult {
22+
override fun toString() = "TestFilterResult.Include" // Replace me with `data object` when it's available
23+
}
2224
data class Exclude(val reason: String?) : TestFilterResult
2325
}
2426

kotest-runner/kotest-runner-junit5/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ kotlin {
3333
val jvmTest by getting {
3434
dependencies {
3535
implementation(projects.kotestRunner.kotestRunnerJunit5)
36+
implementation(projects.kotestFramework.kotestFrameworkDatatest)
3637
implementation(projects.kotestAssertions.kotestAssertionsCore)
3738
implementation(libs.junit.platform.testkit)
3839
implementation(libs.mockk)

kotest-runner/kotest-runner-junit5/src/jvmMain/kotlin/io/kotest/runner/junit/platform/gradle/GradleClassMethodRegexTestFilter.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class GradleClassMethodRegexTestFilter(private val patterns: List<String>) : Tes
2222
val (prefixWildcard, pck, classname, path) = GradleTestPattern.parse(pattern)
2323
return when (descriptor) {
2424
is Descriptor.TestDescriptor -> when (path) {
25-
null -> false
25+
null -> true
2626
else -> descriptor.path(false).value.startsWith(path)
2727
}
2828

@@ -55,10 +55,16 @@ data class GradleTestPattern(
5555
require(pattern.isNotBlank())
5656

5757
val prefixWildcard = pattern.startsWith("*")
58-
val pattern2 = pattern.removePrefix("*").removePrefix(".")
58+
val pattern2 = pattern
59+
.removePrefix("*")
60+
.removePrefix(".")
61+
.replace("\\Q", "") // Quote start regex, added by Gradle
62+
.replace("\\E", "") // Quote end regex, added by Gradle
5963

6064
val tokens = pattern2.split('.')
61-
val classIndex = tokens.indexOfFirst { it.first().isUpperCase() }
65+
66+
// Package names shouldn't contain any upper-case letters
67+
val classIndex = tokens.indexOfFirst { token -> token.any { it.isUpperCase() } }
6268

6369
// if class is not specified, then we assume the entire string is a package
6470
if (classIndex == -1) return GradleTestPattern(prefixWildcard, pattern2, null, null)

kotest-runner/kotest-runner-junit5/src/jvmTest/kotlin/io/kotest/runner/junit/platform/gradle/GradleClassMethodRegexTestFilterTest.kt

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.kotest.core.descriptors.append
44
import io.kotest.core.descriptors.toDescriptor
55
import io.kotest.core.filter.TestFilterResult
66
import io.kotest.core.spec.style.FunSpec
7+
import io.kotest.datatest.withData
78
import io.kotest.matchers.shouldBe
89

910
class GradleClassMethodRegexTestFilterTest : FunSpec({
@@ -37,12 +38,18 @@ class GradleClassMethodRegexTestFilterTest : FunSpec({
3738
.filter(spec) shouldBe TestFilterResult.Exclude(null)
3839
}
3940

40-
test("include packages") {
41+
context("include packages") {
4142

4243
val spec = GradleClassMethodRegexTestFilterTest::class.toDescriptor()
44+
val container = spec.append("a context")
45+
val test = container.append("nested test")
4346

44-
GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle"))
45-
.filter(spec) shouldBe TestFilterResult.Include
47+
test("Exact match - includes the spec and tests within it") {
48+
val filter = GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle"))
49+
50+
filter.filter(spec) shouldBe TestFilterResult.Include
51+
filter.filter(test) shouldBe TestFilterResult.Include
52+
}
4653

4754
GradleClassMethodRegexTestFilter(listOf("*nner.junit.platform.gradle"))
4855
.filter(spec) shouldBe TestFilterResult.Include
@@ -60,34 +67,35 @@ class GradleClassMethodRegexTestFilterTest : FunSpec({
6067
.filter(spec) shouldBe TestFilterResult.Exclude(null)
6168
}
6269

63-
test("includes with test paths") {
70+
context("includes with test paths") {
6471

6572
val spec = GradleClassMethodRegexTestFilterTest::class.toDescriptor()
6673
val container = spec.append("a context")
6774
val test = container.append("nested test")
68-
69-
GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.a context"))
70-
.filter(container) shouldBe TestFilterResult.Include
71-
72-
GradleClassMethodRegexTestFilter(listOf("*.gradle.GradleClassMethodRegexTestFilterTest.a context"))
73-
.filter(container) shouldBe TestFilterResult.Include
74-
75-
GradleClassMethodRegexTestFilter(listOf("*adle.GradleClassMethodRegexTestFilterTest.a context"))
76-
.filter(container) shouldBe TestFilterResult.Include
77-
78-
GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.a context2"))
79-
.filter(container) shouldBe TestFilterResult.Exclude(null)
80-
81-
GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.a context -- nested test"))
82-
.filter(test) shouldBe TestFilterResult.Include
83-
84-
GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.nested test"))
85-
.filter(test) shouldBe TestFilterResult.Exclude(null)
86-
87-
GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.a context -- nested test2"))
88-
.filter(test) shouldBe TestFilterResult.Exclude(null)
89-
90-
GradleClassMethodRegexTestFilter(listOf("*sMethodRegexTestFilterTest.a context -- nested test2"))
91-
.filter(test) shouldBe TestFilterResult.Exclude(null)
75+
val fqcn = GradleClassMethodRegexTestFilterTest::class.qualifiedName
76+
77+
78+
withData(
79+
nameFn = { "should be INCLUDED when filter is: $it" },
80+
"$fqcn",
81+
"$fqcn.a context",
82+
"*.gradle.GradleClassMethodRegexTestFilterTest.a context",
83+
"*adle.GradleClassMethodRegexTestFilterTest.a context",
84+
"$fqcn.a context -- nested test",
85+
) { filter ->
86+
GradleClassMethodRegexTestFilter(listOf(filter))
87+
.filter(test) shouldBe TestFilterResult.Include
88+
}
89+
90+
withData(
91+
nameFn = { "should be EXCLUDED when filter is: $it" },
92+
"$fqcn.a context2",
93+
"$fqcn.nested test",
94+
"$fqcn.a context -- nested test2",
95+
"*sMethodRegexTestFilterTest.a context -- nested test2",
96+
) { filter ->
97+
GradleClassMethodRegexTestFilter(listOf(filter))
98+
.filter(test) shouldBe TestFilterResult.Exclude(null)
99+
}
92100
}
93101
})

kotest-runner/kotest-runner-junit5/src/jvmTest/kotlin/io/kotest/runner/junit/platform/gradle/GradleTestPatternParserTest.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,17 @@ class GradleTestPatternParserTest : FunSpec() {
4444
GradleTestPattern.parse("org.A") shouldBe GradleTestPattern(false, "org", "A", null)
4545
}
4646

47-
test("parse package.Classname.path") {
47+
test("Package name containing caps") {
48+
// This is obviously unwanted, but currently we rely on the capital letters to determine
49+
// the class being tested. Having capital letters in a package name goes against
50+
// Java coding conventions, so for now you're out of luck if you do it.
51+
// https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html
52+
4853
GradleTestPattern.parse("org.myPackage.MyClass.test") shouldBe
49-
GradleTestPattern(false, "org.myPackage", "MyClass", "test")
54+
GradleTestPattern(false, "org", "myPackage", "MyClass.test")
55+
}
56+
57+
test("parse package.Classname.path") {
5058
GradleTestPattern.parse("org.A.test with space") shouldBe GradleTestPattern(
5159
false,
5260
"org",

0 commit comments

Comments
 (0)