Skip to content

Conversation

@Ogu1208
Copy link

@Ogu1208 Ogu1208 commented Nov 8, 2025

Resolves: #5081

Overview

This PR builds upon @marcphilipp's POC marc/5081-kotlin-value-class-support to add support for generic inline value classes in @ParameterizedTest methods when kotlin-reflect is on the classpath.

Supported: Generic Inline Value Classes

  • kotlin.Result<T>
  • Custom generic containers (e.g., Container<T>)
  • These work because they compile to Object in JVM, bypassing strict type validation

Not Yet Supported: Primitive-Wrapper Inline Value Classes

  • UInt, ULong, UShort, UByte
  • Custom value classes wrapping primitives (e.g., UserId(Long), Email(String))
  • These fail because Kotlin compiles them to primitives (int, long, etc.), causing JUnit's type validation to fail before reaching the invocation logic
  • Supporting these would require modifications to JUnit's core type validation system

Changes

Implementation

  • Extended MethodReflectionUtils.invoke() to detect and handle inline value class arguments
  • Added KotlinReflectionUtils.isInstanceOfInlineType() to detect @JvmInline annotated instances
  • Added KotlinReflectionUtils.invokeKotlinFunction() to invoke Kotlin functions with inline value class parameters
  • Renamed KotlinSuspendingFunctionUtilsKotlinFunctionUtils to support both suspending and regular functions
  • Added @API annotations to new public methods

Testing

  • GenericInlineValueClassTests: Verifies working cases (Result, nullable Result, custom generic containers)
  • PrimitiveWrapperInlineValueClassTests (@disabled): Documents current limitations with primitive wrappers
  • Removed redundant test files from POC

I hereby agree to the terms of the JUnit Contributor License Agreement.


Definition of Done

@Ogu1208
Copy link
Author

Ogu1208 commented Nov 8, 2025

Hi @marcphilipp 👋

Sorry for the delay — this is actually my first attempt at contributing to an open-source project like JUnit,
so I wanted to take a bit of extra time to make sure I understood everything properly before opening this draft.

As discussed in #5081, I’ve based this Draft PR on the marc/5081-kotlin-value-class-support POC branch
and added extended test coverage for Kotlin inline value class parameter resolution.

There are still a few points I’d like to clarify, since I might have misunderstood parts of the earlier discussion:

  1. Is the intention for this issue to eventually cover arbitrary @JvmInline classes beyond kotlin.Result?
    (From your earlier comments, it seems like @TWiStErRob might be leading that implementation effort.)
  2. For this PR, is it most helpful if I focus solely on test coverage and verification for now,
    or would it be okay to start exploring how kotlin-reflect could generalize the current handling?

I’m happy to adjust the scope based on your guidance.

@Ogu1208
Copy link
Author

Ogu1208 commented Nov 12, 2025

@marcphilipp 👋
Just wanted to kindly follow up on this — could you please take a look when you have a chance?

Copy link
Member

@marcphilipp marcphilipp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add an entry to the 6.1.0-M2 release notes.

@testlens-app
Copy link

testlens-app bot commented Dec 10, 2025

🚨 TestLens detected 2 failed tests 🚨

Here is what you can do:

  1. Inspect the test failures carefully.
  2. If you are convinced that some of the tests are flaky, you can mute them below.
  3. Finally, trigger a rerun by checking the rerun checkbox.

Test Summary

Check Task Test Runs
CI / macOS :platform-tooling-support-tests:test KotlinCoroutinesTests > failsWithHelpfulErrorMessageWhenKotlinReflectIsMissing(Path, OutputFiles) 🚫 ❌
CI / macOS :platform-tooling-support-tests:test KotlinCoroutinesTests > failsWithHelpfulErrorMessageWhenKotlinxCoroutinesIsMissing(Path, OutputFiles) 🚫 ❌

🏷️ Commit: f56ddcb
▶️ Tests: 173 executed
⚪️ Checks: 14/14 completed

Test Failures (first 5 of 6)

KotlinCoroutinesTests > failsWithHelpfulErrorMessageWhenKotlinReflectIsMissing(Path, OutputFiles) (:platform-tooling-support-tests:test in macOS)
java.lang.AssertionError: 
Expecting actual:
  "To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/9.2.1/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation.
Daemon will be stopped at the end of the build 
> Task :checkKotlinGradlePluginConfigurationErrors SKIPPED
> Task :compileKotlin NO-SOURCE
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar
> Task :assemble
> Task :processTestResources NO-SOURCE
> Task :compileTestKotlin
> Task :compileTestJava NO-SOURCE
> Task :testClasses UP-TO-DATE

> Task :test

JUnit Jupiter > initializationError FAILED
    org.junit.platform.launcher.core.DiscoveryIssueException: TestEngine with ID 'junit-jupiter' encountered a critical issue during test discovery:

    (1) [ERROR] ClassSelector [className = 'com.example.project.SuspendFunctionTests', classLoader = jdk.internal.loader.ClassLoaders$AppClassLoader@42110406] resolution failed
        Source: ClassSource [className = 'com.example.project.SuspendFunctionTests', filePosition = null]
                at com.example.project.SuspendFunctionTests.<no-method>(SourceFile:0)
        Cause: org.junit.platform.commons.PreconditionViolationException: Kotlin function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlin:kotlin-reflect to be on the classpath or module path. Please add a corresponding dependency.
    	at org.junit.platform.commons.util.Preconditions.condition(Preconditions.java:339)
    	at org.junit.platform.commons.util.KotlinReflectionUtils.requireDependency(KotlinReflectionUtils.java:189)
    	at org.junit.platform.commons.util.KotlinReflectionUtils.requireKotlinReflect(KotlinReflectionUtils.java:181)
    	at org.junit.platform.commons.util.KotlinReflectionUtils.getKotlinSuspendingFunctionReturnType(KotlinReflectionUtils.java:140)
    	at org.junit.jupiter.engine.support.MethodReflectionUtils.getReturnType(MethodReflectionUtils.java:35)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestableMethod.lambda$hasVoidReturnType$0(IsTestableMethod.java:68)
    	at org.junit.platform.engine.support.discovery.DiscoveryIssueReporter.lambda$createReportingCondition$0(DiscoveryIssueReporter.java:121)
    	at org.junit.platform.engine.support.discovery.DiscoveryIssueReporter$Condition.lambda$and$0(DiscoveryIssueReporter.java:171)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestableMethod.test(IsTestableMethod.java:49)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestMethod.test(IsTestMethod.java:24)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestableMethod.test(IsTestableMethod.java:32)
    	at java.base/java.util.function.Predicate.lambda$or$2(Predicate.java:101)
    	at java.base/java.util.function.Predicate.lambda$or$2(Predicate.java:101)
    	at org.junit.platform.commons.util.ReflectionUtils.findMethod(ReflectionUtils.java:1537)
    	at org.junit.platform.commons.util.ReflectionUtils.isMethodPresent(ReflectionUtils.java:1403)
    	at org.junit.jupiter.engine.discovery.predicates.TestClassPredicates.hasTestOrTestFactoryOrTestTemplateMethods(TestClassPredicates.java:107)
    	at org.junit.jupiter.engine.discovery.predicates.TestClassPredicates.looksLikeIntendedTestClass(TestClassPredicates.java:82)
    	at org.junit.jupiter.engine.discovery.predicates.TestClassPredicates.looksLikeIntendedTestClass(TestClassPredicates.java:76)
    	at org.junit.jupiter.engine.discovery.ClassSelectorResolver.isAcceptedStandaloneTestClass(ClassSelectorResolver.java:114)
    	at org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolveStandaloneTestClass(ClassSelectorResolver.java:105)
    	at org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolve(ClassSelectorResolver.java:101)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolve$0(EngineDiscoveryRequestResolution.java:137)
    	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    	at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
    	at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
    	at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
    	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
    	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    	at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
    	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    	at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:191)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:128)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:94)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.run(EngineDiscoveryRequestResolution.java:85)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.resolve(EngineDiscoveryRequestResolver.java:150)
    	at org.junit.jupiter.engine.discovery.DiscoverySelectorResolver.resolveSelectors(DiscoverySelectorResolver.java:62)
    	at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:74)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:195)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverSafely(EngineDiscoveryOrchestrator.java:174)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:119)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:84)
    	at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:119)
    	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$1(DefaultLauncher.java:112)
    	at java.base/java.util.Optional.orElseGet(Optional.java:364)
    	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:109)
    	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:93)
    	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
    	at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$0(InterceptingLauncher.java:41)
    	at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
    	at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:40)
    	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
    	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:135)
    	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:110)
    	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:104)
    	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:64)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
    	at org.gradle.internal.dispatch.MethodInvocation.invokeOn(MethodInvocation.java:77)
    	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:28)
    	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:19)
    	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:88)
    	at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:194)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:126)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63)
    	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
    	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
    	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72)
    	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
    	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)

> Task :test FAILED
3 actionable tasks: 3 executed
"
to contain:
  "PreconditionViolationException: Kotlin suspending function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlin:kotlin-reflect to be on the classpath or module path. Please add a corresponding dependency." 
	at platform.tooling.support.tests.KotlinCoroutinesTests.failsWithHelpfulErrorMessageWhenKotlinReflectIsMissing(KotlinCoroutinesTests.java:66)
KotlinCoroutinesTests > failsWithHelpfulErrorMessageWhenKotlinReflectIsMissing(Path, OutputFiles) (:platform-tooling-support-tests:test in macOS)
java.lang.AssertionError: 
Expecting actual:
  "To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/9.2.1/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation.
Daemon will be stopped at the end of the build 
> Task :checkKotlinGradlePluginConfigurationErrors SKIPPED
> Task :compileKotlin NO-SOURCE
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar
> Task :assemble
> Task :processTestResources NO-SOURCE
> Task :compileTestKotlin
> Task :compileTestJava NO-SOURCE
> Task :testClasses UP-TO-DATE

> Task :test FAILED

JUnit Jupiter > initializationError FAILED
    org.junit.platform.launcher.core.DiscoveryIssueException: TestEngine with ID 'junit-jupiter' encountered a critical issue during test discovery:

    (1) [ERROR] ClassSelector [className = 'com.example.project.SuspendFunctionTests', classLoader = jdk.internal.loader.ClassLoaders$AppClassLoader@42110406] resolution failed
        Source: ClassSource [className = 'com.example.project.SuspendFunctionTests', filePosition = null]
                at com.example.project.SuspendFunctionTests.<no-method>(SourceFile:0)
        Cause: org.junit.platform.commons.PreconditionViolationException: Kotlin function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlin:kotlin-reflect to be on the classpath or module path. Please add a corresponding dependency.
    	at org.junit.platform.commons.util.Preconditions.condition(Preconditions.java:339)
    	at org.junit.platform.commons.util.KotlinReflectionUtils.requireDependency(KotlinReflectionUtils.java:189)
    	at org.junit.platform.commons.util.KotlinReflectionUtils.requireKotlinReflect(KotlinReflectionUtils.java:181)
    	at org.junit.platform.commons.util.KotlinReflectionUtils.getKotlinSuspendingFunctionReturnType(KotlinReflectionUtils.java:140)
    	at org.junit.jupiter.engine.support.MethodReflectionUtils.getReturnType(MethodReflectionUtils.java:35)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestableMethod.lambda$hasVoidReturnType$0(IsTestableMethod.java:68)
    	at org.junit.platform.engine.support.discovery.DiscoveryIssueReporter.lambda$createReportingCondition$0(DiscoveryIssueReporter.java:121)
    	at org.junit.platform.engine.support.discovery.DiscoveryIssueReporter$Condition.lambda$and$0(DiscoveryIssueReporter.java:171)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestableMethod.test(IsTestableMethod.java:49)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestMethod.test(IsTestMethod.java:24)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestableMethod.test(IsTestableMethod.java:32)
    	at java.base/java.util.function.Predicate.lambda$or$2(Predicate.java:101)
    	at java.base/java.util.function.Predicate.lambda$or$2(Predicate.java:101)
    	at org.junit.platform.commons.util.ReflectionUtils.findMethod(ReflectionUtils.java:1537)
    	at org.junit.platform.commons.util.ReflectionUtils.isMethodPresent(ReflectionUtils.java:1403)
    	at org.junit.jupiter.engine.discovery.predicates.TestClassPredicates.hasTestOrTestFactoryOrTestTemplateMethods(TestClassPredicates.java:107)
    	at org.junit.jupiter.engine.discovery.predicates.TestClassPredicates.looksLikeIntendedTestClass(TestClassPredicates.java:82)
    	at org.junit.jupiter.engine.discovery.predicates.TestClassPredicates.looksLikeIntendedTestClass(TestClassPredicates.java:76)
    	at org.junit.jupiter.engine.discovery.ClassSelectorResolver.isAcceptedStandaloneTestClass(ClassSelectorResolver.java:114)
    	at org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolveStandaloneTestClass(ClassSelectorResolver.java:105)
    	at org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolve(ClassSelectorResolver.java:101)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolve$0(EngineDiscoveryRequestResolution.java:137)
    	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    	at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
    	at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
    	at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
    	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
    	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    	at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
    	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    	at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:191)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:128)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:94)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.run(EngineDiscoveryRequestResolution.java:85)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.resolve(EngineDiscoveryRequestResolver.java:150)
    	at org.junit.jupiter.engine.discovery.DiscoverySelectorResolver.resolveSelectors(DiscoverySelectorResolver.java:62)
    	at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:74)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:195)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverSafely(EngineDiscoveryOrchestrator.java:174)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:119)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:84)
    	at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:119)
    	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$1(DefaultLauncher.java:112)
    	at java.base/java.util.Optional.orElseGet(Optional.java:364)
    	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:109)
    	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:93)
    	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
    	at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$0(InterceptingLauncher.java:41)
    	at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
    	at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:40)
    	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
    	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:135)
    	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:110)
    	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:104)
    	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:64)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
    	at org.gradle.internal.dispatch.MethodInvocation.invokeOn(MethodInvocation.java:77)
    	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:28)
    	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:19)
    	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:88)
    	at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:194)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:126)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63)
    	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
    	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
    	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72)
    	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
    	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
