/*
* 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.provider;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ContainerExtensionContext;
import org.junit.platform.commons.JUnitException;
import org.junit.platform.commons.util.PreconditionViolationException;
/**
* @since 5.0
*/
class MethodArgumentsProviderTests {
@Test
void providesArgumentsUsingStream() {
Stream<Object[]> arguments = provideArguments("stringStreamProvider");
assertThat(arguments).containsExactly(new Object[] { "foo" }, new Object[] { "bar" });
}
@Test
void providesArgumentsUsingIterable() {
Stream<Object[]> arguments = provideArguments("stringIterableProvider");
assertThat(arguments).containsExactly(new Object[] { "foo" }, new Object[] { "bar" });
}
@Test
void providesArgumentsUsingIterator() {
Stream<Object[]> arguments = provideArguments("stringIteratorProvider");
assertThat(arguments).containsExactly(new Object[] { "foo" }, new Object[] { "bar" });
}
@Test
void providesArgumentsUsingMultipleMethods() {
Stream<Object[]> arguments = provideArguments("stringStreamProvider", "stringIterableProvider");
assertThat(arguments).containsExactly(new Object[] { "foo" }, new Object[] { "bar" }, new Object[] { "foo" },
new Object[] { "bar" });
}
@Test
void throwsExceptionForIllegalReturnType() {
PreconditionViolationException exception = assertThrows(PreconditionViolationException.class,
() -> provideArguments("providerWithIllegalReturnType").toArray());
assertThat(exception).hasMessageContaining("Cannot convert instance of java.lang.Integer into a Stream");
}
@Test
void providesArgumentsUsingArgumentsStream() {
Stream<Object[]> arguments = provideArguments("argumentsStreamProvider");
assertThat(arguments).containsExactly(new Object[] { "foo" }, new Object[] { "bar" });
}
@Test
void providesArgumentsUsingObjectArrays() {
Stream<Object[]> arguments = provideArguments("objectArrayProvider");
assertThat(arguments).containsExactly(new Object[] { "foo", 42 }, new Object[] { "bar", 23 });
}
@Test
void throwsExceptionWhenMethodDoesNotExists() {
JUnitException exception = assertThrows(JUnitException.class,
() -> provideArguments("unknownMethod").toArray());
assertThat(exception).hasMessageContaining("Could not find method");
}
@Test
void throwsExceptionWhenNoTestClassIsAvailable() {
JUnitException exception = assertThrows(JUnitException.class,
() -> provideArguments((Class<?>) null, "someMethod"));
assertThat(exception).hasMessageContaining("Cannot invoke method without test class");
}
static class TestCase {
static AtomicBoolean collectionStreamClosed = new AtomicBoolean(false);
static Stream<String> stringStreamProvider() {
return Stream.of("foo", "bar");
}
static Iterable<String> stringIterableProvider() {
return TestCase::stringIteratorProvider;
}
static Iterator<String> stringIteratorProvider() {
return Arrays.asList("foo", "bar").iterator();
}
static Object providerWithIllegalReturnType() {
return -1;
}
static Stream<ObjectArrayArguments> argumentsStreamProvider() {
return Stream.of("foo", "bar").map(ObjectArrayArguments::arguments);
}
static Iterable<Object[]> objectArrayProvider() {
return Arrays.asList(new Object[] { "foo", 42 }, new Object[] { "bar", 23 });
}
}
private Stream<Object[]> provideArguments(String... methodNames) {
return provideArguments(TestCase.class, methodNames);
}
private Stream<Object[]> provideArguments(Class<?> testClass, String... methodNames) {
MethodSource annotation = mock(MethodSource.class);
when(annotation.value()).thenReturn(methodNames);
ContainerExtensionContext context = mock(ContainerExtensionContext.class);
when(context.getTestClass()).thenReturn(Optional.ofNullable(testClass));
MethodArgumentsProvider provider = new MethodArgumentsProvider();
provider.accept(annotation);
return provider.provideArguments(context).map(Arguments::get);
}
}