Skip to content

Commit

Permalink
Issue 3223/tests filtered (#3228)
Browse files Browse the repository at this point in the history
  • Loading branch information
Kantis committed Oct 9, 2022
1 parent 93f5bed commit c967276
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 34 deletions.
Expand Up @@ -18,7 +18,9 @@ interface TestFilter : Filter {
}

sealed interface TestFilterResult {
object Include : TestFilterResult
object Include : TestFilterResult {
override fun toString() = "TestFilterResult.Include" // Replace me with `data object` when it's available
}
data class Exclude(val reason: String?) : TestFilterResult
}

Expand Down
1 change: 1 addition & 0 deletions kotest-runner/kotest-runner-junit5/build.gradle.kts
Expand Up @@ -33,6 +33,7 @@ kotlin {
val jvmTest by getting {
dependencies {
implementation(projects.kotestRunner.kotestRunnerJunit5)
implementation(projects.kotestFramework.kotestFrameworkDatatest)
implementation(projects.kotestAssertions.kotestAssertionsCore)
implementation(libs.junit.platform.testkit)
implementation(libs.mockk)
Expand Down
Expand Up @@ -22,7 +22,7 @@ class GradleClassMethodRegexTestFilter(private val patterns: List<String>) : Tes
val (prefixWildcard, pck, classname, path) = GradleTestPattern.parse(pattern)
return when (descriptor) {
is Descriptor.TestDescriptor -> when (path) {
null -> false
null -> true
else -> descriptor.path(false).value.startsWith(path)
}

Expand Down Expand Up @@ -55,10 +55,16 @@ data class GradleTestPattern(
require(pattern.isNotBlank())

val prefixWildcard = pattern.startsWith("*")
val pattern2 = pattern.removePrefix("*").removePrefix(".")
val pattern2 = pattern
.removePrefix("*")
.removePrefix(".")
.replace("\\Q", "") // Quote start regex, added by Gradle
.replace("\\E", "") // Quote end regex, added by Gradle

val tokens = pattern2.split('.')
val classIndex = tokens.indexOfFirst { it.first().isUpperCase() }

// Package names shouldn't contain any upper-case letters
val classIndex = tokens.indexOfFirst { token -> token.any { it.isUpperCase() } }

// if class is not specified, then we assume the entire string is a package
if (classIndex == -1) return GradleTestPattern(prefixWildcard, pattern2, null, null)
Expand Down
Expand Up @@ -4,6 +4,7 @@ import io.kotest.core.descriptors.append
import io.kotest.core.descriptors.toDescriptor
import io.kotest.core.filter.TestFilterResult
import io.kotest.core.spec.style.FunSpec
import io.kotest.datatest.withData
import io.kotest.matchers.shouldBe

class GradleClassMethodRegexTestFilterTest : FunSpec({
Expand Down Expand Up @@ -37,12 +38,18 @@ class GradleClassMethodRegexTestFilterTest : FunSpec({
.filter(spec) shouldBe TestFilterResult.Exclude(null)
}

test("include packages") {
context("include packages") {

val spec = GradleClassMethodRegexTestFilterTest::class.toDescriptor()
val container = spec.append("a context")
val test = container.append("nested test")

GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle"))
.filter(spec) shouldBe TestFilterResult.Include
test("Exact match - includes the spec and tests within it") {
val filter = GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle"))

filter.filter(spec) shouldBe TestFilterResult.Include
filter.filter(test) shouldBe TestFilterResult.Include
}

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

test("includes with test paths") {
context("includes with test paths") {

val spec = GradleClassMethodRegexTestFilterTest::class.toDescriptor()
val container = spec.append("a context")
val test = container.append("nested test")

GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.a context"))
.filter(container) shouldBe TestFilterResult.Include

GradleClassMethodRegexTestFilter(listOf("*.gradle.GradleClassMethodRegexTestFilterTest.a context"))
.filter(container) shouldBe TestFilterResult.Include

GradleClassMethodRegexTestFilter(listOf("*adle.GradleClassMethodRegexTestFilterTest.a context"))
.filter(container) shouldBe TestFilterResult.Include

GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.a context2"))
.filter(container) shouldBe TestFilterResult.Exclude(null)

GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.a context -- nested test"))
.filter(test) shouldBe TestFilterResult.Include

GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.nested test"))
.filter(test) shouldBe TestFilterResult.Exclude(null)

GradleClassMethodRegexTestFilter(listOf("io.kotest.runner.junit.platform.gradle.GradleClassMethodRegexTestFilterTest.a context -- nested test2"))
.filter(test) shouldBe TestFilterResult.Exclude(null)

GradleClassMethodRegexTestFilter(listOf("*sMethodRegexTestFilterTest.a context -- nested test2"))
.filter(test) shouldBe TestFilterResult.Exclude(null)
val fqcn = GradleClassMethodRegexTestFilterTest::class.qualifiedName


withData(
nameFn = { "should be INCLUDED when filter is: $it" },
"$fqcn",
"$fqcn.a context",
"*.gradle.GradleClassMethodRegexTestFilterTest.a context",
"*adle.GradleClassMethodRegexTestFilterTest.a context",
"$fqcn.a context -- nested test",
) { filter ->
GradleClassMethodRegexTestFilter(listOf(filter))
.filter(test) shouldBe TestFilterResult.Include
}

withData(
nameFn = { "should be EXCLUDED when filter is: $it" },
"$fqcn.a context2",
"$fqcn.nested test",
"$fqcn.a context -- nested test2",
"*sMethodRegexTestFilterTest.a context -- nested test2",
) { filter ->
GradleClassMethodRegexTestFilter(listOf(filter))
.filter(test) shouldBe TestFilterResult.Exclude(null)
}
}
})
Expand Up @@ -44,9 +44,17 @@ class GradleTestPatternParserTest : FunSpec() {
GradleTestPattern.parse("org.A") shouldBe GradleTestPattern(false, "org", "A", null)
}

test("parse package.Classname.path") {
test("Package name containing caps") {
// This is obviously unwanted, but currently we rely on the capital letters to determine
// the class being tested. Having capital letters in a package name goes against
// Java coding conventions, so for now you're out of luck if you do it.
// https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html

GradleTestPattern.parse("org.myPackage.MyClass.test") shouldBe
GradleTestPattern(false, "org.myPackage", "MyClass", "test")
GradleTestPattern(false, "org", "myPackage", "MyClass.test")
}

test("parse package.Classname.path") {
GradleTestPattern.parse("org.A.test with space") shouldBe GradleTestPattern(
false,
"org",
Expand Down

0 comments on commit c967276

Please sign in to comment.