3 actionable tasks: 3 executed
"
to contain:
  "PreconditionViolationException: Kotlin suspending function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlin:kotlin-reflect to be on the classpath or module path. Please add a corresponding dependency." 
	at platform.tooling.support.tests.KotlinCoroutinesTests.failsWithHelpfulErrorMessageWhenKotlinReflectIsMissing(KotlinCoroutinesTests.java:66)
KotlinCoroutinesTests > failsWithHelpfulErrorMessageWhenKotlinReflectIsMissing(Path, OutputFiles) (:platform-tooling-support-tests:test in macOS)
java.lang.AssertionError: 
Expecting actual:
  "To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/9.2.1/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation.
Daemon will be stopped at the end of the build 
> Task :checkKotlinGradlePluginConfigurationErrors SKIPPED
> Task :compileKotlin NO-SOURCE
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar
> Task :assemble
> Task :processTestResources NO-SOURCE
> Task :compileTestKotlin
> Task :compileTestJava NO-SOURCE
> Task :testClasses UP-TO-DATE

> Task :test FAILED

JUnit Jupiter > initializationError FAILED
    org.junit.platform.launcher.core.DiscoveryIssueException: TestEngine with ID 'junit-jupiter' encountered a critical issue during test discovery:

    (1) [ERROR] ClassSelector [className = 'com.example.project.SuspendFunctionTests', classLoader = jdk.internal.loader.ClassLoaders$AppClassLoader@42110406] resolution failed
        Source: ClassSource [className = 'com.example.project.SuspendFunctionTests', filePosition = null]
                at com.example.project.SuspendFunctionTests.<no-method>(SourceFile:0)
        Cause: org.junit.platform.commons.PreconditionViolationException: Kotlin function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlin:kotlin-reflect to be on the classpath or module path. Please add a corresponding dependency.
    	at org.junit.platform.commons.util.Preconditions.condition(Preconditions.java:339)
    	at org.junit.platform.commons.util.KotlinReflectionUtils.requireDependency(KotlinReflectionUtils.java:189)
    	at org.junit.platform.commons.util.KotlinReflectionUtils.requireKotlinReflect(KotlinReflectionUtils.java:181)
    	at org.junit.platform.commons.util.KotlinReflectionUtils.getKotlinSuspendingFunctionReturnType(KotlinReflectionUtils.java:140)
    	at org.junit.jupiter.engine.support.MethodReflectionUtils.getReturnType(MethodReflectionUtils.java:35)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestableMethod.lambda$hasVoidReturnType$0(IsTestableMethod.java:68)
    	at org.junit.platform.engine.support.discovery.DiscoveryIssueReporter.lambda$createReportingCondition$0(DiscoveryIssueReporter.java:121)
    	at org.junit.platform.engine.support.discovery.DiscoveryIssueReporter$Condition.lambda$and$0(DiscoveryIssueReporter.java:171)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestableMethod.test(IsTestableMethod.java:49)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestMethod.test(IsTestMethod.java:24)
    	at org.junit.jupiter.engine.discovery.predicates.IsTestableMethod.test(IsTestableMethod.java:32)
    	at java.base/java.util.function.Predicate.lambda$or$2(Predicate.java:101)
    	at java.base/java.util.function.Predicate.lambda$or$2(Predicate.java:101)
    	at org.junit.platform.commons.util.ReflectionUtils.findMethod(ReflectionUtils.java:1537)
    	at org.junit.platform.commons.util.ReflectionUtils.isMethodPresent(ReflectionUtils.java:1403)
    	at org.junit.jupiter.engine.discovery.predicates.TestClassPredicates.hasTestOrTestFactoryOrTestTemplateMethods(TestClassPredicates.java:107)
    	at org.junit.jupiter.engine.discovery.predicates.TestClassPredicates.looksLikeIntendedTestClass(TestClassPredicates.java:82)
    	at org.junit.jupiter.engine.discovery.predicates.TestClassPredicates.looksLikeIntendedTestClass(TestClassPredicates.java:76)
    	at org.junit.jupiter.engine.discovery.ClassSelectorResolver.isAcceptedStandaloneTestClass(ClassSelectorResolver.java:114)
    	at org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolveStandaloneTestClass(ClassSelectorResolver.java:105)
    	at org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolve(ClassSelectorResolver.java:101)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolve$0(EngineDiscoveryRequestResolution.java:137)
    	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    	at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
    	at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
    	at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
    	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
    	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    	at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
    	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    	at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:191)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:128)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:94)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.run(EngineDiscoveryRequestResolution.java:85)
    	at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.resolve(EngineDiscoveryRequestResolver.java:150)
    	at org.junit.jupiter.engine.discovery.DiscoverySelectorResolver.resolveSelectors(DiscoverySelectorResolver.java:62)
    	at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:74)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:195)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverSafely(EngineDiscoveryOrchestrator.java:174)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:119)
    	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:84)
    	at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:119)
    	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$1(DefaultLauncher.java:112)
    	at java.base/java.util.Optional.orElseGet(Optional.java:364)
    	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:109)
    	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:93)
    	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
    	at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$0(InterceptingLauncher.java:41)
    	at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
    	at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:40)
    	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
    	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:135)
    	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:110)
    	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:104)
    	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:64)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
    	at org.gradle.internal.dispatch.MethodInvocation.invokeOn(MethodInvocation.java:77)
    	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:28)
    	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:19)
    	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:88)
    	at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:194)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:126)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103)
    	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63)
    	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
    	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
    	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72)
    	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
    	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
