From c2322880f7c0cbee88fa05070fd3bb84219c03b2 Mon Sep 17 00:00:00 2001 From: Eva Tatarka Date: Tue, 28 Nov 2023 23:04:54 -0800 Subject: [PATCH] Add assume function to abort tests instead of failing them jvm only, uses open4j's TestAbortedException under the hood so works on junit5 or other compatible testing framework (does not work on junit4) Fixes #432 --- assertk/build.gradle.kts | 4 +++ assertk/src/jvmMain/kotlin/assertk/assume.kt | 15 ++++++++++ assertk/src/jvmMain/kotlin/assertk/failure.kt | 25 +++++++++++++++-- .../kotlin/test/assertk/JVMAssertAllTest.kt | 2 +- .../test/assertk/assertions/AssumeTest.kt | 28 +++++++++++++++++++ .../test/assertk/assertions/JVMResultTest.kt | 2 +- .../test/assertk/assertions/OptionalTest.kt | 2 +- .../assertions/support/JavaNumberTest.kt | 2 +- 8 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 assertk/src/jvmMain/kotlin/assertk/assume.kt create mode 100644 assertk/src/jvmTest/kotlin/test/assertk/assertions/AssumeTest.kt diff --git a/assertk/build.gradle.kts b/assertk/build.gradle.kts index c3ae5f6e..ea0eb906 100644 --- a/assertk/build.gradle.kts +++ b/assertk/build.gradle.kts @@ -64,3 +64,7 @@ kotlin { } } } + +tasks.withType().configureEach { + useJUnitPlatform() +} \ No newline at end of file diff --git a/assertk/src/jvmMain/kotlin/assertk/assume.kt b/assertk/src/jvmMain/kotlin/assertk/assume.kt new file mode 100644 index 00000000..6f2ef94b --- /dev/null +++ b/assertk/src/jvmMain/kotlin/assertk/assume.kt @@ -0,0 +1,15 @@ +package assertk + +/** + * Aborts the test instead of failing it, this gives you a way to skip tests based on a dynamic assertion. + * + * ``` + * // only run test on windows + * assume { + * assertThat(System.getProperty("os.name")).startsWith("Windows") + * } + * ``` + */ +fun assume(f: () -> Unit) { + AssumptionFailure.run { f() } +} \ No newline at end of file diff --git a/assertk/src/jvmMain/kotlin/assertk/failure.kt b/assertk/src/jvmMain/kotlin/assertk/failure.kt index 704dcd59..6263c8b1 100644 --- a/assertk/src/jvmMain/kotlin/assertk/failure.kt +++ b/assertk/src/jvmMain/kotlin/assertk/failure.kt @@ -3,10 +3,13 @@ package assertk +import com.willowtreeapps.opentest4k.AssertionFailedError +import com.willowtreeapps.opentest4k.TestAbortedException + internal actual inline fun failWithNotInStacktrace(error: Throwable): Nothing { val filtered = error.stackTrace - .dropWhile { it.className.startsWith("assertk") } - .toTypedArray() + .dropWhile { it.className.startsWith("assertk") } + .toTypedArray() @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UnsafeCast") error.stackTrace = filtered throw error @@ -18,3 +21,21 @@ internal actual inline fun Throwable.addSuppressed(error: Throwable) { } internal actual inline fun Throwable.isOutOfMemory(): Boolean = this is OutOfMemoryError + +internal object AssumptionFailure : Failure { + override fun fail(error: Throwable) { + failWithNotInStacktrace( + TestAbortedException( + buildString { + append("Assumption failed") + error.message?.let { message -> + append(": ") + append(message) + } + }, + // unwrap assertion errors + if (error is AssertionFailedError) error.cause else error + ) + ) + } +} \ No newline at end of file diff --git a/assertk/src/jvmTest/kotlin/test/assertk/JVMAssertAllTest.kt b/assertk/src/jvmTest/kotlin/test/assertk/JVMAssertAllTest.kt index 65633354..d9b3ca34 100644 --- a/assertk/src/jvmTest/kotlin/test/assertk/JVMAssertAllTest.kt +++ b/assertk/src/jvmTest/kotlin/test/assertk/JVMAssertAllTest.kt @@ -4,9 +4,9 @@ import assertk.all import assertk.assertAll import assertk.assertThat import assertk.assertions.* -import org.junit.Test import java.util.concurrent.Executors import java.util.concurrent.TimeUnit +import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith import kotlin.test.assertFalse diff --git a/assertk/src/jvmTest/kotlin/test/assertk/assertions/AssumeTest.kt b/assertk/src/jvmTest/kotlin/test/assertk/assertions/AssumeTest.kt new file mode 100644 index 00000000..4468c5cd --- /dev/null +++ b/assertk/src/jvmTest/kotlin/test/assertk/assertions/AssumeTest.kt @@ -0,0 +1,28 @@ +package test.assertk.assertions + +import assertk.assertThat +import assertk.assertions.isFalse +import assertk.assume +import com.willowtreeapps.opentest4k.TestAbortedException +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith + +class AssumeTest { + @Test + fun assume_throws_TestAbortedException() { + val error = assertFailsWith { + assume { + assertThat(true).isFalse() + } + } + + assertEquals("Assumption failed: expected to be false", error.message) + } + + @Test + fun assume_aborts_instead_of_fails_test() { + // this test should be skipped instead of failing + assume { assertThat(true).isFalse() } + } +} \ No newline at end of file diff --git a/assertk/src/jvmTest/kotlin/test/assertk/assertions/JVMResultTest.kt b/assertk/src/jvmTest/kotlin/test/assertk/assertions/JVMResultTest.kt index 7b5c6cf0..7f502fd4 100644 --- a/assertk/src/jvmTest/kotlin/test/assertk/assertions/JVMResultTest.kt +++ b/assertk/src/jvmTest/kotlin/test/assertk/assertions/JVMResultTest.kt @@ -2,8 +2,8 @@ package test.assertk.assertions import assertk.assertThat import assertk.assertions.isSuccess -import org.junit.Test import test.assertk.exceptionPackageName +import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith import kotlin.test.assertNotNull diff --git a/assertk/src/jvmTest/kotlin/test/assertk/assertions/OptionalTest.kt b/assertk/src/jvmTest/kotlin/test/assertk/assertions/OptionalTest.kt index 0961ba76..6d288404 100644 --- a/assertk/src/jvmTest/kotlin/test/assertk/assertions/OptionalTest.kt +++ b/assertk/src/jvmTest/kotlin/test/assertk/assertions/OptionalTest.kt @@ -4,10 +4,10 @@ import assertk.all import assertk.assertAll import assertk.assertThat import assertk.assertions.* -import org.junit.Test import java.time.LocalDate import java.time.Month import java.util.* +import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith diff --git a/assertk/src/jvmTest/kotlin/test/assertk/assertions/support/JavaNumberTest.kt b/assertk/src/jvmTest/kotlin/test/assertk/assertions/support/JavaNumberTest.kt index 20e95af2..a2d9a9dc 100644 --- a/assertk/src/jvmTest/kotlin/test/assertk/assertions/support/JavaNumberTest.kt +++ b/assertk/src/jvmTest/kotlin/test/assertk/assertions/support/JavaNumberTest.kt @@ -4,9 +4,9 @@ import assertk.assertThat import assertk.assertions.isNegative import assertk.assertions.isPositive import assertk.assertions.isZero -import org.junit.Test import java.math.BigDecimal import java.math.BigInteger +import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith