1 package net.avcompris.commons3.api.tests; 2 3 import static com.google.common.base.Preconditions.checkState; 4 5 import java.lang.reflect.Constructor; 6 import java.lang.reflect.Executable; 7 import java.util.Iterator; 8 9 import org.junit.jupiter.api.extension.ExtensionContext; 10 import org.junit.jupiter.api.extension.ParameterContext; 11 import org.junit.jupiter.api.extension.ParameterResolutionException; 12 import org.junit.jupiter.api.extension.ParameterResolver; 13 14 import net.avcompris.commons3.api.tests.TestsSpec.TestSpec; 15 16 public final class TestSpecParametersExtension implements ParameterResolver { 17 18 @Override 19 public boolean supportsParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext) 20 throws ParameterResolutionException { 21 22 final Executable declaringExecutable = parameterContext.getParameter().getDeclaringExecutable(); 23 24 return Constructor.class.isAssignableFrom(declaringExecutable.getClass()) 25 && TestSpec.class.equals(parameterContext.getParameter().getType()); 26 } 27 28 @Override 29 public TestSpec resolveParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext) 30 throws ParameterResolutionException { 31 32 checkState(iterator != null, "iterator should not be null"); 33 34 final TestSpec testSpec = iterator.next(); 35 36 if (!iterator.hasNext()) { 37 38 iterator = null; 39 } 40 41 return testSpec; 42 } 43 44 private static Iterator<TestSpec> iterator = null; 45 46 public static void inject(final Iterable<TestSpec> testSpecs) { 47 48 checkState(iterator == null, "iterator should be null"); 49 50 iterator = testSpecs.iterator(); 51 52 if (!iterator.hasNext()) { 53 54 throw new IllegalArgumentException("iterable should not be empty"); 55 } 56 } 57 }