3 actionable tasks: 3 executed
"
to contain:
  "PreconditionViolationException: Kotlin suspending function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlin:kotlin-reflect to be on the classpath or module path. Please add a corresponding dependency." 
	at platform.tooling.support.tests.KotlinCoroutinesTests.failsWithHelpfulErrorMessageWhenKotlinReflectIsMissing(KotlinCoroutinesTests.java:66)
KotlinCoroutinesTests > failsWithHelpfulErrorMessageWhenKotlinxCoroutinesIsMissing(Path, OutputFiles) (:platform-tooling-support-tests:test in macOS)
java.lang.AssertionError: 
Expecting actual:
  "To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/9.2.1/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation.
Daemon will be stopped at the end of the build 
> Task :checkKotlinGradlePluginConfigurationErrors SKIPPED
> Task :compileKotlin NO-SOURCE
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar
> Task :assemble
> Task :processTestResources NO-SOURCE
> Task :compileTestKotlin
> Task :compileTestJava NO-SOURCE
> Task :testClasses UP-TO-DATE

> Task :test FAILED

SuspendFunctionTests > test() FAILED
    org.junit.platform.commons.PreconditionViolationException: Kotlin function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlinx:kotlinx-coroutines-core to be on the classpath or module path. Please add a corresponding dependency.
        at app//org.junit.platform.commons.util.Preconditions.condition(Preconditions.java:339)
        at app//org.junit.platform.commons.util.KotlinReflectionUtils.requireDependency(KotlinReflectionUtils.java:189)
        at app//org.junit.platform.commons.util.KotlinReflectionUtils.requireKotlinxCoroutines(KotlinReflectionUtils.java:185)
        at app//org.junit.platform.commons.util.KotlinReflectionUtils.invokeKotlinSuspendingFunction(KotlinReflectionUtils.java:162)
        at app//org.junit.jupiter.engine.support.MethodReflectionUtils.invoke(MethodReflectionUtils.java:47)
        at app//org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:61)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:124)
        at app//org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:163)
        at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:148)
        at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:123)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:105)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:99)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:66)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:47)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:39)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:104)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:98)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invokeVoid(InterceptingExecutableInvoker.java:71)
        at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$0(TestMethodTestDescriptor.java:219)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:215)
        at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:157)
        at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:70)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:176)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
        at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:139)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
        at java.base@17.0.17/java.util.ArrayList.forEach(ArrayList.java:1511)
        at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
        at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:139)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
        at java.base@17.0.17/java.util.ArrayList.forEach(ArrayList.java:1511)
        at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
        at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:139)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
        at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:36)
        at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:52)
        at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:58)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.executeEngine(EngineExecutionOrchestrator.java:246)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.failOrExecuteEngine(EngineExecutionOrchestrator.java:218)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:179)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:66)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:157)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:65)
        at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:125)
        at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
        at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:93)
        at app//org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
        at app//org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$0(InterceptingLauncher.java:41)
        at app//org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
        at app//org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:40)
        at app//org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
        at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:135)
        at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:110)
        at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:104)
        at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:64)
        at java.base@17.0.17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base@17.0.17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base@17.0.17/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base@17.0.17/java.lang.reflect.Method.invoke(Method.java:569)
        at org.gradle.internal.dispatch.MethodInvocation.invokeOn(MethodInvocation.java:77)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:28)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:19)
        at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
        at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:88)
        at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:194)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:126)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63)
        at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72)
        at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
        at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
