Skip to content

Commit

Permalink
Add container level config for should, describe, fun specs #2065 #2155 (
Browse files Browse the repository at this point in the history
#2258)

* Add container level config for should, describe and fun specs #2065 #2155
  • Loading branch information
sksamuel committed May 18, 2021
1 parent 0531385 commit c5833ff
Show file tree
Hide file tree
Showing 19 changed files with 824 additions and 17 deletions.
@@ -0,0 +1,55 @@
package io.kotest.core.spec.style.scopes

import io.kotest.common.ExperimentalKotest
import io.kotest.core.Tag
import io.kotest.core.test.DescriptionName
import io.kotest.core.test.EnabledIf
import io.kotest.core.test.EnabledOrReasonIf
import io.kotest.core.test.TestContext
import io.kotest.core.test.TestType
import io.kotest.core.test.createNestedTest
import io.kotest.core.test.deriveTestContainerConfig
import io.kotest.core.test.toTestCaseConfig
import io.kotest.core.test.toTestContainerConfig
import kotlin.time.Duration

@ExperimentalKotest
class ContainerContextConfigBuilder<T>(
private val name: DescriptionName.TestName,
private val context: TestContext,
private val xdisabled: Boolean,
private val contextFn: (TestContext) -> T
) {

suspend fun config(
enabled: Boolean? = null,
enabledIf: EnabledIf? = null,
enabledOrReasonIf: EnabledOrReasonIf? = null,
tags: Set<Tag>? = null,
timeout: Duration? = null,
test: suspend T.() -> Unit
) {

val derivedConfig = context.testCase.config.toTestContainerConfig().deriveTestContainerConfig(
enabled = enabled,
enabledIf = enabledIf,
enabledOrReasonIf = enabledOrReasonIf,
tags = tags,
timeout = timeout,
)

val activeConfig = if (xdisabled) derivedConfig.copy(enabled = false) else derivedConfig

context.registerTestCase(
createNestedTest(
name = name,
xdisabled = xdisabled,
config = activeConfig.toTestCaseConfig(),
type = TestType.Container,
descriptor = null,
factoryId = context.testCase.factoryId,
test = { contextFn(this).test() }
)
)
}
}
@@ -1,5 +1,6 @@
package io.kotest.core.spec.style.scopes

import io.kotest.common.ExperimentalKotest
import io.kotest.core.spec.KotestDsl
import io.kotest.core.spec.resolvedDefaultConfig
import io.kotest.core.test.DescriptionName
Expand Down Expand Up @@ -51,21 +52,37 @@ class DescribeSpecContainerContext(
containerTest(testName, false, test)
}

suspend fun describe(name: String, test: suspend DescribeSpecContainerContext.() -> Unit) {
val testName = createTestName("Describe: ", name, false)
containerTest(testName, false, test)
}
@ExperimentalKotest
fun context(name: String) =
ContainerContextConfigBuilder(createTestName(name), this, false) { DescribeSpecContainerContext(it) }

suspend fun xcontext(name: String, test: suspend DescribeSpecContainerContext.() -> Unit) {
val testName = createTestName("Context: ", name, false)
containerTest(testName, true, test)
}

@ExperimentalKotest
fun xcontext(name: String) =
ContainerContextConfigBuilder(createTestName("Context: ", name, false), this, true) { DescribeSpecContainerContext(it) }

suspend fun describe(name: String, test: suspend DescribeSpecContainerContext.() -> Unit) {
val testName = createTestName("Describe: ", name, false)
containerTest(testName, false, test)
}

@ExperimentalKotest
fun describe(name: String) =
ContainerContextConfigBuilder(createTestName("Describe: ", name, false), this, false) { DescribeSpecContainerContext(it) }

suspend fun xdescribe(name: String, test: suspend DescribeSpecContainerContext.() -> Unit) {
val testName = createTestName("Describe: ", name, false)
containerTest(testName, true, test)
}

@ExperimentalKotest
fun xdescribe(name: String) =
ContainerContextConfigBuilder(createTestName("Describe: ", name, false), this, true) { DescribeSpecContainerContext(it) }

