package picocli; import org.junit.Test; import picocli.CommandLine.Model.CommandSpec; import picocli.CommandLine.Model.OptionSpec; import picocli.CommandLine.Option; import picocli.CommandLine.Parameters; import java.util.Optional; import static org.junit.Assert.*; /** * This test is located in the `picocli-examples` module because it uses the Java 8 * `java.util.Optional` API. (The main module requires only Java 5.) *

* See https://github.com/remkop/picocli/issues/1108 for background on this feature. *

*/ public class OptionalTest { static class SingleOptions { @Option(names = "-x") Optional x; @Option(names = "-y") Optional y; @Option(names = {"-z", "--long"}, negatable = true) Optional z = Optional.of(Boolean.FALSE); @Parameters(arity = "0..*") Optional positional = Optional.empty(); } @Test public void testTypeInfo() { CommandSpec spec = CommandSpec.forAnnotatedObject(new SingleOptions()); OptionSpec x = spec.findOption("-x"); assertTrue(x.typeInfo().isOptional()); assertEquals(Optional.class, x.typeInfo().getType()); assertEquals(1, x.typeInfo().getAuxiliaryTypes().length); assertEquals(Integer.class, x.typeInfo().getAuxiliaryTypes()[0]); OptionSpec z = spec.findOption("-z"); assertTrue(z.typeInfo().isOptional()); assertEquals(Optional.class, z.typeInfo().getType()); assertEquals(1, z.typeInfo().getAuxiliaryTypes().length); assertEquals(Boolean.class, z.typeInfo().getAuxiliaryTypes()[0]); } @Test public void testOptionalSingleOptions() { SingleOptions bean = CommandLine.populateCommand(new SingleOptions(), "-x=123", "last", "--no-long"); assertEquals(Optional.of(123), bean.x); assertEquals(Optional.empty(), bean.y); assertEquals(Optional.of(false), bean.z); assertEquals(Optional.of("last"), bean.positional); } @Test public void testOptionalSingleOptionNegatable() { SingleOptions bean = CommandLine.populateCommand(new SingleOptions(), "--long"); assertEquals(Optional.empty(), bean.x); assertEquals(Optional.empty(), bean.y); assertEquals(Optional.of(true), bean.z); assertEquals(Optional.empty(), bean.positional); } @Test public void testFallbackNull() { class App { @Option(names = "-x", arity = "0..1", fallbackValue = Option.NULL_VALUE) Optional x; } App appMissing = CommandLine.populateCommand(new App(), "-x"); assertEquals(Optional.empty(), appMissing.x); App appSpecified = CommandLine.populateCommand(new App(), "-x123"); assertEquals(Optional.of(123), appSpecified.x); } @Test public void testDefaultValueNull() { class App { @Option(names = "-x", defaultValue = Option.NULL_VALUE) Optional x; } App appMissing = CommandLine.populateCommand(new App()); assertEquals(Optional.empty(), appMissing.x); App appSpecified = CommandLine.populateCommand(new App(), "-x123"); assertEquals(Optional.of(123), appSpecified.x); } }