/* * 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.junit.jupiter.params.provider.EnumArgumentsProviderTests.EnumWithTwoConstants.BAR; import static org.junit.jupiter.params.provider.EnumArgumentsProviderTests.EnumWithTwoConstants.FOO; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.provider.EnumSource.Mode; import org.junit.platform.commons.util.PreconditionViolationException; /** * @since 5.0 */ class EnumArgumentsProviderTests { @Test void providesAllEnumConstants() { Stream<Object[]> arguments = provideArguments(EnumWithTwoConstants.class); assertThat(arguments).containsExactly(new Object[] { FOO }, new Object[] { BAR }); } @Test void provideSingleEnumConstant() { Stream<Object[]> arguments = provideArguments(EnumWithTwoConstants.class, "FOO"); assertThat(arguments).containsExactly(new Object[] { FOO }); } @Test void provideAllEnumConstantsWithNamingAll() { Stream<Object[]> arguments = provideArguments(EnumWithTwoConstants.class, "FOO", "BAR"); assertThat(arguments).containsExactly(new Object[] { FOO }, new Object[] { BAR }); } @Test void duplicateConstantNameIsDetected() { Exception exception = assertThrows(PreconditionViolationException.class, () -> provideArguments(EnumWithTwoConstants.class, "FOO", "BAR", "FOO")); assertThat(exception).hasMessageContaining("Duplicate enum constant name(s) found"); } @Test void invalidConstantNameIsDetected() { Exception exception = assertThrows(PreconditionViolationException.class, () -> provideArguments(EnumWithTwoConstants.class, "FO0", "B4R")); assertThat(exception).hasMessageContaining("Invalid enum constant name(s) in"); } @Test void invalidPatternIsDetected() { Exception exception = assertThrows(PreconditionViolationException.class, () -> provideArguments(EnumWithTwoConstants.class, Mode.MATCH_ALL, "(", ")")); assertThat(exception).hasMessageContaining("Pattern compilation failed"); } enum EnumWithTwoConstants { FOO, BAR } private <E extends Enum<E>> Stream<Object[]> provideArguments(Class<E> enumClass, String... names) { return provideArguments(enumClass, Mode.INCLUDE, names); } private <E extends Enum<E>> Stream<Object[]> provideArguments(Class<E> enumClass, Mode mode, String... names) { EnumSource annotation = mock(EnumSource.class); when(annotation.value()).thenAnswer(invocation -> enumClass); when(annotation.mode()).thenAnswer(invocation -> mode); when(annotation.names()).thenAnswer(invocation -> names); when(annotation.toString()).thenReturn(String.format("@EnumSource(value=%s.class, mode=%s, names=%s)", enumClass.getSimpleName(), mode, Arrays.toString(names))); EnumArgumentsProvider provider = new EnumArgumentsProvider(); provider.accept(annotation); return provider.provideArguments(null).map(Arguments::get); } }