From 7e0198d620e82afec7e984dc42c1656f62df0103 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Thu, 6 Feb 2025 13:15:17 -0800 Subject: [PATCH 1/8] Selfie JUnit4 compiles. --- jvm/selfie-runner-junit4/README.md | 17 ++++++++++ jvm/selfie-runner-junit4/build.gradle | 33 +++++++++++++++++++ .../selfie/junit4/SelfieTestListener.kt | 31 +++++++++++++++++ .../selfie/junit4/SnapshotFileLayoutJUnit4.kt | 31 +++++++++++++++++ .../selfie/junit4/SnapshotSystemJUnit4.kt | 28 ++++++++++++++++ .../org.junit.runner.notification.RunListener | 1 + jvm/settings.gradle | 1 + 7 files changed, 142 insertions(+) create mode 100644 jvm/selfie-runner-junit4/README.md create mode 100644 jvm/selfie-runner-junit4/build.gradle create mode 100644 jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt create mode 100644 jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt create mode 100644 jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt create mode 100644 jvm/selfie-runner-junit4/src/main/resources/META-INF/services/org.junit.runner.notification.RunListener diff --git a/jvm/selfie-runner-junit4/README.md b/jvm/selfie-runner-junit4/README.md new file mode 100644 index 00000000..56178fcf --- /dev/null +++ b/jvm/selfie-runner-junit4/README.md @@ -0,0 +1,17 @@ +# selfie-runner-junit4 + +JUnit 4 test runner for [Selfie](https://selfie.dev). + +## Status + +This module is currently a placeholder. Coroutine support is not yet implemented for JUnit4. + +## Usage + +Add the dependency: + +```groovy +testImplementation 'com.diffplug.selfie:selfie-runner-junit4:LATEST' +``` + +The runner will automatically detect and run for JUnit4 tests. No additional configuration is needed. diff --git a/jvm/selfie-runner-junit4/build.gradle b/jvm/selfie-runner-junit4/build.gradle new file mode 100644 index 00000000..68b9d9e0 --- /dev/null +++ b/jvm/selfie-runner-junit4/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' +} +repositories { + mavenCentral() +} +ext { + maven_name = 'selfie-runner-junit4' + maven_desc = 'JUnit 4 test runner for Selfie' +} + +apply from: 干.file('base/changelog.gradle') +apply from: rootProject.file('gradle/spotless.gradle') +apply plugin: 'java-library' +dependencies { + api project(':selfie-lib') + implementation 'junit:junit:4.13.2' + compileOnly "io.kotest:kotest-framework-engine:$ver_KOTEST" + + testImplementation "com.squareup.okio:okio:$ver_OKIO" + testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$ver_KOTLIN_TEST" + testImplementation "io.kotest:kotest-assertions-core:$ver_KOTEST" + testImplementation gradleTestKit() +} +test { + useJUnit() + getInputs().dir('../undertest-junit5/src/test') + getInputs().dir('../undertest-junit-vintage/src/test') + getInputs().dir('../undertest-junit5-kotest/src/test') +} +// it all needs to get published and formatted +apply from: 干.file('base/maven.gradle') +apply from: 干.file('base/sonatype.gradle') diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt new file mode 100644 index 00000000..7b237d7e --- /dev/null +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2024-2025 DiffPlug + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.diffplug.selfie.junit4 + +import org.junit.runner.Description +import org.junit.runner.notification.RunListener + +class SelfieTestListener : RunListener() { + override fun testStarted(description: Description) { + TODO("Coroutine support not implemented for JUnit4") + } + override fun testFinished(description: Description) { + TODO("Coroutine support not implemented for JUnit4") + } + override fun testRunFinished(result: org.junit.runner.Result) { + TODO("Coroutine support not implemented for JUnit4") + } +} diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt new file mode 100644 index 00000000..54a44441 --- /dev/null +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2024-2025 DiffPlug + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.diffplug.selfie.junit4 + +class SnapshotFileLayoutJUnit4(className: String) { + fun incrementContainers() { + TODO("Coroutine support not implemented for JUnit4") + } + fun startTest(testName: String, isContainer: Boolean) { + TODO("Coroutine support not implemented for JUnit4") + } + fun finishedTestWithSuccess(testName: String, isContainer: Boolean, wasSuccessful: Boolean) { + TODO("Coroutine support not implemented for JUnit4") + } + fun decrementContainersWithSuccess(wasSuccessful: Boolean) { + TODO("Coroutine support not implemented for JUnit4") + } +} diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt new file mode 100644 index 00000000..ef332ee1 --- /dev/null +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2024-2025 DiffPlug + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.diffplug.selfie.junit4 + +import java.util.concurrent.atomic.AtomicBoolean + +object SnapshotSystemJUnit4 { + val testListenerRunning = AtomicBoolean(false) + fun forClass(className: String): SnapshotFileLayoutJUnit4 { + TODO("Coroutine support not implemented for JUnit4") + } + fun finishedAllTests() { + TODO("Coroutine support not implemented for JUnit4") + } +} diff --git a/jvm/selfie-runner-junit4/src/main/resources/META-INF/services/org.junit.runner.notification.RunListener b/jvm/selfie-runner-junit4/src/main/resources/META-INF/services/org.junit.runner.notification.RunListener new file mode 100644 index 00000000..5a4a229f --- /dev/null +++ b/jvm/selfie-runner-junit4/src/main/resources/META-INF/services/org.junit.runner.notification.RunListener @@ -0,0 +1 @@ +com.diffplug.selfie.junit4.SelfieTestListener diff --git a/jvm/settings.gradle b/jvm/settings.gradle index a258cc99..56f6de32 100644 --- a/jvm/settings.gradle +++ b/jvm/settings.gradle @@ -37,6 +37,7 @@ blowdryerSetup { // Core library include 'selfie-lib' // JUnit 4 & 5 +include 'selfie-runner-junit4' include 'selfie-runner-junit5' include 'undertest-junit5' include 'undertest-junit5-kotest' From bb2230ad2dbb48c9ca779aafe1920bbaf7cef6a1 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Thu, 6 Feb 2025 13:25:26 -0800 Subject: [PATCH 2/8] First pass implementation. --- .../selfie/junit4/SelfieTestListener.kt | 36 ++++++++++++++-- .../selfie/junit4/SnapshotFileLayoutJUnit4.kt | 42 ++++++++++++++++--- .../selfie/junit4/SnapshotSystemJUnit4.kt | 15 ++++++- 3 files changed, 83 insertions(+), 10 deletions(-) diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt index 7b237d7e..11f25763 100644 --- a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt @@ -17,15 +17,45 @@ package com.diffplug.selfie.junit4 import org.junit.runner.Description import org.junit.runner.notification.RunListener +import org.junit.runner.notification.Failure +/** This is automatically registered at runtime thanks to `META-INF/services`. */ class SelfieTestListener : RunListener() { + private val system = SnapshotSystemJUnit4 + private val activeTests = mutableMapOf() + override fun testStarted(description: Description) { - TODO("Coroutine support not implemented for JUnit4") + try { + system.testListenerRunning.set(true) + val className = description.className + val testName = description.methodName + val key = "$className#$testName" + activeTests[key] = true + system.forClass(className).startTest(testName, false) + } catch (e: Throwable) { + system.smuggledError.set(e) + } } + override fun testFinished(description: Description) { - TODO("Coroutine support not implemented for JUnit4") + try { + val className = description.className + val testName = description.methodName + val key = "$className#$testName" + val wasSuccessful = activeTests.remove(key) ?: false + system.forClass(className).finishedTestWithSuccess(testName, false, wasSuccessful) + } catch (e: Throwable) { + system.smuggledError.set(e) + } } + + override fun testFailure(failure: Failure) { + val description = failure.description + val key = "${description.className}#${description.methodName}" + activeTests[key] = false + } + override fun testRunFinished(result: org.junit.runner.Result) { - TODO("Coroutine support not implemented for JUnit4") + system.finishedAllTests() } } diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt index 54a44441..0b2efdce 100644 --- a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt @@ -15,17 +15,49 @@ */ package com.diffplug.selfie.junit4 -class SnapshotFileLayoutJUnit4(className: String) { +import com.diffplug.selfie.guts.FS +import com.diffplug.selfie.guts.TypedPath +import java.util.concurrent.atomic.AtomicReference + +class SnapshotFileLayoutJUnit4(val className: String) { + val smuggledError = AtomicReference() + private val extension: String = ".ss" + + fun snapshotPathForClass(className: String): TypedPath { + val lastDot = className.lastIndexOf('.') + val classFolder: TypedPath + val filename: String + if (lastDot == -1) { + classFolder = rootFolder + filename = className + extension + } else { + classFolder = rootFolder.resolveFolder(className.substring(0, lastDot).replace('.', '/')) + filename = className.substring(lastDot + 1) + extension + } + val parentFolder = snapshotFolderName?.let { classFolder.resolveFolder(it) } ?: classFolder + return parentFolder.resolveFile(filename) + } + fun incrementContainers() { TODO("Coroutine support not implemented for JUnit4") } + fun startTest(testName: String, isContainer: Boolean) { - TODO("Coroutine support not implemented for JUnit4") + checkForSmuggledError() + // Basic test tracking without coroutine support } + fun finishedTestWithSuccess(testName: String, isContainer: Boolean, wasSuccessful: Boolean) { - TODO("Coroutine support not implemented for JUnit4") + checkForSmuggledError() + // Basic test completion tracking without coroutine support } - fun decrementContainersWithSuccess(wasSuccessful: Boolean) { - TODO("Coroutine support not implemented for JUnit4") + + private fun checkForSmuggledError() { + smuggledError.get()?.let { throw it } + } + + companion object { + private val rootFolder = TypedPath.ofFolder(System.getProperty("user.dir")) + private val snapshotFolderName: String? = null } } diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt index ef332ee1..263ca6a2 100644 --- a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt @@ -16,13 +16,24 @@ package com.diffplug.selfie.junit4 import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicReference +import java.util.concurrent.ConcurrentHashMap object SnapshotSystemJUnit4 { val testListenerRunning = AtomicBoolean(false) + val smuggledError = AtomicReference() + private val fileLayouts = ConcurrentHashMap() + fun forClass(className: String): SnapshotFileLayoutJUnit4 { - TODO("Coroutine support not implemented for JUnit4") + return fileLayouts.computeIfAbsent(className) { SnapshotFileLayoutJUnit4(it) } } + fun finishedAllTests() { - TODO("Coroutine support not implemented for JUnit4") + testListenerRunning.set(false) + fileLayouts.clear() + } + + fun checkForSmuggledError() { + smuggledError.get()?.let { throw it } } } From 0dd629aca95568a488c1a779e9a3cb8f224ccd78 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Thu, 6 Feb 2025 13:27:42 -0800 Subject: [PATCH 3/8] Raw copy of undertest-junit5 renamed to junit4 --- jvm/undertest-junit4/build.gradle | 38 ++++++++ .../src/test/java/duplicate_tobefile.data | 1 + .../undertest/junit5/UT_CarriageReturnTest.ss | 7 ++ .../undertest/junit5/UT_DuplicateWriteTest.ss | 3 + .../undertest/junit5/UT_ParameterizedTest.ss | 29 +++++++ .../undertest/junit5/UT_PrefixAndSubGC.ss | 7 ++ .../junit5/UT_StringLiteralsJavaTest.java | 41 +++++++++ .../junit5/UT_TestMethodVisibility.java | 14 +++ .../junit5/UT_TestMethodVisibility.ss | 5 ++ .../UT_TestMethodVisibilityParentClass.java | 23 +++++ .../junit5/UT_WithinMethodGCTest.java | 15 ++++ .../undertest/junit5/UT_WithinMethodGCTest.ss | 5 ++ .../undertest/junit5/SelfieWriteOnce.kt | 7 ++ .../junit5/SimpleTestThatAlwaysPasses.kt | 10 +++ .../kotlin/undertest/junit5/UT_BinaryTest.kt | 22 +++++ .../undertest/junit5/UT_CarriageReturnTest.kt | 10 +++ .../undertest/junit5/UT_DiskBasicTest.kt | 11 +++ .../undertest/junit5/UT_DiskTodoTest.kt | 13 +++ .../undertest/junit5/UT_DuplicateWriteTest.kt | 15 ++++ .../junit5/UT_DuplicateWriteToBeFileTest.kt | 15 ++++ .../undertest/junit5/UT_InlineFacetTest.kt | 86 +++++++++++++++++++ .../undertest/junit5/UT_InlineIntTest.kt | 11 +++ .../undertest/junit5/UT_InlineLongTest.kt | 11 +++ .../undertest/junit5/UT_InteractiveTest.kt | 11 +++ .../undertest/junit5/UT_MethodLevelGCTest.kt | 14 +++ .../undertest/junit5/UT_ParameterizedTest.kt | 18 ++++ .../undertest/junit5/UT_PrefixAndSubGC.kt | 15 ++++ .../undertest/junit5/UT_ReadOnlyTest.kt | 11 +++ .../junit5/UT_StringLiteralsKotlinTest.kt | 33 +++++++ .../junit5/UT_WrongContextInJUnit.kt | 24 ++++++ 30 files changed, 525 insertions(+) create mode 100644 jvm/undertest-junit4/build.gradle create mode 100644 jvm/undertest-junit4/src/test/java/duplicate_tobefile.data create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_CarriageReturnTest.ss create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_DuplicateWriteTest.ss create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_ParameterizedTest.ss create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_PrefixAndSubGC.ss create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_StringLiteralsJavaTest.java create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.java create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.ss create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibilityParentClass.java create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.java create mode 100644 jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.ss create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SelfieWriteOnce.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SimpleTestThatAlwaysPasses.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_BinaryTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_CarriageReturnTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskBasicTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskTodoTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteToBeFileTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineFacetTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineIntTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineLongTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InteractiveTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_MethodLevelGCTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ParameterizedTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_PrefixAndSubGC.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ReadOnlyTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_StringLiteralsKotlinTest.kt create mode 100644 jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_WrongContextInJUnit.kt diff --git a/jvm/undertest-junit4/build.gradle b/jvm/undertest-junit4/build.gradle new file mode 100644 index 00000000..d11541a2 --- /dev/null +++ b/jvm/undertest-junit4/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' + id 'com.diffplug.spotless' +} +repositories { + mavenCentral() +} +spotless { + enforceCheck false + kotlin { + target 'src/**/*.kt' + toggleOffOn() + licenseHeader '' + ktfmt() + replaceRegex("test one-liner", "@Test\n(\\s*)fun ", "@Test fun ") + replaceRegex("test harness comments", "\n(\\s)*//", "\n//") + } +} + +dependencies { + testImplementation project(':selfie-runner-junit5') + testImplementation "org.jetbrains.kotlin:kotlin-test-junit5:$ver_KOTLIN_TEST" + testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1" + testImplementation "org.junit.jupiter:junit-jupiter:$ver_JUNIT_USE" + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} +// this project is just a test environment for a different project +test { + useJUnitPlatform() + enabled = findProperty("underTest") == "true" + + testLogging.showStandardStreams = true + // the snapshots are both output and input, for this harness best if the test just always runs + outputs.upToDateWhen { false } + // defaults to 'write' + systemProperty 'selfie', findProperty('selfie') + systemProperty 'selfie.settings', findProperty('selfie.settings') +} \ No newline at end of file diff --git a/jvm/undertest-junit4/src/test/java/duplicate_tobefile.data b/jvm/undertest-junit4/src/test/java/duplicate_tobefile.data new file mode 100644 index 00000000..54b8e78d --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/duplicate_tobefile.data @@ -0,0 +1 @@ +twins \ No newline at end of file diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_CarriageReturnTest.ss b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_CarriageReturnTest.ss new file mode 100644 index 00000000..490e872b --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_CarriageReturnTest.ss @@ -0,0 +1,7 @@ +╔═ git_makes_carriage_returns_unrepresentable ═╗ +hard +to +preserve +this + +╔═ [end of file] ═╗ diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_DuplicateWriteTest.ss b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_DuplicateWriteTest.ss new file mode 100644 index 00000000..7debc001 --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_DuplicateWriteTest.ss @@ -0,0 +1,3 @@ +╔═ shouldPass ═╗ +twins +╔═ [end of file] ═╗ diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_ParameterizedTest.ss b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_ParameterizedTest.ss new file mode 100644 index 00000000..4cd542a7 --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_ParameterizedTest.ss @@ -0,0 +1,29 @@ +╔═ enumSource/00 ═╗ +NANOS = 0ms +╔═ enumSource/01 ═╗ +MICROS = 0ms +╔═ enumSource/02 ═╗ +MILLIS = 1ms +╔═ enumSource/03 ═╗ +SECONDS = 1000ms +╔═ enumSource/04 ═╗ +MINUTES = 60000ms +╔═ enumSource/05 ═╗ +HOURS = 3600000ms +╔═ enumSource/06 ═╗ +HALF_DAYS = 43200000ms +╔═ enumSource/07 ═╗ +DAYS = 86400000ms +╔═ enumSource/08 ═╗ +WEEKS = 604800000ms +╔═ enumSource/09 ═╗ +MONTHS = 2629746000ms +╔═ enumSource/10 ═╗ +YEARS = 31556952000ms +╔═ enumSource/11 ═╗ +DECADES = 315569520000ms +╔═ enumSource/12 ═╗ +CENTURIES = 3155695200000ms +╔═ enumSource/13 ═╗ +MILLENNIA = 31556952000000ms +╔═ [end of file] ═╗ diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_PrefixAndSubGC.ss b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_PrefixAndSubGC.ss new file mode 100644 index 00000000..55a85bdd --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_PrefixAndSubGC.ss @@ -0,0 +1,7 @@ +╔═ commonPrefix/adjective ═╗ +cise +╔═ commonPrefix/noun ═╗ +cision +╔═ commonPrefixThenMore ═╗ +pre +╔═ [end of file] ═╗ diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_StringLiteralsJavaTest.java b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_StringLiteralsJavaTest.java new file mode 100644 index 00000000..e01eb708 --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_StringLiteralsJavaTest.java @@ -0,0 +1,41 @@ +package undertest.junit5; + +import org.junit.jupiter.api.Test; +import static com.diffplug.selfie.Selfie.expectSelfie; + +public class UT_StringLiteralsJavaTest { + @Test + public void empty() { + expectSelfie("").toBe_TODO(); + } + + @Test + public void tabs() { + expectSelfie("\t\t\t").toBe_TODO(); + } + + @Test + public void spaces() { + expectSelfie(" ").toBe_TODO(); + } + + @Test + public void newlines() { + expectSelfie("\n").toBe_TODO(); + expectSelfie("\n\n").toBe_TODO(); + expectSelfie("\n\n\n").toBe_TODO(); + } + + @Test + public void escapableCharacters() { + expectSelfie(" ' \" $ ").toBe_TODO(); + expectSelfie(" ' \" $ \n \"\"\"\"\"\"\"\"\"\t").toBe_TODO(); + } + + @Test + public void allOfIt() { + expectSelfie(" a\n" + + "a \n" + + "\t a \t\n").toBe_TODO(); + } +} diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.java b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.java new file mode 100644 index 00000000..3e4b2432 --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.java @@ -0,0 +1,14 @@ +package undertest.junit5; + +import static com.diffplug.selfie.Selfie.expectSelfie; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class UT_TestMethodVisibility extends UT_TestMethodVisibilityParentClass { + // get test methods from parent class + @Test + private void isPrivate() { + Assertions.fail("Test methods can't be private"); + } +} diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.ss b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.ss new file mode 100644 index 00000000..0f6d1bc6 --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.ss @@ -0,0 +1,5 @@ +╔═ isPackage ═╗ +package +╔═ isProtected ═╗ +protected +╔═ [end of file] ═╗ diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibilityParentClass.java b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibilityParentClass.java new file mode 100644 index 00000000..a799467c --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibilityParentClass.java @@ -0,0 +1,23 @@ +package undertest.junit5; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static com.diffplug.selfie.Selfie.expectSelfie; + +class UT_TestMethodVisibilityParentClass { + @Test + void isPackage() { + expectSelfie("package").toMatchDisk(); + } + + @Test + protected void isProtected() { + expectSelfie("protected").toMatchDisk(); + } + + @Test + private void isPrivate() { + Assertions.fail("Test methods can't be private"); + } +} diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.java b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.java new file mode 100644 index 00000000..f2c206d9 --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.java @@ -0,0 +1,15 @@ +package undertest.junit5; + +import org.junit.jupiter.api.Test; +import static com.diffplug.selfie.Selfie.expectSelfie; + +public class UT_WithinMethodGCTest { + @Test void selfie2() { +// @Test protected void selfie() { +// expectSelfie("root").toMatchDisk(); + expectSelfie("oak").toMatchDisk("leaf"); + } + @Test void secondMethod() { + expectSelfie("abc123").toMatchDisk(); + } +} diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.ss b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.ss new file mode 100644 index 00000000..f4ad965d --- /dev/null +++ b/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.ss @@ -0,0 +1,5 @@ +╔═ secondMethod ═╗ +abc123 +╔═ selfie2/leaf ═╗ +oak +╔═ [end of file] ═╗ diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SelfieWriteOnce.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SelfieWriteOnce.kt new file mode 100644 index 00000000..39389b2f --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SelfieWriteOnce.kt @@ -0,0 +1,7 @@ +package undertest.junit5 + +import com.diffplug.selfie.junit5.SelfieSettingsAPI + +class SelfieWriteOnce : SelfieSettingsAPI() { + override val allowMultipleEquivalentWritesToOneLocation = false +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SimpleTestThatAlwaysPasses.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SimpleTestThatAlwaysPasses.kt new file mode 100644 index 00000000..30446901 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SimpleTestThatAlwaysPasses.kt @@ -0,0 +1,10 @@ +package undertest.junit5 + +import kotlin.test.Test + +class SimpleTestThatAlwaysPasses { + @Test fun makesSureTheresAlwaysAtLeastOneTestRunning() { +// otherwise there might be no tests running at all, which is a +// corner case we don't particularly need to spend time on + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_BinaryTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_BinaryTest.kt new file mode 100644 index 00000000..e02e1dd9 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_BinaryTest.kt @@ -0,0 +1,22 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import kotlin.test.Test + +class UT_BinaryTest { + @Test fun emptyOnDisk() { + expectSelfie(byteArrayOf()).toMatchDisk_TODO() + } + + @Test fun emptyInline() { + expectSelfie(byteArrayOf()).toBeBase64_TODO() + } + + @Test fun bigishOnDisk() { + expectSelfie(ByteArray(256) { it.toByte() }).toMatchDisk_TODO() + } + + @Test fun bigishInline() { + expectSelfie(ByteArray(256) { it.toByte() }).toBeBase64_TODO() + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_CarriageReturnTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_CarriageReturnTest.kt new file mode 100644 index 00000000..c6490392 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_CarriageReturnTest.kt @@ -0,0 +1,10 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import kotlin.test.Test + +class UT_CarriageReturnTest { + @Test fun git_makes_carriage_returns_unrepresentable() { + expectSelfie("hard\r\nto\npreserve\r\nthis\r\n").toMatchDisk() + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskBasicTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskBasicTest.kt new file mode 100644 index 00000000..331a3202 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskBasicTest.kt @@ -0,0 +1,11 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import kotlin.test.Test + +class UT_DiskBasicTest { + @Test fun selfie() { +// expectSelfie("apple").toMatchDisk() + expectSelfie("orange").toMatchDisk() + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskTodoTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskTodoTest.kt new file mode 100644 index 00000000..dd15a489 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskTodoTest.kt @@ -0,0 +1,13 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import kotlin.test.Test + +class UT_DiskTodoTest { + @Test fun selfie() { + expectSelfie("noArg").toMatchDisk_TODO() + expectSelfie("constantArg").toMatchDisk_TODO("constantArg") + val theArg = "variable" + " " + "arg" + expectSelfie("variableArg").toMatchDisk_TODO(theArg) + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteTest.kt new file mode 100644 index 00000000..8738700e --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteTest.kt @@ -0,0 +1,15 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import org.junit.jupiter.api.Test + +class UT_DuplicateWriteTest { +// @Test fun shouldFail() { +// expectSelfie("apples").toMatchDisk() +// expectSelfie("oranges").toMatchDisk() +// } + @Test fun shouldPass() { + expectSelfie("twins").toMatchDisk() + expectSelfie("twins").toMatchDisk() + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteToBeFileTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteToBeFileTest.kt new file mode 100644 index 00000000..a5602670 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteToBeFileTest.kt @@ -0,0 +1,15 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import org.junit.jupiter.api.Test + +class UT_DuplicateWriteToBeFileTest { +// @Test fun shouldFail() { +// expectSelfie("apples".toByteArray()).toBeFile("duplicate_tobefile.data") +// expectSelfie("oranges".toByteArray()).toBeFile("duplicate_tobefile.data") +// } + @Test fun shouldPass() { + expectSelfie("twins".toByteArray()).toBeFile("duplicate_tobefile.data") + expectSelfie("twins".toByteArray()).toBeFile("duplicate_tobefile.data") + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineFacetTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineFacetTest.kt new file mode 100644 index 00000000..996d77d9 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineFacetTest.kt @@ -0,0 +1,86 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import com.diffplug.selfie.Snapshot +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + +class UT_InlineFacetTest { + @Test fun singleFacet() { + val zero = Snapshot.of("no facets") + expectSelfie(zero).toBe("no facets") + expectSelfie(zero).facet("").toBe("no facets") + expectSelfie(zero).facets("").toBe("no facets") + assertThrows { expectSelfie(zero).toBe("WRONG") } + assertThrows { expectSelfie(zero).facet("").toBe("WRONG") } + assertThrows { expectSelfie(zero).facets("").toBe("WRONG") } + + val one = Snapshot.of("subject").plusFacet("facet", "facetValue") + expectSelfie(one).facet("").toBe("subject") + expectSelfie(one).facets("").toBe("subject") + expectSelfie(one).facet("facet").toBe("facetValue") + expectSelfie(one).facets("facet").toBe("facetValue") + + assertThrows { expectSelfie(one).facet("").toBe("WRONG") } + assertThrows { expectSelfie(one).facets("").toBe("WRONG") } + assertThrows { expectSelfie(one).facet("facet").toBe("WRONG") } + assertThrows { expectSelfie(one).facets("facet").toBe("WRONG") } + } + + @Test fun multipleFacets() { + val multiple = + Snapshot.of("subject") + .plusFacet("facet1", "facetValue1") + .plusFacet("facet2", "facetValue2") + .plusFacet("facet3", "facetValue3") + expectSelfie(multiple) + .toBe( + """ + subject + ╔═ [facet1] ═╗ + facetValue1 + ╔═ [facet2] ═╗ + facetValue2 + ╔═ [facet3] ═╗ + facetValue3 + """ + .trimIndent()) + assertThrows { expectSelfie(multiple).toBe("WRONG") } + expectSelfie(multiple) + .facets("", "facet1") + .toBe( + """ + subject + ╔═ [facet1] ═╗ + facetValue1 + """ + .trimIndent()) + assertThrows { expectSelfie(multiple).facets("", "facet1").toBe("WRONG") } + expectSelfie(multiple) + .facets("facet3", "facet2") + .toBe( + """ + ╔═ [facet3] ═╗ + facetValue3 + ╔═ [facet2] ═╗ + facetValue2 + """ + .trimIndent()) + assertThrows { expectSelfie(multiple).facets("facet3", "facet2").toBe("WRONG") } + expectSelfie( + assertThrows { + expectSelfie(multiple) + .facets("facet1", "") + .toBe( + """ + subject + ╔═ [facet1] ═╗ + facetValue1 + """ + .trimIndent()) + } + .message!!) + .toBe( + "If you're going to specify the subject facet (\"\"), you have to list it first, this was [facet1, ]") + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineIntTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineIntTest.kt new file mode 100644 index 00000000..b8f81bfc --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineIntTest.kt @@ -0,0 +1,11 @@ +package undertest.junit5 +// spotless:off +import com.diffplug.selfie.Selfie.expectSelfie +import kotlin.test.Test +// spotless:on + +class UT_InlineIntTest { + @Test fun singleInt() { + expectSelfie(7777).toBe(7_777) + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineLongTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineLongTest.kt new file mode 100644 index 00000000..3b3f1024 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineLongTest.kt @@ -0,0 +1,11 @@ +package undertest.junit5 +// spotless:off +import com.diffplug.selfie.Selfie.expectSelfie +import kotlin.test.Test +// spotless:on + +class UT_InlineLongTest { + @Test fun singleInt() { + expectSelfie(9999999999L).toBe(9_999_999_999L) + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InteractiveTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InteractiveTest.kt new file mode 100644 index 00000000..5a6bf862 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InteractiveTest.kt @@ -0,0 +1,11 @@ +package undertest.junit5 +// spotless:off +import com.diffplug.selfie.Selfie.expectSelfie +import kotlin.test.Test +// spotless:on + +class UT_InteractiveTest { + @Test fun example() { + expectSelfie(10).toBe(10) + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_MethodLevelGCTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_MethodLevelGCTest.kt new file mode 100644 index 00000000..dbf08566 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_MethodLevelGCTest.kt @@ -0,0 +1,14 @@ +package undertest.junit5 +// spotless:off +import com.diffplug.selfie.Selfie.expectSelfie +import kotlin.test.Test +// spotless:on + +class UT_MethodLevelGCTest { +// @Test fun one() { +// expectSelfie("1").toMatchDisk() +// } +// @Test fun two() { +// expectSelfie("2").toMatchDisk() +// } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ParameterizedTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ParameterizedTest.kt new file mode 100644 index 00000000..f525df9f --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ParameterizedTest.kt @@ -0,0 +1,18 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import java.time.temporal.ChronoUnit +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.EnumSource + +class UT_ParameterizedTest { + @ParameterizedTest + @EnumSource + fun enumSource(unit: ChronoUnit) { + if (unit == ChronoUnit.ERAS || unit == ChronoUnit.FOREVER) { + return + } + expectSelfie("${unit.name} = ${unit.duration.toMillis()}ms") + .toMatchDisk(String.format("%02d", unit.ordinal)) + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_PrefixAndSubGC.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_PrefixAndSubGC.kt new file mode 100644 index 00000000..e355d937 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_PrefixAndSubGC.kt @@ -0,0 +1,15 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import org.junit.jupiter.api.Test + +class UT_PrefixAndSubGC { + @Test fun commonPrefix() { + expectSelfie("cision").toMatchDisk("noun") + expectSelfie("cise").toMatchDisk("adjective") + } + + @Test fun commonPrefixThenMore() { + expectSelfie("pre").toMatchDisk() + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ReadOnlyTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ReadOnlyTest.kt new file mode 100644 index 00000000..c1c41389 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ReadOnlyTest.kt @@ -0,0 +1,11 @@ +package undertest.junit5 +// spotless:off +import com.diffplug.selfie.Selfie.expectSelfie +import kotlin.test.Test +// spotless:on + +class UT_ReadOnlyTest { + @Test fun example() { + expectSelfie(5).toBe(5) // selfieonce + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_StringLiteralsKotlinTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_StringLiteralsKotlinTest.kt new file mode 100644 index 00000000..0e98b0a1 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_StringLiteralsKotlinTest.kt @@ -0,0 +1,33 @@ +package undertest.junit5 + +import com.diffplug.selfie.Selfie.expectSelfie +import org.junit.jupiter.api.Test + +class UT_StringLiteralsKotlinTest { + @Test fun empty() { + expectSelfie("").toBe_TODO() + } + + @Test fun tabs() { + expectSelfie("\t\t\t").toBe_TODO() + } + + @Test fun spaces() { + expectSelfie(" ").toBe_TODO() + } + + @Test fun newlines() { + expectSelfie("\n").toBe_TODO() + expectSelfie("\n\n").toBe_TODO() + expectSelfie("\n\n\n").toBe_TODO() + } + + @Test fun escapableCharacters() { + expectSelfie(" ' \" $ ").toBe_TODO() + expectSelfie(" ' \" $ \n \"\"\"\"\"\"\"\"\"\t").toBe_TODO() + } + + @Test fun allOfIt() { + expectSelfie(" a\n" + "a \n" + "\t a \t\n").toBe_TODO() + } +} diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_WrongContextInJUnit.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_WrongContextInJUnit.kt new file mode 100644 index 00000000..8a155436 --- /dev/null +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_WrongContextInJUnit.kt @@ -0,0 +1,24 @@ +package undertest.junit5 + +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.Test + +class UT_WrongContextInJUnit { + @Test fun wrongContext() { + try { + runBlocking { com.diffplug.selfie.coroutines.expectSelfie("something").toMatchDisk() } + } catch (e: Throwable) { + com.diffplug.selfie.Selfie.expectSelfie(e.message!!) + .toBe( + """No Kotest test is in progress on this coroutine. +If this is a Kotest test, make sure you added `SelfieExtension` to your `AbstractProjectConfig`: +${' '} +class MyProjectConfig : AbstractProjectConfig() { +${' '} + override fun extensions() = listOf(SelfieExtension(this)) +${' '} +} +If this is a JUnit test, make the following change: +${' '} -import com.diffplug.selfie.coroutines.expectSelfie +${' '} +import com.diffplug.selfie.Selfie.expectSelfie +For more info https://selfie.dev/jvm/kotest#selfie-and-coroutines""") + } + } +} From 7efa50c9aa9171e59fa24c392414d147ed97b55f Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Thu, 6 Feb 2025 13:31:04 -0800 Subject: [PATCH 4/8] Setup the undertest-junit4 project files. --- jvm/selfie-runner-junit4/build.gradle | 4 +--- jvm/settings.gradle | 1 + jvm/undertest-junit4/build.gradle | 11 +++++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/jvm/selfie-runner-junit4/build.gradle b/jvm/selfie-runner-junit4/build.gradle index 68b9d9e0..a4e7e630 100644 --- a/jvm/selfie-runner-junit4/build.gradle +++ b/jvm/selfie-runner-junit4/build.gradle @@ -24,9 +24,7 @@ dependencies { } test { useJUnit() - getInputs().dir('../undertest-junit5/src/test') - getInputs().dir('../undertest-junit-vintage/src/test') - getInputs().dir('../undertest-junit5-kotest/src/test') + getInputs().dir('../undertest-junit4/src/test') } // it all needs to get published and formatted apply from: 干.file('base/maven.gradle') diff --git a/jvm/settings.gradle b/jvm/settings.gradle index 56f6de32..89b9e209 100644 --- a/jvm/settings.gradle +++ b/jvm/settings.gradle @@ -39,6 +39,7 @@ include 'selfie-lib' // JUnit 4 & 5 include 'selfie-runner-junit4' include 'selfie-runner-junit5' +include 'undertest-junit4' include 'undertest-junit5' include 'undertest-junit5-kotest' include 'undertest-junit-vintage' diff --git a/jvm/undertest-junit4/build.gradle b/jvm/undertest-junit4/build.gradle index d11541a2..a041e1f4 100644 --- a/jvm/undertest-junit4/build.gradle +++ b/jvm/undertest-junit4/build.gradle @@ -18,15 +18,14 @@ spotless { } dependencies { - testImplementation project(':selfie-runner-junit5') - testImplementation "org.jetbrains.kotlin:kotlin-test-junit5:$ver_KOTLIN_TEST" + testImplementation project(':selfie-runner-junit4') + testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$ver_KOTLIN_TEST" testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1" - testImplementation "org.junit.jupiter:junit-jupiter:$ver_JUNIT_USE" - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + testImplementation "junit:junit:4.13.2" } // this project is just a test environment for a different project test { - useJUnitPlatform() + useJUnit() enabled = findProperty("underTest") == "true" testLogging.showStandardStreams = true @@ -35,4 +34,4 @@ test { // defaults to 'write' systemProperty 'selfie', findProperty('selfie') systemProperty 'selfie.settings', findProperty('selfie.settings') -} \ No newline at end of file +} From 1bf6c3bb0ab1016fa6b755a7122d5ba9a616271a Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Thu, 6 Feb 2025 13:33:10 -0800 Subject: [PATCH 5/8] Rename the junit5 folder to junit4 and adjust package declarations. --- .../java/undertest/{junit5 => junit4}/UT_CarriageReturnTest.ss | 0 .../java/undertest/{junit5 => junit4}/UT_DuplicateWriteTest.ss | 0 .../java/undertest/{junit5 => junit4}/UT_ParameterizedTest.ss | 0 .../test/java/undertest/{junit5 => junit4}/UT_PrefixAndSubGC.ss | 0 .../undertest/{junit5 => junit4}/UT_StringLiteralsJavaTest.java | 2 +- .../undertest/{junit5 => junit4}/UT_TestMethodVisibility.java | 2 +- .../undertest/{junit5 => junit4}/UT_TestMethodVisibility.ss | 0 .../{junit5 => junit4}/UT_TestMethodVisibilityParentClass.java | 2 +- .../undertest/{junit5 => junit4}/UT_WithinMethodGCTest.java | 2 +- .../java/undertest/{junit5 => junit4}/UT_WithinMethodGCTest.ss | 0 .../test/kotlin/undertest/{junit5 => junit4}/SelfieWriteOnce.kt | 2 +- .../undertest/{junit5 => junit4}/SimpleTestThatAlwaysPasses.kt | 0 .../test/kotlin/undertest/{junit5 => junit4}/UT_BinaryTest.kt | 2 +- .../undertest/{junit5 => junit4}/UT_CarriageReturnTest.kt | 2 +- .../kotlin/undertest/{junit5 => junit4}/UT_DiskBasicTest.kt | 0 .../test/kotlin/undertest/{junit5 => junit4}/UT_DiskTodoTest.kt | 2 +- .../undertest/{junit5 => junit4}/UT_DuplicateWriteTest.kt | 2 +- .../{junit5 => junit4}/UT_DuplicateWriteToBeFileTest.kt | 2 +- .../kotlin/undertest/{junit5 => junit4}/UT_InlineFacetTest.kt | 2 +- .../kotlin/undertest/{junit5 => junit4}/UT_InlineIntTest.kt | 2 +- .../kotlin/undertest/{junit5 => junit4}/UT_InlineLongTest.kt | 2 +- .../kotlin/undertest/{junit5 => junit4}/UT_InteractiveTest.kt | 2 +- .../kotlin/undertest/{junit5 => junit4}/UT_MethodLevelGCTest.kt | 2 +- .../kotlin/undertest/{junit5 => junit4}/UT_ParameterizedTest.kt | 2 +- .../kotlin/undertest/{junit5 => junit4}/UT_PrefixAndSubGC.kt | 2 +- .../test/kotlin/undertest/{junit5 => junit4}/UT_ReadOnlyTest.kt | 2 +- .../undertest/{junit5 => junit4}/UT_StringLiteralsKotlinTest.kt | 2 +- .../undertest/{junit5 => junit4}/UT_WrongContextInJUnit.kt | 2 +- 28 files changed, 20 insertions(+), 20 deletions(-) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_CarriageReturnTest.ss (100%) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_DuplicateWriteTest.ss (100%) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_ParameterizedTest.ss (100%) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_PrefixAndSubGC.ss (100%) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_StringLiteralsJavaTest.java (97%) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_TestMethodVisibility.java (93%) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_TestMethodVisibility.ss (100%) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_TestMethodVisibilityParentClass.java (94%) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_WithinMethodGCTest.java (93%) rename jvm/undertest-junit4/src/test/java/undertest/{junit5 => junit4}/UT_WithinMethodGCTest.ss (100%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/SelfieWriteOnce.kt (87%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/SimpleTestThatAlwaysPasses.kt (100%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_BinaryTest.kt (94%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_CarriageReturnTest.kt (90%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_DiskBasicTest.kt (100%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_DiskTodoTest.kt (93%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_DuplicateWriteTest.kt (93%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_DuplicateWriteToBeFileTest.kt (95%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_InlineFacetTest.kt (99%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_InlineIntTest.kt (88%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_InlineLongTest.kt (89%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_InteractiveTest.kt (88%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_MethodLevelGCTest.kt (91%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_ParameterizedTest.kt (95%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_PrefixAndSubGC.kt (92%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_ReadOnlyTest.kt (88%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_StringLiteralsKotlinTest.kt (96%) rename jvm/undertest-junit4/src/test/kotlin/undertest/{junit5 => junit4}/UT_WrongContextInJUnit.kt (97%) diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_CarriageReturnTest.ss b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_CarriageReturnTest.ss similarity index 100% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_CarriageReturnTest.ss rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_CarriageReturnTest.ss diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_DuplicateWriteTest.ss b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_DuplicateWriteTest.ss similarity index 100% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_DuplicateWriteTest.ss rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_DuplicateWriteTest.ss diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_ParameterizedTest.ss b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_ParameterizedTest.ss similarity index 100% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_ParameterizedTest.ss rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_ParameterizedTest.ss diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_PrefixAndSubGC.ss b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_PrefixAndSubGC.ss similarity index 100% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_PrefixAndSubGC.ss rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_PrefixAndSubGC.ss diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_StringLiteralsJavaTest.java b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_StringLiteralsJavaTest.java similarity index 97% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_StringLiteralsJavaTest.java rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_StringLiteralsJavaTest.java index e01eb708..b0798a29 100644 --- a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_StringLiteralsJavaTest.java +++ b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_StringLiteralsJavaTest.java @@ -1,4 +1,4 @@ -package undertest.junit5; +package undertest.junit4; import org.junit.jupiter.api.Test; import static com.diffplug.selfie.Selfie.expectSelfie; diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.java b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibility.java similarity index 93% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.java rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibility.java index 3e4b2432..fdfe6660 100644 --- a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.java +++ b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibility.java @@ -1,4 +1,4 @@ -package undertest.junit5; +package undertest.junit4; import static com.diffplug.selfie.Selfie.expectSelfie; diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.ss b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibility.ss similarity index 100% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibility.ss rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibility.ss diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibilityParentClass.java b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibilityParentClass.java similarity index 94% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibilityParentClass.java rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibilityParentClass.java index a799467c..c59bc9f9 100644 --- a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_TestMethodVisibilityParentClass.java +++ b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibilityParentClass.java @@ -1,4 +1,4 @@ -package undertest.junit5; +package undertest.junit4; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.java b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_WithinMethodGCTest.java similarity index 93% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.java rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_WithinMethodGCTest.java index f2c206d9..46d79821 100644 --- a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.java +++ b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_WithinMethodGCTest.java @@ -1,4 +1,4 @@ -package undertest.junit5; +package undertest.junit4; import org.junit.jupiter.api.Test; import static com.diffplug.selfie.Selfie.expectSelfie; diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.ss b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_WithinMethodGCTest.ss similarity index 100% rename from jvm/undertest-junit4/src/test/java/undertest/junit5/UT_WithinMethodGCTest.ss rename to jvm/undertest-junit4/src/test/java/undertest/junit4/UT_WithinMethodGCTest.ss diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SelfieWriteOnce.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/SelfieWriteOnce.kt similarity index 87% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SelfieWriteOnce.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/SelfieWriteOnce.kt index 39389b2f..81c70e3f 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SelfieWriteOnce.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/SelfieWriteOnce.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.junit5.SelfieSettingsAPI diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SimpleTestThatAlwaysPasses.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/SimpleTestThatAlwaysPasses.kt similarity index 100% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/SimpleTestThatAlwaysPasses.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/SimpleTestThatAlwaysPasses.kt diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_BinaryTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_BinaryTest.kt similarity index 94% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_BinaryTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_BinaryTest.kt index e02e1dd9..7ae17ff9 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_BinaryTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_BinaryTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import kotlin.test.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_CarriageReturnTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_CarriageReturnTest.kt similarity index 90% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_CarriageReturnTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_CarriageReturnTest.kt index c6490392..b812192a 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_CarriageReturnTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_CarriageReturnTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import kotlin.test.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskBasicTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DiskBasicTest.kt similarity index 100% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskBasicTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DiskBasicTest.kt diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskTodoTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DiskTodoTest.kt similarity index 93% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskTodoTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DiskTodoTest.kt index dd15a489..8d2113cd 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DiskTodoTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DiskTodoTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import kotlin.test.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteTest.kt similarity index 93% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteTest.kt index 8738700e..3fa934b5 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import org.junit.jupiter.api.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteToBeFileTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteToBeFileTest.kt similarity index 95% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteToBeFileTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteToBeFileTest.kt index a5602670..05f81e74 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_DuplicateWriteToBeFileTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteToBeFileTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import org.junit.jupiter.api.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineFacetTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt similarity index 99% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineFacetTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt index 996d77d9..25e452bd 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineFacetTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import com.diffplug.selfie.Snapshot diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineIntTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineIntTest.kt similarity index 88% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineIntTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineIntTest.kt index b8f81bfc..8768db06 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineIntTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineIntTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 // spotless:off import com.diffplug.selfie.Selfie.expectSelfie import kotlin.test.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineLongTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineLongTest.kt similarity index 89% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineLongTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineLongTest.kt index 3b3f1024..432dedd5 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InlineLongTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineLongTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 // spotless:off import com.diffplug.selfie.Selfie.expectSelfie import kotlin.test.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InteractiveTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InteractiveTest.kt similarity index 88% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InteractiveTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InteractiveTest.kt index 5a6bf862..3a3100b6 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_InteractiveTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InteractiveTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 // spotless:off import com.diffplug.selfie.Selfie.expectSelfie import kotlin.test.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_MethodLevelGCTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_MethodLevelGCTest.kt similarity index 91% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_MethodLevelGCTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_MethodLevelGCTest.kt index dbf08566..8cdc4b35 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_MethodLevelGCTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_MethodLevelGCTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 // spotless:off import com.diffplug.selfie.Selfie.expectSelfie import kotlin.test.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ParameterizedTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ParameterizedTest.kt similarity index 95% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ParameterizedTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ParameterizedTest.kt index f525df9f..86a938e0 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ParameterizedTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ParameterizedTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import java.time.temporal.ChronoUnit diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_PrefixAndSubGC.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_PrefixAndSubGC.kt similarity index 92% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_PrefixAndSubGC.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_PrefixAndSubGC.kt index e355d937..d4eb6a13 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_PrefixAndSubGC.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_PrefixAndSubGC.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import org.junit.jupiter.api.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ReadOnlyTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ReadOnlyTest.kt similarity index 88% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ReadOnlyTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ReadOnlyTest.kt index c1c41389..2d39966c 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_ReadOnlyTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ReadOnlyTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 // spotless:off import com.diffplug.selfie.Selfie.expectSelfie import kotlin.test.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_StringLiteralsKotlinTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_StringLiteralsKotlinTest.kt similarity index 96% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_StringLiteralsKotlinTest.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_StringLiteralsKotlinTest.kt index 0e98b0a1..7fe6191d 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_StringLiteralsKotlinTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_StringLiteralsKotlinTest.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import org.junit.jupiter.api.Test diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_WrongContextInJUnit.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_WrongContextInJUnit.kt similarity index 97% rename from jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_WrongContextInJUnit.kt rename to jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_WrongContextInJUnit.kt index 8a155436..5670c1a9 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit5/UT_WrongContextInJUnit.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_WrongContextInJUnit.kt @@ -1,4 +1,4 @@ -package undertest.junit5 +package undertest.junit4 import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.Test From 0f406060b73f0561dd3f55b15ca95c4f06c9af2e Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Thu, 6 Feb 2025 13:41:10 -0800 Subject: [PATCH 6/8] Get undertest-junit4 to pass. --- .../selfie/junit4/SelfieSettingsAPI.kt | 99 +++++++++++++++++++ .../junit4/UT_StringLiteralsJavaTest.java | 2 +- .../junit4/UT_TestMethodVisibility.java | 8 +- .../UT_TestMethodVisibilityParentClass.java | 12 +-- .../junit4/UT_WithinMethodGCTest.java | 11 ++- .../undertest/junit4/SelfieWriteOnce.kt | 2 +- .../kotlin/undertest/junit4/UT_BinaryTest.kt | 2 +- .../undertest/junit4/UT_DiskTodoTest.kt | 2 +- .../undertest/junit4/UT_DuplicateWriteTest.kt | 2 +- .../junit4/UT_DuplicateWriteToBeFileTest.kt | 2 +- .../undertest/junit4/UT_InlineFacetTest.kt | 95 +++++++++++++----- .../undertest/junit4/UT_ParameterizedTest.kt | 24 +++-- .../undertest/junit4/UT_PrefixAndSubGC.kt | 2 +- .../junit4/UT_StringLiteralsKotlinTest.kt | 2 +- .../junit4/UT_WrongContextInJUnit.kt | 13 +-- 15 files changed, 214 insertions(+), 64 deletions(-) create mode 100644 jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieSettingsAPI.kt diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieSettingsAPI.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieSettingsAPI.kt new file mode 100644 index 00000000..8575a2b3 --- /dev/null +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieSettingsAPI.kt @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2024-2025 DiffPlug + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.diffplug.selfie.junit4 + +import java.io.File + +open class SelfieSettingsAPI { + open val allowMultipleEquivalentWritesToOneLocation: Boolean + get() = true + + open val snapshotFolderName: String? + get() = null + + open val rootFolder: File + get() { + val userDir = File(System.getProperty("user.dir")) + for (standardDir in STANDARD_DIRS) { + val candidate = userDir.resolve(standardDir) + if (candidate.isDirectory) { + return candidate + } + } + throw AssertionError( + "Could not find a standard test directory, 'user.dir' is equal to $userDir, looked in $STANDARD_DIRS") + } + + open val otherSourceRoots: List + get() { + return buildList { + val rootDir = rootFolder + val userDir = File(System.getProperty("user.dir")) + for (standardDir in STANDARD_DIRS) { + val candidate = userDir.resolve(standardDir) + if (candidate.isDirectory && candidate != rootDir) { + add(candidate) + } + } + } + } + + open val javaDontUseTripleQuoteLiterals: Boolean + get() = false + + companion object { + private val STANDARD_DIRS = + listOf( + "src/test/java", + "src/test/kotlin", + "src/test/groovy", + "src/test/scala", + "src/test/resources") + + internal fun initialize(): SelfieSettingsAPI { + try { + val settings = System.getProperty("selfie.settings") + if (settings != null && settings.isNotBlank()) { + try { + return instantiate(Class.forName(settings)) + } catch (e: ClassNotFoundException) { + throw Error( + "The system property selfie.settings was set to $settings, but that class could not be found.", + e) + } + } + try { + return instantiate(Class.forName("selfie.SelfieSettings")) + } catch (e: ClassNotFoundException) { + return SelfieSettingsAPI() + } + } catch (e: Throwable) { + return SelfieSettingsSmuggleError(e) + } + } + + private fun instantiate(clazz: Class<*>): SelfieSettingsAPI { + try { + return clazz.getDeclaredConstructor().newInstance() as SelfieSettingsAPI + } catch (e: InstantiationException) { + throw AssertionError( + "Unable to instantiate ${clazz.name}, is it abstract? Does it require arguments?", e) + } + } + } +} + +internal class SelfieSettingsSmuggleError(val error: Throwable) : SelfieSettingsAPI() diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_StringLiteralsJavaTest.java b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_StringLiteralsJavaTest.java index b0798a29..3a4b7a59 100644 --- a/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_StringLiteralsJavaTest.java +++ b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_StringLiteralsJavaTest.java @@ -1,6 +1,6 @@ package undertest.junit4; -import org.junit.jupiter.api.Test; +import org.junit.Test; import static com.diffplug.selfie.Selfie.expectSelfie; public class UT_StringLiteralsJavaTest { diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibility.java b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibility.java index fdfe6660..24027834 100644 --- a/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibility.java +++ b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibility.java @@ -2,13 +2,13 @@ import static com.diffplug.selfie.Selfie.expectSelfie; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; +import org.junit.Assert; +import org.junit.Test; public class UT_TestMethodVisibility extends UT_TestMethodVisibilityParentClass { // get test methods from parent class @Test - private void isPrivate() { - Assertions.fail("Test methods can't be private"); + public void isPrivate() { + Assert.fail("Test methods can't be private"); } } diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibilityParentClass.java b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibilityParentClass.java index c59bc9f9..7d7ac604 100644 --- a/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibilityParentClass.java +++ b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_TestMethodVisibilityParentClass.java @@ -1,23 +1,23 @@ package undertest.junit4; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; +import org.junit.Assert; +import org.junit.Test; import static com.diffplug.selfie.Selfie.expectSelfie; class UT_TestMethodVisibilityParentClass { @Test - void isPackage() { + public void isPackage() { expectSelfie("package").toMatchDisk(); } @Test - protected void isProtected() { + public void isProtected() { expectSelfie("protected").toMatchDisk(); } @Test - private void isPrivate() { - Assertions.fail("Test methods can't be private"); + public void isPrivate() { + Assert.fail("Test methods can't be private"); } } diff --git a/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_WithinMethodGCTest.java b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_WithinMethodGCTest.java index 46d79821..e81cd427 100644 --- a/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_WithinMethodGCTest.java +++ b/jvm/undertest-junit4/src/test/java/undertest/junit4/UT_WithinMethodGCTest.java @@ -1,15 +1,18 @@ package undertest.junit4; -import org.junit.jupiter.api.Test; +import org.junit.Test; import static com.diffplug.selfie.Selfie.expectSelfie; public class UT_WithinMethodGCTest { - @Test void selfie2() { + @Test + public void selfie2() { // @Test protected void selfie() { // expectSelfie("root").toMatchDisk(); expectSelfie("oak").toMatchDisk("leaf"); } - @Test void secondMethod() { - expectSelfie("abc123").toMatchDisk(); + + @Test + public void secondMethod() { + expectSelfie("abc123").toMatchDisk(); } } diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/SelfieWriteOnce.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/SelfieWriteOnce.kt index 81c70e3f..b35c8133 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/SelfieWriteOnce.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/SelfieWriteOnce.kt @@ -1,6 +1,6 @@ package undertest.junit4 -import com.diffplug.selfie.junit5.SelfieSettingsAPI +import com.diffplug.selfie.junit4.SelfieSettingsAPI class SelfieWriteOnce : SelfieSettingsAPI() { override val allowMultipleEquivalentWritesToOneLocation = false diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_BinaryTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_BinaryTest.kt index 7ae17ff9..bea569ff 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_BinaryTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_BinaryTest.kt @@ -1,7 +1,7 @@ package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie -import kotlin.test.Test +import org.junit.Test class UT_BinaryTest { @Test fun emptyOnDisk() { diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DiskTodoTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DiskTodoTest.kt index 8d2113cd..445ca0e3 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DiskTodoTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DiskTodoTest.kt @@ -1,7 +1,7 @@ package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie -import kotlin.test.Test +import org.junit.Test class UT_DiskTodoTest { @Test fun selfie() { diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteTest.kt index 3fa934b5..498487cd 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteTest.kt @@ -1,7 +1,7 @@ package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie -import org.junit.jupiter.api.Test +import org.junit.Test class UT_DuplicateWriteTest { // @Test fun shouldFail() { diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteToBeFileTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteToBeFileTest.kt index 05f81e74..519d9128 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteToBeFileTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_DuplicateWriteToBeFileTest.kt @@ -1,7 +1,7 @@ package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie -import org.junit.jupiter.api.Test +import org.junit.Test class UT_DuplicateWriteToBeFileTest { // @Test fun shouldFail() { diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt index 25e452bd..bc476d82 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt @@ -2,8 +2,7 @@ package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import com.diffplug.selfie.Snapshot -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows +import org.junit.Test class UT_InlineFacetTest { @Test fun singleFacet() { @@ -11,9 +10,22 @@ class UT_InlineFacetTest { expectSelfie(zero).toBe("no facets") expectSelfie(zero).facet("").toBe("no facets") expectSelfie(zero).facets("").toBe("no facets") - assertThrows { expectSelfie(zero).toBe("WRONG") } - assertThrows { expectSelfie(zero).facet("").toBe("WRONG") } - assertThrows { expectSelfie(zero).facets("").toBe("WRONG") } + + // Test expected exceptions + try { + expectSelfie(zero).toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} + + try { + expectSelfie(zero).facet("").toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} + + try { + expectSelfie(zero).facets("").toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} val one = Snapshot.of("subject").plusFacet("facet", "facetValue") expectSelfie(one).facet("").toBe("subject") @@ -21,10 +33,25 @@ class UT_InlineFacetTest { expectSelfie(one).facet("facet").toBe("facetValue") expectSelfie(one).facets("facet").toBe("facetValue") - assertThrows { expectSelfie(one).facet("").toBe("WRONG") } - assertThrows { expectSelfie(one).facets("").toBe("WRONG") } - assertThrows { expectSelfie(one).facet("facet").toBe("WRONG") } - assertThrows { expectSelfie(one).facets("facet").toBe("WRONG") } + try { + expectSelfie(one).facet("").toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} + + try { + expectSelfie(one).facets("").toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} + + try { + expectSelfie(one).facet("facet").toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} + + try { + expectSelfie(one).facets("facet").toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} } @Test fun multipleFacets() { @@ -45,7 +72,12 @@ class UT_InlineFacetTest { facetValue3 """ .trimIndent()) - assertThrows { expectSelfie(multiple).toBe("WRONG") } + + try { + expectSelfie(multiple).toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} + expectSelfie(multiple) .facets("", "facet1") .toBe( @@ -55,7 +87,12 @@ class UT_InlineFacetTest { facetValue1 """ .trimIndent()) - assertThrows { expectSelfie(multiple).facets("", "facet1").toBe("WRONG") } + + try { + expectSelfie(multiple).facets("", "facet1").toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} + expectSelfie(multiple) .facets("facet3", "facet2") .toBe( @@ -66,20 +103,28 @@ class UT_InlineFacetTest { facetValue2 """ .trimIndent()) - assertThrows { expectSelfie(multiple).facets("facet3", "facet2").toBe("WRONG") } - expectSelfie( - assertThrows { - expectSelfie(multiple) - .facets("facet1", "") - .toBe( - """ - subject - ╔═ [facet1] ═╗ - facetValue1 - """ - .trimIndent()) - } - .message!!) + + try { + expectSelfie(multiple).facets("facet3", "facet2").toBe("WRONG") + throw AssertionError("Expected exception was not thrown") + } catch (e: Throwable) {} + + var exceptionMessage: String? = null + try { + expectSelfie(multiple) + .facets("facet1", "") + .toBe( + """ + subject + ╔═ [facet1] ═╗ + facetValue1 + """ + .trimIndent()) + } catch (e: Throwable) { + exceptionMessage = e.message + } + + expectSelfie(exceptionMessage!!) .toBe( "If you're going to specify the subject facet (\"\"), you have to list it first, this was [facet1, ]") } diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ParameterizedTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ParameterizedTest.kt index 86a938e0..febbf455 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ParameterizedTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_ParameterizedTest.kt @@ -2,16 +2,24 @@ package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie import java.time.temporal.ChronoUnit -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.EnumSource +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.Parameters -class UT_ParameterizedTest { - @ParameterizedTest - @EnumSource - fun enumSource(unit: ChronoUnit) { - if (unit == ChronoUnit.ERAS || unit == ChronoUnit.FOREVER) { - return +@RunWith(Parameterized::class) +class UT_ParameterizedTest(private val unit: ChronoUnit) { + companion object { + @JvmStatic + @Parameters + fun data(): Collection> { + return ChronoUnit.values() + .filter { it != ChronoUnit.ERAS && it != ChronoUnit.FOREVER } + .map { arrayOf(it as Any) } } + } + + @Test fun enumSource() { expectSelfie("${unit.name} = ${unit.duration.toMillis()}ms") .toMatchDisk(String.format("%02d", unit.ordinal)) } diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_PrefixAndSubGC.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_PrefixAndSubGC.kt index d4eb6a13..12de00a9 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_PrefixAndSubGC.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_PrefixAndSubGC.kt @@ -1,7 +1,7 @@ package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie -import org.junit.jupiter.api.Test +import org.junit.Test class UT_PrefixAndSubGC { @Test fun commonPrefix() { diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_StringLiteralsKotlinTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_StringLiteralsKotlinTest.kt index 7fe6191d..b214a79c 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_StringLiteralsKotlinTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_StringLiteralsKotlinTest.kt @@ -1,7 +1,7 @@ package undertest.junit4 import com.diffplug.selfie.Selfie.expectSelfie -import org.junit.jupiter.api.Test +import org.junit.Test class UT_StringLiteralsKotlinTest { @Test fun empty() { diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_WrongContextInJUnit.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_WrongContextInJUnit.kt index 5670c1a9..9dda68b2 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_WrongContextInJUnit.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_WrongContextInJUnit.kt @@ -1,7 +1,7 @@ package undertest.junit4 import kotlinx.coroutines.runBlocking -import org.junit.jupiter.api.Test +import org.junit.Test class UT_WrongContextInJUnit { @Test fun wrongContext() { @@ -10,14 +10,9 @@ class UT_WrongContextInJUnit { } catch (e: Throwable) { com.diffplug.selfie.Selfie.expectSelfie(e.message!!) .toBe( - """No Kotest test is in progress on this coroutine. -If this is a Kotest test, make sure you added `SelfieExtension` to your `AbstractProjectConfig`: -${' '} +class MyProjectConfig : AbstractProjectConfig() { -${' '} + override fun extensions() = listOf(SelfieExtension(this)) -${' '} +} -If this is a JUnit test, make the following change: -${' '} -import com.diffplug.selfie.coroutines.expectSelfie -${' '} +import com.diffplug.selfie.Selfie.expectSelfie + """No JUnit test is in progress on this thread. If this is a Kotest test, make the following change: +${' '} -import com.diffplug.selfie.Selfie.expectSelfie +${' '} +import com.diffplug.selfie.coroutines.expectSelfie For more info https://selfie.dev/jvm/kotest#selfie-and-coroutines""") } } From 9b7699d4e4c8b38cc01834be0a65b3f7bc1482f0 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Thu, 6 Feb 2025 14:51:59 -0800 Subject: [PATCH 7/8] Workaround parallel test running on CI. --- .github/workflows/jvm-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/jvm-ci.yml b/.github/workflows/jvm-ci.yml index 95138cd7..fec07c2d 100644 --- a/.github/workflows/jvm-ci.yml +++ b/.github/workflows/jvm-ci.yml @@ -32,6 +32,9 @@ jobs: - name: gradle caching uses: gradle/actions/setup-gradle@v4 - run: git fetch origin main + # workaround parallel test suite bugs + - run: ./gradlew :selfie-runner-junit5:test --no-configuration-cache + - run: ./gradlew :selfie-runner-junit4:test --no-configuration-cache - run: ./gradlew build --no-configuration-cache - name: junit result uses: mikepenz/action-junit-report@v4 From 9adecbe55294743bd75946ce02755f438916cea6 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Thu, 6 Feb 2025 15:41:46 -0800 Subject: [PATCH 8/8] spotlessApply --- .../kotlin/com/diffplug/selfie/junit4/SelfieSettingsAPI.kt | 2 -- .../kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt | 6 +----- .../com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt | 6 ------ .../com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt | 5 +---- .../src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt | 3 +-- 5 files changed, 3 insertions(+), 19 deletions(-) diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieSettingsAPI.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieSettingsAPI.kt index 8575a2b3..469581a3 100644 --- a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieSettingsAPI.kt +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieSettingsAPI.kt @@ -62,7 +62,6 @@ open class SelfieSettingsAPI { "src/test/groovy", "src/test/scala", "src/test/resources") - internal fun initialize(): SelfieSettingsAPI { try { val settings = System.getProperty("selfie.settings") @@ -84,7 +83,6 @@ open class SelfieSettingsAPI { return SelfieSettingsSmuggleError(e) } } - private fun instantiate(clazz: Class<*>): SelfieSettingsAPI { try { return clazz.getDeclaredConstructor().newInstance() as SelfieSettingsAPI diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt index 11f25763..c5d9d957 100644 --- a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SelfieTestListener.kt @@ -16,14 +16,13 @@ package com.diffplug.selfie.junit4 import org.junit.runner.Description -import org.junit.runner.notification.RunListener import org.junit.runner.notification.Failure +import org.junit.runner.notification.RunListener /** This is automatically registered at runtime thanks to `META-INF/services`. */ class SelfieTestListener : RunListener() { private val system = SnapshotSystemJUnit4 private val activeTests = mutableMapOf() - override fun testStarted(description: Description) { try { system.testListenerRunning.set(true) @@ -36,7 +35,6 @@ class SelfieTestListener : RunListener() { system.smuggledError.set(e) } } - override fun testFinished(description: Description) { try { val className = description.className @@ -48,13 +46,11 @@ class SelfieTestListener : RunListener() { system.smuggledError.set(e) } } - override fun testFailure(failure: Failure) { val description = failure.description val key = "${description.className}#${description.methodName}" activeTests[key] = false } - override fun testRunFinished(result: org.junit.runner.Result) { system.finishedAllTests() } diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt index 0b2efdce..384c35f0 100644 --- a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotFileLayoutJUnit4.kt @@ -15,14 +15,12 @@ */ package com.diffplug.selfie.junit4 -import com.diffplug.selfie.guts.FS import com.diffplug.selfie.guts.TypedPath import java.util.concurrent.atomic.AtomicReference class SnapshotFileLayoutJUnit4(val className: String) { val smuggledError = AtomicReference() private val extension: String = ".ss" - fun snapshotPathForClass(className: String): TypedPath { val lastDot = className.lastIndexOf('.') val classFolder: TypedPath @@ -37,21 +35,17 @@ class SnapshotFileLayoutJUnit4(val className: String) { val parentFolder = snapshotFolderName?.let { classFolder.resolveFolder(it) } ?: classFolder return parentFolder.resolveFile(filename) } - fun incrementContainers() { TODO("Coroutine support not implemented for JUnit4") } - fun startTest(testName: String, isContainer: Boolean) { checkForSmuggledError() // Basic test tracking without coroutine support } - fun finishedTestWithSuccess(testName: String, isContainer: Boolean, wasSuccessful: Boolean) { checkForSmuggledError() // Basic test completion tracking without coroutine support } - private fun checkForSmuggledError() { smuggledError.get()?.let { throw it } } diff --git a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt index 263ca6a2..42462d0f 100644 --- a/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt +++ b/jvm/selfie-runner-junit4/src/main/kotlin/com/diffplug/selfie/junit4/SnapshotSystemJUnit4.kt @@ -15,24 +15,21 @@ */ package com.diffplug.selfie.junit4 +import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference -import java.util.concurrent.ConcurrentHashMap object SnapshotSystemJUnit4 { val testListenerRunning = AtomicBoolean(false) val smuggledError = AtomicReference() private val fileLayouts = ConcurrentHashMap() - fun forClass(className: String): SnapshotFileLayoutJUnit4 { return fileLayouts.computeIfAbsent(className) { SnapshotFileLayoutJUnit4(it) } } - fun finishedAllTests() { testListenerRunning.set(false) fileLayouts.clear() } - fun checkForSmuggledError() { smuggledError.get()?.let { throw it } } diff --git a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt index bc476d82..a804b393 100644 --- a/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt +++ b/jvm/undertest-junit4/src/test/kotlin/undertest/junit4/UT_InlineFacetTest.kt @@ -10,8 +10,7 @@ class UT_InlineFacetTest { expectSelfie(zero).toBe("no facets") expectSelfie(zero).facet("").toBe("no facets") expectSelfie(zero).facets("").toBe("no facets") - - // Test expected exceptions +// Test expected exceptions try { expectSelfie(zero).toBe("WRONG") throw AssertionError("Expected exception was not thrown")