3 actionable tasks: 3 executed
"
to contain:
  "PreconditionViolationException: Kotlin suspending function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlinx:kotlinx-coroutines-core to be on the classpath or module path. Please add a corresponding dependency." 
	at platform.tooling.support.tests.KotlinCoroutinesTests.failsWithHelpfulErrorMessageWhenKotlinxCoroutinesIsMissing(KotlinCoroutinesTests.java:53)
KotlinCoroutinesTests > failsWithHelpfulErrorMessageWhenKotlinxCoroutinesIsMissing(Path, OutputFiles) (:platform-tooling-support-tests:test in macOS)
java.lang.AssertionError: 
Expecting actual:
  "To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/9.2.1/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation.
Daemon will be stopped at the end of the build 
> Task :checkKotlinGradlePluginConfigurationErrors SKIPPED
> Task :compileKotlin NO-SOURCE
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar
> Task :assemble
> Task :processTestResources NO-SOURCE
> Task :compileTestKotlin
> Task :compileTestJava NO-SOURCE
> Task :testClasses UP-TO-DATE

> Task :test FAILED

SuspendFunctionTests > test() FAILED
    org.junit.platform.commons.PreconditionViolationException: Kotlin function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlinx:kotlinx-coroutines-core to be on the classpath or module path. Please add a corresponding dependency.
        at app//org.junit.platform.commons.util.Preconditions.condition(Preconditions.java:339)
        at app//org.junit.platform.commons.util.KotlinReflectionUtils.requireDependency(KotlinReflectionUtils.java:189)
        at app//org.junit.platform.commons.util.KotlinReflectionUtils.requireKotlinxCoroutines(KotlinReflectionUtils.java:185)
        at app//org.junit.platform.commons.util.KotlinReflectionUtils.invokeKotlinSuspendingFunction(KotlinReflectionUtils.java:162)
        at app//org.junit.jupiter.engine.support.MethodReflectionUtils.invoke(MethodReflectionUtils.java:47)
        at app//org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:61)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:124)
        at app//org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:163)
        at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:148)
        at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:123)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:105)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:99)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:66)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:47)
        at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:39)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:104)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:98)
        at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invokeVoid(InterceptingExecutableInvoker.java:71)
        at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$0(TestMethodTestDescriptor.java:219)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:215)
        at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:157)
        at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:70)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:176)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
        at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:139)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
        at java.base@17.0.17/java.util.ArrayList.forEach(ArrayList.java:1511)
        at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
        at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:139)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
        at java.base@17.0.17/java.util.ArrayList.forEach(ArrayList.java:1511)
        at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
        at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:139)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
        at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
        at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
        at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:36)
        at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:52)
        at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:58)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.executeEngine(EngineExecutionOrchestrator.java:246)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.failOrExecuteEngine(EngineExecutionOrchestrator.java:218)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:179)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:66)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:157)
        at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:65)
        at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:125)
        at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
        at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:93)
        at app//org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
        at app//org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$0(InterceptingLauncher.java:41)
        at app//org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
        at app//org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:40)
        at app//org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:48)
        at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:135)
        at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:110)
        at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:104)
        at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:64)
        at java.base@17.0.17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base@17.0.17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base@17.0.17/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base@17.0.17/java.lang.reflect.Method.invoke(Method.java:569)
        at org.gradle.internal.dispatch.MethodInvocation.invokeOn(MethodInvocation.java:77)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:28)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:19)
        at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
        at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:88)
        at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:194)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:126)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63)
        at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72)
        at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
        at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
