Skip to content

Commit 3863bed

Browse files
add support for FreeSpec
1 parent 663d62c commit 3863bed

File tree

3 files changed

+33
-11
lines changed

3 files changed

+33
-11
lines changed

src/main/kotlin/io/kotest/plugin/intellij/styles/FreeSpecStyle.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import io.kotest.plugin.intellij.psi.extractStringLiteralFromLhsOfInfixFunction
1212
import io.kotest.plugin.intellij.psi.ifMinusOperator
1313
import io.kotest.plugin.intellij.psi.ifCallExpressionLhsStringOpenQuote
1414
import io.kotest.plugin.intellij.psi.ifDotExpressionSeparator
15+
import io.kotest.plugin.intellij.psi.isDataTestMethodCall
1516
import org.jetbrains.kotlin.name.FqName
1617
import org.jetbrains.kotlin.psi.KtBinaryExpression
1718
import org.jetbrains.kotlin.psi.KtCallExpression
@@ -28,6 +29,11 @@ object FreeSpecStyle : SpecStyle {
2829
return "\"$name\" { }"
2930
}
3031

32+
override fun getDataTestMethodNames(): Set<String> =
33+
setOf(
34+
"withData"
35+
)
36+
3137
override fun isTestElement(element: PsiElement): Boolean = test(element) != null
3238

3339
private fun locateParent(element: PsiElement): Test? {
@@ -79,7 +85,7 @@ object FreeSpecStyle : SpecStyle {
7985

8086
override fun test(element: PsiElement): Test? {
8187
return when (element) {
82-
is KtCallExpression -> element.tryTest()
88+
is KtCallExpression -> element.tryTest() ?: element.tryDataTest()
8389
is KtDotQualifiedExpression -> element.tryTestWithConfig()
8490
is KtBinaryExpression -> element.tryContainer()
8591
else -> null
@@ -95,6 +101,7 @@ object FreeSpecStyle : SpecStyle {
95101
*
96102
* "test name" {} // a test
97103
* "test name" - {} // a container
104+
* withData(...) { }
98105
*/
99106
override fun test(element: LeafPsiElement): Test? {
100107
val ktcall = element.ifCallExpressionLhsStringOpenQuote()
@@ -106,6 +113,12 @@ object FreeSpecStyle : SpecStyle {
106113
val ktbinary = element.ifMinusOperator()
107114
if (ktbinary != null) return test(ktbinary)
108115

116+
// try to find Data Test Method by finding lambda openings
117+
val dataMethodCall = element.isDataTestMethodCall(getDataTestMethodNames())
118+
if (dataMethodCall != null) {
119+
return test(dataMethodCall)
120+
}
121+
109122
return null
110123
}
111124
}

src/test/kotlin/io/kotest/plugin/intellij/styles/FreeSpecRunMarkerTest.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,39 +24,43 @@ class FreeSpecRunMarkerTest : LightJavaCodeInsightFixtureTestCase() {
2424

2525
val gutters = myFixture.findAllGutters()
2626
println(gutters.map { it.tooltipText }.joinToString("\n"))
27-
gutters.size shouldBe 8
27+
gutters.size shouldBe 9
2828

2929
gutters[0].icon shouldBe AllIcons.RunConfigurations.TestState.Run_run
3030
gutters[0].tooltipText shouldBe "Run FreeSpecExample"
31-
(gutters[0] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 87
31+
(gutters[0] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 122
3232

3333
gutters[1].icon shouldBe AllIcons.RunConfigurations.TestState.Run
3434
gutters[1].tooltipText shouldBe "Run some context"
35-
(gutters[1] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 152
35+
(gutters[1] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 187
3636

3737
gutters[2].icon shouldBe AllIcons.RunConfigurations.TestState.Run
3838
gutters[2].tooltipText shouldBe "Run some context more context"
39-
(gutters[2] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 177
39+
(gutters[2] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 212
4040

4141
gutters[3].icon shouldBe AllIcons.RunConfigurations.TestState.Run
4242
gutters[3].tooltipText shouldBe "Run some context more context as many as you want"
43-
(gutters[3] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 211
43+
(gutters[3] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 246
4444

4545
gutters[4].icon shouldBe AllIcons.RunConfigurations.TestState.Run
4646
gutters[4].tooltipText shouldBe "Run some context more context as many as you want then a test"
47-
(gutters[4] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 225
47+
(gutters[4] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 260
4848

4949
gutters[5].icon shouldBe AllIcons.RunConfigurations.TestState.Run
5050
gutters[5].tooltipText shouldBe "Run another context"
51-
(gutters[5] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 324
51+
(gutters[5] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 359
5252

5353
gutters[6].icon shouldBe AllIcons.RunConfigurations.TestState.Run
5454
gutters[6].tooltipText shouldBe "Run another context a test with config"
55-
(gutters[6] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 354
55+
(gutters[6] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 389
5656

5757
gutters[7].icon shouldBe AllIcons.RunConfigurations.TestState.Run
5858
gutters[7].tooltipText shouldBe "Run a test without a context block"
59-
(gutters[7] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 399
59+
(gutters[7] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 434
60+
61+
gutters[8].icon shouldBe AllIcons.RunConfigurations.TestState.Run
62+
gutters[8].tooltipText shouldBe "Run All Spec Tests, including data tests"
63+
(gutters[8] as LineMarkerInfo.LineMarkerGutterIconRenderer<*>).lineMarkerInfo.startOffset shouldBe 505
6064
}
6165

6266
fun testMethodGeneration() {

src/test/resources/freespec.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.sksamuel.kotest.specs.freespec
22

33
import io.kotest.core.spec.style.FreeSpec
4+
import io.kotest.datatest.withData
45

56
class FreeSpecExample : FreeSpec() {
67
init {
@@ -20,5 +21,9 @@ class FreeSpecExample : FreeSpec() {
2021
}
2122
"a test without a context block" {
2223
}
24+
25+
withData(1, 2, 3, 4, 5) { value ->
26+
// test here
27+
}
2328
}
24-
}
29+
}

0 commit comments

Comments
 (0)