private suspend fun containerTest(
testName: DescriptionName.TestName,
xdisabled: Boolean,
Expand Down
@@ -1,5 +1,7 @@
package io.kotest.core.spec.style.scopes

import io.kotest.common.ExperimentalKotest
import io.kotest.core.spec.KotestDsl
import io.kotest.core.test.DescriptionName
import io.kotest.core.test.TestContext
import io.kotest.core.test.createTestName
Expand All @@ -17,23 +19,45 @@ typealias DescribeSpecRootScope = DescribeSpecRootContext
*
* xdescribe("some disabled test")
*/
@KotestDsl
interface DescribeSpecRootContext : RootContext {

fun context(name: String, test: suspend DescribeSpecContainerContext.() -> Unit) {
val testName = createTestName("Context: ", name, false)
test(testName, test)
}

@ExperimentalKotest
fun context(name: String) =
RootContextConfigBuilder(createTestName(name), registration(), false) { DescribeSpecContainerContext(it) }

fun xcontext(name: String, test: suspend DescribeSpecContainerContext.() -> Unit) {
val testName = createTestName("Context: ", name, false)
registration().addContainerTest(testName, xdisabled = true) {}
}

@ExperimentalKotest
fun xcontext(name: String) =
RootContextConfigBuilder(createTestName(name), registration(), true) { DescribeSpecContainerContext(it) }

fun describe(name: String, test: suspend DescribeSpecContainerContext.() -> Unit) {
val testName = createTestName("Describe: ", name, false)
test(testName, test)
}

@ExperimentalKotest
fun describe(name: String) =
RootContextConfigBuilder(createTestName("Describe: ", name, false), registration(), false) { DescribeSpecContainerContext(it) }

fun xdescribe(name: String, test: suspend DescribeSpecContainerContext.() -> Unit) {
val testName = createTestName("Describe: ", name, false)
registration().addContainerTest(testName, xdisabled = true) {}
}

@ExperimentalKotest
fun xdescribe(name: String) =
RootContextConfigBuilder(createTestName("Describe: ", name, false), registration(), true) { DescribeSpecContainerContext(it) }

fun it(name: String, test: suspend TestContext.() -> Unit) {
registration().addTest(name = createTestName(name), xdisabled = false, test = test)
}
Expand All @@ -47,9 +71,4 @@ interface DescribeSpecRootContext : RootContext {
DescribeSpecContainerContext(this).test()
}
}

fun xdescribe(name: String, test: suspend DescribeSpecContainerContext.() -> Unit) {
val testName = createTestName("Describe: ", name, false)
registration().addContainerTest(testName, xdisabled = true) {}
}
}
Expand Up @@ -7,7 +7,7 @@ import io.kotest.core.test.EnabledIf
import io.kotest.core.test.TestCaseSeverityLevel
import io.kotest.core.test.TestContext
import io.kotest.core.test.createTestName
import io.kotest.core.test.deriveTestConfig
import io.kotest.core.test.deriveTestCaseConfig
import kotlin.time.Duration