3 actionable tasks: 3 executed
"
to contain:
  "PreconditionViolationException: Kotlin suspending function [public final java.lang.Object com.example.project.SuspendFunctionTests.test(kotlin.coroutines.Continuation<? super kotlin.Unit>)] requires org.jetbrains.kotlinx:kotlinx-coroutines-core to be on the classpath or module path. Please add a corresponding dependency." 
	at platform.tooling.support.tests.KotlinCoroutinesTests.failsWithHelpfulErrorMessageWhenKotlinxCoroutinesIsMissing(KotlinCoroutinesTests.java:53)

Muted Tests

Select tests to mute:

  • KotlinCoroutinesTests > failsWithHelpfulErrorMessageWhenKotlinReflectIsMissing(Path, OutputFiles)
  • KotlinCoroutinesTests > failsWithHelpfulErrorMessageWhenKotlinxCoroutinesIsMissing(Path, OutputFiles)

Reuse successful test results

  • ♻️ Only rerun the tests that failed or were muted before

Click the checkbox to trigger a rerun:

  • Rerun jobs

Learn more about TestLens at testlens.app.

@Ogu1208 Ogu1208 force-pushed the ogu1208/kotlin-value-class-support branch 2 times, most recently from a4f9603 to 8373625 Compare December 11, 2025 15:38
marcphilipp and others added 4 commits December 12, 2025 01:24
Issue: junit-team#5081
Signed-off-by: Ogu1208 <kdasunb6@gmail.com>
Signed-off-by: Ogu1208 <kdasunb6@gmail.com>
Signed-off-by: Ogu1208 <kdasunb6@gmail.com>
Signed-off-by: Ogu1208 <kdasunb6@gmail.com>
@Ogu1208 Ogu1208 force-pushed the ogu1208/kotlin-value-class-support branch from 8373625 to 7933e30 Compare December 11, 2025 16:24
@marcphilipp
Copy link
Member

Please add an entry to the 6.1.0-M2 release notes.

@Ogu1208 Do you have time to address this or should we take over?

@marcphilipp marcphilipp added this to the 6.1.0-M2 milestone Dec 13, 2025
@Ogu1208 Ogu1208 force-pushed the ogu1208/kotlin-value-class-support branch from cf2abac to 6b1faa5 Compare December 14, 2025 08:16
Signed-off-by: Ogu1208 <kdasunb6@gmail.com>
@Ogu1208 Ogu1208 force-pushed the ogu1208/kotlin-value-class-support branch from 6b1faa5 to f37fd16 Compare December 14, 2025 08:17
@Ogu1208
Copy link
Author

Ogu1208 commented Dec 14, 2025

@marcphilipp

Thank you for the feedback. I've added the release note entry.

Please let me know if any adjustments are needed. Apologies for the delay.

@Ogu1208 Ogu1208 force-pushed the ogu1208/kotlin-value-class-support branch 2 times, most recently from 04a13c9 to 239468f Compare December 14, 2025 09:12
Signed-off-by: Ogu1208 <kdasunb6@gmail.com>
@Ogu1208 Ogu1208 force-pushed the ogu1208/kotlin-value-class-support branch from 239468f to f251983 Compare December 14, 2025 09:15
@Ogu1208 Ogu1208 marked this pull request as ready for review December 14, 2025 09:16
Signed-off-by: Ogu1208 <kdasunb6@gmail.com>
@Ogu1208 Ogu1208 changed the title Add tests for Kotlin inline value class Support generic Kotlin inline value classes in parameterized tests Dec 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for resolving Kotlin inline value class parameters

2 participants