/* * 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 java.nio.charset.StandardCharsets.UTF_8; 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.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; 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.util.PreconditionViolationException; /** * @since 5.0 */ class CsvFileArgumentsProviderTests { @Test void providesArgumentsForNewlineAndComma() { Stream<Object[]> arguments = provideArguments("foo, bar \n baz, qux \n", "\n", ','); assertThat(arguments).containsExactly(new Object[] { "foo", "bar" }, new Object[] { "baz", "qux" }); } @Test void providesArgumentsForCarriageReturnAndSemicolon() { Stream<Object[]> arguments = provideArguments("foo; bar \r baz; qux", "\r", ';'); assertThat(arguments).containsExactly(new Object[] { "foo", "bar" }, new Object[] { "baz", "qux" }); } @Test void closesInputStream() { AtomicBoolean closed = new AtomicBoolean(false); InputStream inputStream = new ByteArrayInputStream("foo".getBytes()) { @Override public void close() throws IOException { closed.set(true); } }; Stream<Object[]> arguments = provideArguments(inputStream, "\n", ','); assertThat(arguments.count()).isEqualTo(1); assertThat(closed.get()).describedAs("closed").isTrue(); } @Test void readsFromSingleClasspathResource() { CsvFileSource annotation = annotation("ISO-8859-1", "\n", ',', "/single-column.csv"); Stream<Object[]> arguments = provide(new CsvFileArgumentsProvider(), annotation); assertThat(arguments).containsExactly(new Object[] { "foo" }, new Object[] { "bar" }, new Object[] { "baz" }, new Object[] { "qux" }); } @Test void readsFromMultipleClasspathResources() { CsvFileSource annotation = annotation("ISO-8859-1", "\n", ',', "/single-column.csv", "/single-column.csv"); Stream<Object[]> arguments = provide(new CsvFileArgumentsProvider(), annotation); assertThat(arguments).hasSize(8); } @Test void throwsExceptionForMissingClasspathResource() { CsvFileSource annotation = annotation("UTF-8", "\n", ',', "does-not-exist.csv"); PreconditionViolationException exception = assertThrows(PreconditionViolationException.class, () -> provide(new CsvFileArgumentsProvider(), annotation).toArray()); assertThat(exception).hasMessageContaining("Classpath resource does not exist: does-not-exist.csv"); } private CsvFileSource annotation(String charset, String lineSeparator, char delimiter, String... resources) { CsvFileSource annotation = mock(CsvFileSource.class); when(annotation.resources()).thenReturn(resources); when(annotation.encoding()).thenReturn(charset); when(annotation.lineSeparator()).thenReturn(lineSeparator); when(annotation.delimiter()).thenReturn(delimiter); return annotation; } private Stream<Object[]> provideArguments(String content, String lineSeparator, char delimiter) { return provideArguments(new ByteArrayInputStream(content.getBytes(UTF_8)), lineSeparator, delimiter); } private Stream<Object[]> provideArguments(InputStream inputStream, String lineSeparator, char delimiter) { String expectedResource = "foo/bar"; CsvFileSource annotation = annotation("ISO-8859-1", lineSeparator, delimiter, expectedResource); CsvFileArgumentsProvider provider = new CsvFileArgumentsProvider((testClass, resource) -> { assertThat(resource).isEqualTo(expectedResource); return inputStream; }); return provide(provider, annotation); } private Stream<Object[]> provide(CsvFileArgumentsProvider provider, CsvFileSource annotation) { provider.accept(annotation); ContainerExtensionContext context = mock(ContainerExtensionContext.class); when(context.getTestClass()).thenReturn(Optional.of(CsvFileArgumentsProviderTests.class)); return provider.provideArguments(context).map(Arguments::get); } }