@Deprecated("Renamed to FreeSpecRootContext. This typealias will be removed in 4.8")
Expand Down Expand Up @@ -42,7 +42,7 @@ interface FreeSpecRootContext : RootContext {
severity: TestCaseSeverityLevel? = null,
test: suspend TestContext.() -> Unit
) {
val config = defaultConfig().deriveTestConfig(
val config = defaultConfig().deriveTestCaseConfig(
enabled,
tags,
extensions,
Expand Down
@@ -1,5 +1,7 @@
package io.kotest.core.spec.style.scopes

import io.kotest.common.ExperimentalKotest
import io.kotest.core.spec.KotestDsl
import io.kotest.core.spec.resolvedDefaultConfig
import io.kotest.core.test.NestedTest
import io.kotest.core.test.TestCase
Expand All @@ -20,6 +22,7 @@ typealias FunSpecContextScope = FunSpecContainerContext
* test("some test").config(...)
*
*/
@KotestDsl
class FunSpecContainerContext(
private val testContext: TestContext,
) : ContainerContext {
Expand Down Expand Up @@ -52,6 +55,16 @@ class FunSpecContainerContext(
)
}

/**
* Adds a container test to this context.
*/
@ExperimentalKotest
fun context(name: String) = ContainerContextConfigBuilder(
createTestName(name),
testContext,
false
) { FunSpecContainerContext(this) }

/**
* Adds a disabled container test to this context.
*/
Expand All @@ -69,6 +82,13 @@ class FunSpecContainerContext(
)
}

@ExperimentalKotest
fun xcontext(name: String) = ContainerContextConfigBuilder(
createTestName(name),
testContext,
true
) { FunSpecContainerContext(this) }

/**
* Adds a test case to this context, expecting config.
*/
Expand Down
@@ -1,11 +1,14 @@
package io.kotest.core.spec.style.scopes

import io.kotest.common.ExperimentalKotest
import io.kotest.core.spec.KotestDsl
import io.kotest.core.test.TestContext
import io.kotest.core.test.createTestName

@Deprecated("Renamed to FunSpecRootContext. This typealias will be removed in 4.8")
typealias FunSpecRootScope = FunSpecRootContext

@KotestDsl
interface FunSpecRootContext : RootContext {

/**
Expand All @@ -18,13 +21,21 @@ interface FunSpecRootContext : RootContext {
}
}

@ExperimentalKotest
fun context(name: String) =
RootContextConfigBuilder(createTestName(name), registration(), false) { FunSpecContainerContext(it) }

/**
* Adds a disabled top level [FunSpecContainerContext] this root scope.
*/
fun xcontext(name: String, test: suspend FunSpecContainerContext.() -> Unit) {
registration().addContainerTest(createTestName(name), xdisabled = true) {}
}

@ExperimentalKotest
fun xcontext(name: String) =
RootContextConfigBuilder(createTestName(name), registration(), true) { FunSpecContainerContext(it) }

/**
* Adds a top level test case to this root scope.
*/
Expand Down
@@ -0,0 +1,50 @@
package io.kotest.core.spec.style.scopes

import io.kotest.common.ExperimentalKotest
import io.kotest.core.Tag
import io.kotest.core.test.DescriptionName
import io.kotest.core.test.EnabledIf
import io.kotest.core.test.EnabledOrReasonIf
import io.kotest.core.test.TestContext
import io.kotest.core.test.TestType
import io.kotest.core.test.deriveTestContainerConfig
import io.kotest.core.test.toTestCaseConfig
import io.kotest.core.test.toTestContainerConfig
import kotlin.time.Duration

@ExperimentalKotest
class RootContextConfigBuilder<T>(
private val name: DescriptionName.TestName,
private val registration: RootTestRegistration,
private val xdisabled: Boolean,
val contextFn: (TestContext) -> T
) {

@ExperimentalKotest
fun config(
enabled: Boolean? = null,
enabledIf: EnabledIf? = null,
enabledOrReasonIf: EnabledOrReasonIf? = null,
tags: Set<Tag>? = null,
timeout: Duration? = null,
test: suspend T.() -> Unit
) {

val derivedConfig = registration.defaultConfig
.toTestContainerConfig()
.deriveTestContainerConfig(
enabled = enabled,
enabledIf = enabledIf,
enabledOrReasonIf = enabledOrReasonIf,
tags = tags,
timeout = timeout,
)

registration.addTest(
name,
xdisabled,
derivedConfig.toTestCaseConfig(),
TestType.Container
) { contextFn(this).test() }
}
}
Expand Up @@ -8,7 +8,7 @@ import io.kotest.core.test.EnabledOrReasonIf
import io.kotest.core.test.TestCaseSeverityLevel
import io.kotest.core.test.TestContext
import io.kotest.core.test.TestType
import io.kotest.core.test.deriveTestConfig
import io.kotest.core.test.deriveTestCaseConfig
import kotlin.time.Duration

class RootTestWithConfigBuilder(
Expand All @@ -30,7 +30,7 @@ class RootTestWithConfigBuilder(
enabledOrReasonIf: EnabledOrReasonIf? = null,
test: suspend TestContext.() -> Unit,
) {
val derivedConfig = registration.defaultConfig.deriveTestConfig(
val derivedConfig = registration.defaultConfig.deriveTestCaseConfig(
enabled,
tags,
extensions,
Expand Down
@@ -1,5 +1,6 @@
package io.kotest.core.spec.style.scopes

import io.kotest.common.ExperimentalKotest
import io.kotest.core.spec.KotestDsl
import io.kotest.core.spec.resolvedDefaultConfig
import io.kotest.core.test.NestedTest
Expand Down Expand Up @@ -54,6 +55,13 @@ class ShouldSpecContainerContext(
)
}

@ExperimentalKotest
fun context(name: String) = ContainerContextConfigBuilder(
createTestName(name),
testContext,
false
) { ShouldSpecContainerContext(it) }

/**
* Adds a disabled nested context scope to this scope.
*/
Expand All @@ -71,6 +79,13 @@ class ShouldSpecContainerContext(
)
}

@ExperimentalKotest
fun xcontext(name: String) = ContainerContextConfigBuilder(
createTestName(name),
testContext,
true
) { ShouldSpecContainerContext(it) }

fun should(name: String) =
TestWithConfigBuilder(
createTestName("should ", name, false),
Expand Down

0 comments on commit c5833ff

Please sign in to comment.