Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue 3223/tests filtered #3228

Merged
merged 4 commits into from Oct 9, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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)
}
}
})