/* * Copyright 2015-2017 the original author or authors. * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html */ package org.junit.jupiter.params; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.params.ParameterizedTestExtension.arguments; import java.io.FileNotFoundException; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ContainerExtensionContext; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.TestTemplateInvocationContext; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.ArgumentsProvider; import org.junit.jupiter.params.provider.ArgumentsSource; import org.junit.jupiter.params.provider.ObjectArrayArguments; class ParameterizedTestExtensionTests { ParameterizedTestExtension parameterizedTestExtension = new ParameterizedTestExtension(); static boolean streamWasClosed = false; @Test void supportsReturnsFalseForMissingTestMethod() { ContainerExtensionContext extensionContextWithoutTestMethod = getExtensionContextReturningSingleMethod( new TestCaseWithoutMethod()); assertFalse(this.parameterizedTestExtension.supportsTestTemplate(extensionContextWithoutTestMethod)); } @Test void supportsReturnsFalseForTestMethodWithoutParameterizedTestAnnotation() { ContainerExtensionContext extensionContextWithUnAnnotatedTestMethod = getExtensionContextReturningSingleMethod( new TestCaseWithMethod()); assertFalse(this.parameterizedTestExtension.supportsTestTemplate(extensionContextWithUnAnnotatedTestMethod)); } @Test void supportsReturnsTrueForTestMethodWithParameterizedTestAnnotation() { ContainerExtensionContext extensionContextWithAnnotatedTestMethod = getExtensionContextReturningSingleMethod( new TestCaseWithAnnotatedMethod()); assertTrue(this.parameterizedTestExtension.supportsTestTemplate(extensionContextWithAnnotatedTestMethod)); } @Test void streamsReturnedByProvidersAreClosedWhenCallingProvide() { ContainerExtensionContext extensionContext = getExtensionContextReturningSingleMethod( new TestCaseWithArgumentSourceAnnotatedMethod()); Stream<TestTemplateInvocationContext> stream = this.parameterizedTestExtension.provideTestTemplateInvocationContexts( extensionContext); //cause the stream to be evaluated stream.count(); assertTrue(streamWasClosed); } @Test void argumentsRethrowsOriginalExceptionFromProviderAsUncheckedException() { ArgumentsProvider failingProvider = (context) -> { throw new FileNotFoundException("a message"); }; FileNotFoundException exception = assertThrows(FileNotFoundException.class, () -> arguments(failingProvider, null)); assertEquals("a message", exception.getMessage()); } private ContainerExtensionContext getExtensionContextReturningSingleMethod(Object testCase) { // @formatter:off Optional<Method> optional = Arrays.stream(testCase.getClass().getDeclaredMethods()) .filter(method -> method.getName().equals("method")) .findFirst(); // @formatter:on return new ContainerExtensionContext() { @Override public Optional<Method> getTestMethod() { return optional; } @Override public Optional<ExtensionContext> getParent() { return null; } @Override public String getUniqueId() { return null; } @Override public String getDisplayName() { return null; } @Override public Set<String> getTags() { return null; } @Override public Optional<AnnotatedElement> getElement() { return null; } @Override public Optional<Class<?>> getTestClass() { return null; } @Override public void publishReportEntry(Map<String, String> map) { } @Override public Store getStore(Namespace namespace) { return null; } }; } static class TestCaseWithoutMethod { } static class TestCaseWithMethod { void method() { } } static class TestCaseWithAnnotatedMethod { @ParameterizedTest void method() { } } static class TestCaseWithArgumentSourceAnnotatedMethod { @ParameterizedTest @ArgumentsSource(ArgumentsProviderWithCloseHandler.class) void method(String parameter) { } } static class ArgumentsProviderWithCloseHandler implements ArgumentsProvider { @Override public Stream<? extends Arguments> provideArguments(ContainerExtensionContext context) { Stream<ObjectArrayArguments> argumentsStream = Stream.of("foo", "bar").map(ObjectArrayArguments::arguments); return argumentsStream.onClose(() -> streamWasClosed = true); } } }