View Javadoc
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  }