package com.lexicalscope.jewel.cli; import static com.lexicalscope.jewel.cli.ValidationFailureMatcher.validationError; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.util.List; import org.junit.Test; public class TestCliImpl { public interface SingleOption { @Option String getName(); } public interface ListOption { @Option List<String> getName(); } public interface CharacterValue { @Option Character getName(); } public interface SingleBooleanOption { @Option boolean getName0(); @Option boolean isName1(); } public interface SingleOptionalOption { @Option String getName(); boolean isName(); } public interface IntegerOption { @Option Integer getName(); } public interface IntOption { @Option int getName(); } public interface SingleOptionWithArgument { @Option String getName(String argument); } public interface SingleOptionMissingAnnotation { String getName(); } public enum TestEnum { Value0, Value1, Value2; } public interface EnumDefaultListOption { @Option(defaultValue = { "Value0", "Value1" }) List<TestEnum> getName(); } @Test public void testSingleOption() throws ArgumentValidationException { final SingleOption option = new CliInterfaceImpl<SingleOption>(SingleOption.class) .parseArguments(new String[] { "--name", "value" }); assertEquals(option.getName(), "value"); } @Test public void testSingleBooleanOption() throws ArgumentValidationException { final SingleBooleanOption option = new CliInterfaceImpl<SingleBooleanOption>(SingleBooleanOption.class) .parseArguments(new String[] { "--name1" }); assertEquals(option.getName0(), false); assertEquals(option.isName1(), true); } @Test public void testIntegerOption() throws ArgumentValidationException { final IntegerOption option = new CliInterfaceImpl<IntegerOption>(IntegerOption.class) .parseArguments(new String[] { "--name", "10" }); assertEquals(Integer.valueOf(10), option.getName()); } @Test public void testInvalidIntegerOption() { try { new CliInterfaceImpl<IntegerOption>(IntegerOption.class).parseArguments(new String[] { "--name", "abc" }); fail(); } catch (final ArgumentValidationException e) { assertThat(e.getValidationFailures(), contains(validationError( ValidationFailureType.InvalidValueForType, "Invalid value (Unsupported number format: For input string: \"abc\"): --name value"))); } } @Test public void testInvalidIntOption() { try { new CliInterfaceImpl<IntOption>(IntOption.class).parseArguments(new String[] { "--name", "abc" }); fail(); } catch (final ArgumentValidationException e) { assertThat(e.getValidationFailures(), contains(validationError( ValidationFailureType.InvalidValueForType, "Invalid value (Unsupported number format: For input string: \"abc\"): --name value"))); } } @Test public void testInvalidOption() { try { new CliInterfaceImpl<SingleOption>(SingleOption.class) .parseArguments(new String[] { "--invalid", "value" }); fail(); } catch (final ArgumentValidationException e) { assertThat(e.getValidationFailures(), contains( validationError(ValidationFailureType.UnexpectedOption))); } } @Test public void testSingleOptionalOption() throws ArgumentValidationException { SingleOptionalOption option = new CliInterfaceImpl<SingleOptionalOption>(SingleOptionalOption.class).parseArguments(new String[] { "--name", "value" }); assertEquals(option.getName(), "value"); assertTrue(option.isName()); option = new CliInterfaceImpl<SingleOptionalOption>(SingleOptionalOption.class).parseArguments(new String[] {}); assertFalse(option.isName()); } @Test public void testSingleOptionalOptionRequestMissing() throws ArgumentValidationException { final SingleOptionalOption option = new CliInterfaceImpl<SingleOptionalOption>(SingleOptionalOption.class).parseArguments(new String[] {}); assertThat(option.getName(), equalTo(null)); } @Test public void testCharacterValue() throws ArgumentValidationException { final CharacterValue option = new CliInterfaceImpl<CharacterValue>(CharacterValue.class) .parseArguments(new String[] { "--name", "a" }); assertEquals((Character) 'a', option.getName()); } @Test public void testInvalidCharacterValue() { try { new CliInterfaceImpl<CharacterValue>(CharacterValue.class).parseArguments(new String[] { "--name", "aa" }); fail(); } catch (final ArgumentValidationException e) { assertThat(e.getValidationFailures(), contains(validationError(ValidationFailureType.InvalidValueForType))); } } @Test public void testMethodWithArguments() throws ArgumentValidationException { try { new CliInterfaceImpl<SingleOptionWithArgument>(SingleOptionWithArgument.class).parseArguments(new String[] { "--name", "value" }); fail(); } catch (final ArgumentValidationException e) { assertThat(e.getValidationFailures(), contains(validationError(ValidationFailureType.UnexpectedOption))); } } @Test public void testMethodWithMissingAnnotation() throws ArgumentValidationException { final SingleOptionMissingAnnotation result = new CliInterfaceImpl<SingleOptionMissingAnnotation>(SingleOptionMissingAnnotation.class) .parseArguments(new String[] {}); assertThat(result.getName(), equalTo(null)); } @Test public void testListOptionMissingValue() throws ArgumentValidationException { new CliInterfaceImpl<ListOption>(ListOption.class).parseArguments(new String[] { "--name" }); } @Test public void testEnumDefaultList() throws ArgumentValidationException { final EnumDefaultListOption result = new CliInterfaceImpl<EnumDefaultListOption>(EnumDefaultListOption.class) .parseArguments(new String[] {}); final List<TestEnum> enumValues = result.getName(); assertEquals(2, enumValues.size()); assertEquals(TestEnum.Value0, enumValues.get(0)); assertEquals(TestEnum.Value1, enumValues.get(1)); } }