1- // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
1+ // Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
22package com.intellij.platform.testFramework.junit5.eel.params.impl.junit5
33
4+ import com.intellij.execution.Platform
45import com.intellij.platform.testFramework.junit5.eel.params.api.EelHolder
56import com.intellij.platform.testFramework.junit5.eel.params.api.EelHolderImpl
7+ import com.intellij.platform.testFramework.junit5.eel.params.api.EelSource
68import com.intellij.platform.testFramework.junit5.eel.params.api.LocalEelHolder
79import com.intellij.platform.testFramework.junit5.eel.params.impl.providers.getIjentTestProviders
810import com.intellij.platform.testFramework.junit5.eel.params.spi.EelIjentTestProvider
911import org.jetbrains.annotations.TestOnly
1012import org.junit.jupiter.api.extension.ExtensionContext
1113import org.junit.jupiter.params.provider.Arguments
1214import org.junit.jupiter.params.provider.ArgumentsProvider
15+ import org.junit.jupiter.params.support.ParameterDeclarations
1316import org.junit.platform.commons.util.AnnotationUtils
1417import org.junitpioneer.jupiter.cartesian.CartesianParameterArgumentsProvider
1518import java.lang.reflect.AnnotatedElement
@@ -19,31 +22,42 @@ import kotlin.jvm.optionals.getOrElse
1922
2023@TestOnly
2124internal class EelArgumentsProvider : ArgumentsProvider {
22- override fun provideArguments (context : ExtensionContext ): Stream <out Arguments > =
23- getProvidersAsStream(context).map(Arguments ::of)
25+ override fun provideArguments (
26+ parameters : ParameterDeclarations ,
27+ context : ExtensionContext ,
28+ ): Stream <out Arguments > =
29+ getProvidersAsStream(context, parameters.sourceElement).map(Arguments ::of)
2430}
2531
2632@TestOnly
2733internal class EelCartesianArgumentsProvider : CartesianParameterArgumentsProvider <EelHolder > {
2834 override fun provideArguments (
2935 context : ExtensionContext ,
3036 parameter : Parameter ,
31- ): Stream <EelHolder > = getProvidersAsStream(context)
37+ ): Stream <EelHolder > = getProvidersAsStream(context, parameter )
3238}
3339
3440@TestOnly
35- private fun getProvidersAsStream (context : ExtensionContext ): Stream <EelHolder > {
36- val providers: Array <EelHolder > = arrayOf<EelHolder >(LocalEelHolder ) + getIjentTestProviders().flatMap { provider ->
41+ private fun getProvidersAsStream (context : ExtensionContext , eelHolderElem : AnnotatedElement ): Stream <EelHolder > {
42+ // parametrized classes might not have EelSource
43+ val limitLocalPlatform = eelHolderElem.getAnnotation(EelSource ::class .java)?.limitLocalRunPlatform?.eelPlatform
44+ val allowLocal = limitLocalPlatform == null || limitLocalPlatform == Platform .current()
3745
38- val annotatedElement: AnnotatedElement = arrayOf(context.testMethod, context.testClass).first { it.isPresent }.getOrElse {
39- error(" No method nor class has ${EelHolder ::class } argument" )
40- }
41- createHolders(provider, annotatedElement)
46+ // method or class might have mandatory (e.g. WslTest) annotation
47+ val elemForMandatoryAnno: AnnotatedElement = arrayOf(context.testMethod, context.testClass).first { it.isPresent }.getOrElse {
48+ error(" No method nor class has ${EelHolder ::class } argument" )
49+ }
50+ val localProvider: Array <EelHolder > = if (allowLocal) arrayOf(LocalEelHolder ) else emptyArray<EelHolder >()
51+ val providers: Array <EelHolder > = localProvider + getIjentTestProviders().flatMap { provider ->
52+ createHolders(provider, elemForMandatoryAnno)
4253 }.toTypedArray<EelHolder >()
4354 return Stream .of(* providers)
4455}
4556
46- private fun <T : Annotation > createHolders (provider : EelIjentTestProvider <T >, annotatedElement : AnnotatedElement ): List <EelHolderImpl <T >> {
57+ private fun <T : Annotation > createHolders (
58+ provider : EelIjentTestProvider <T >,
59+ annotatedElement : AnnotatedElement ,
60+ ): List <EelHolderImpl <T >> {
4761 val annotations =
4862 AnnotationUtils .findRepeatableAnnotations(annotatedElement, provider.mandatoryAnnotationClass.java)
4963 return if (annotations.isEmpty()) {
0 commit comments