protected void printCommandUsage(CLI cli) { StringBuilder builder = new StringBuilder(); cli.usage(builder, getCommandLinePrefix()); getPrintStream().println(builder.toString()); }
@Test public void testUsageComputationWhenUsingOnlyLongOption() { final CLI cli = CLI.create("test") .addOption(new Option().setLongName("file").setDescription("a file")); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test [--file <value>]") .contains(" --file <value> a file"); }
@Test public void testOptionsWithChoicesUsingAnnotations() { CLI cli = CLIConfigurator.define(CLIUsingAEnumOption.class); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("[--retention {CLASS, RUNTIME, SOURCE}]") // Usage line .contains(" --retention {CLASS, RUNTIME, SOURCE}"); // options CommandLine line = cli.parse(Arrays.asList("--retention", "CLASS", "--foo", "bar")); assertThat((RetentionPolicy) line.getOptionValue("retention")).isEqualTo(RetentionPolicy.CLASS); try { cli.parse(Collections.singletonList("--retention=nope")); fail("Invalid value expected"); } catch (InvalidValueException e) { // OK } }
@Test public void testUsageWhenNoArgsAndOptions() { final CLI cli = CLI.create("test").setDescription("A simple test command."); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test") .doesNotContain("Options").doesNotContain("Arguments"); }
@Test public void testUsageComputationWhenUsingOnlyShortOption() { final CLI cli = CLI.create("test") .addOption(new Option().setShortName("f").setDescription("a file")); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test [-f <value>]") .contains(" -f <value> a file"); }
@Test public void testUsageComputationWhenUsingOnlyFlagShortOption() { final CLI cli = CLI.create("test") .addOption(new Option().setShortName("f").setDescription("turn on/off").setFlag(true)); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test [-f]") .contains("Options and Arguments") .contains(" -f turn on/off"); }
@Test public void testUsageComputationWhenUsingShortAndLongOption() { final CLI cli = CLI.create("test") .addOption(new Option().setLongName("file").setShortName("f").setDescription("a file")); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test [-f <value>]") .contains(" -f,--file <value> a file"); }
@Test public void testUsageComputationWhenUsingNotRequiredArgument() { final CLI cli = CLI.create("test") .addArgument(new Argument().setArgName("foo").setRequired(false)); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test [foo]"); }
@Test public void testUsageComputationWhenUsingOnlyFlagLongOption() { final CLI cli = CLI.create("test") .addOption(new Option().setLongName("flag").setDescription("turn on/off").setFlag(true)); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test [--flag]") .contains(" --flag turn on/off"); }
@Test public void testUsageComputationWhenUsingShortAndLongFlagOption() { final CLI cli = CLI.create("test") .addOption(new Option().setLongName("flag").setShortName("f").setDescription("turn on/off").setFlag(true)); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test [-f]") .contains(" -f,--flag turn on/off"); }
@Test public void testUsage() { CLI command = CLIConfigurator.define(HelloClI.class); StringBuilder builder = new StringBuilder(); command.usage(builder); assertThat(builder.toString()) .containsIgnoringCase("Usage: hello -n <name>") .containsIgnoringCase("A command saying hello.") .containsIgnoringCase("A simple cli to wish you a good day. Pass your name with `--name`") .containsIgnoringCase(" -n,--name <name> your name"); }
@Test public void testWithOneLongOption() throws CLIException { Option[] options = new Option[]{ new Option().setShortName("f").setLongName("file").setSingleValued(true) }; cli.addOptions(Arrays.asList(options)); CommandLine evaluated = cli.parse(Collections.singletonList("--file=hello.txt")); assertThat(evaluated.cli().getOptions()).hasSize(1); assertThat((String) evaluated.getOptionValue("file")).isEqualTo("hello.txt"); assertThat(evaluated.getOptionValues("f")).containsExactly("hello.txt"); StringBuilder usage = new StringBuilder(); cli.usage(usage); assertThat(usage.toString()).startsWith("Usage: test [-f <value>]"); assertThat(usage.toString()).contains("-f,--file <value>"); }
@Test public void testOptionsWithChoicesUsingEnum() { CLI cli = new DefaultCLI().setName("test"); cli.addOption(new TypedOption<RetentionPolicy>().setLongName("retention").setType(RetentionPolicy.class)); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("[--retention {CLASS, RUNTIME, SOURCE}]") // Usage line .contains(" --retention {CLASS, RUNTIME, SOURCE}"); // options CommandLine line = cli.parse(Arrays.asList("--retention", "CLASS")); assertThat((RetentionPolicy) line.getOptionValue("retention")).isEqualTo(RetentionPolicy.CLASS); try { cli.parse(Collections.singletonList("--retention=nope")); fail("Invalid value expected"); } catch (InvalidValueException e) { // OK } }
@Test public void testWithOneLongOptionUsingSpace() throws CLIException { Option[] options = new Option[]{ new Option().setShortName("f").setLongName("file") .setSingleValued(true) }; cli.addOptions(Arrays.asList(options)); CommandLine evaluated = cli.parse(Arrays.asList("--file", "hello.txt")); assertThat(evaluated.cli().getOptions()).hasSize(1); assertThat((String) evaluated.getOptionValue("file")).isEqualTo("hello.txt"); assertThat(evaluated.getOptionValues("f")).containsExactly("hello.txt"); StringBuilder usage = new StringBuilder(); cli.usage(usage); assertThat(usage.toString()).startsWith("Usage: test [-f <value>]"); }
@Test public void testUsageComputationWhenUsingRequiredOptionAndArgument() { final CLI cli = CLI.create("test") .addOption(new Option().setLongName("file").setShortName("f").setDescription("a file").setRequired(true)) .addArgument(new Argument().setArgName("foo").setDescription("foo").setRequired(true)); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test -f <value> foo") .contains(" -f,--file <value> a file") .contains("<foo> foo"); }
@Test public void testOptionsWithChoices() { CLI cli = new DefaultCLI().setName("test"); cli.addOption(new Option().setLongName("color").addChoice("red").addChoice("blue").addChoice("green")); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("[--color {blue, green, red}]") // Usage line .contains(" --color {blue, green, red}"); // options CommandLine line = cli.parse(Arrays.asList("--color", "blue")); assertThat((String) line.getOptionValue("color")).isEqualTo("blue"); try { cli.parse(Collections.singletonList("--color=black")); fail("Invalid value expected"); } catch (InvalidValueException e) { // OK } }
@Test public void testWithArgumentReceivingMultipleValues() { CLI cli = new DefaultCLI().setName("test"); cli.addArgument(new Argument().setIndex(0).setArgName("arg").setDescription("argument1")); cli.addArgument(new Argument().setIndex(1).setMultiValued(true).setArgName("m").setDescription("multiple arg")); CommandLine cl = cli.parse(Arrays.asList("a", "b", "c")); assertThat((String) cl.getArgumentValue(0)).isEqualTo("a"); assertThat(cl.getArgumentValues(1)).containsExactly("b", "c"); assertThat((String) cl.getArgumentValue(1)).isEqualTo("b"); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()).contains("test arg m..."); }
@Test public void testOptionsWithChoicesAndDefault() { CLI cli = new DefaultCLI().setName("test"); cli.addOption(new Option().setLongName("color").addChoice("red").addChoice("blue").addChoice("green") .setDefaultValue("green")); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("[--color {blue, green, red}]") // Usage line .contains(" --color {blue, green, red}"); // options CommandLine line = cli.parse(Arrays.asList("--color", "blue")); assertThat((String) line.getOptionValue("color")).isEqualTo("blue"); try { cli.parse(Collections.singletonList("--color=black")); fail("Invalid value expected"); } catch (InvalidValueException e) { // OK } line = cli.parse(Collections.emptyList()); assertThat((String) line.getOptionValue("color")).isEqualTo("green"); }
@Test public void testUsageComputationWithSeveralArguments() { final CLI cli = CLI.create("test") .addOption(new Option().setLongName("file").setShortName("f").setDescription("a file").setRequired(true)) .addArgument(new Argument().setIndex(0).setArgName("foo").setDescription("foo")) .addArgument(new Argument().setIndex(1)) .addArgument(new Argument().setIndex(2).setArgName("bar").setDescription("bar")); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test -f <value> foo value bar") .contains(" -f,--file <value> a file") .contains("<foo> foo") .contains("<value>") .contains("<bar> bar"); }
@Test public void testUsageComputationWithHiddenArguments() { final CLI cli = CLI.create("test") .addOption(new Option().setLongName("file").setShortName("f").setDescription("a file").setRequired(true)) .addArgument(new Argument().setIndex(0).setArgName("foo").setDescription("foo")) .addArgument(new Argument().setIndex(1)) .addArgument(new Argument().setIndex(2).setArgName("bar").setDescription("bar").setHidden(true)); StringBuilder builder = new StringBuilder(); cli.usage(builder); assertThat(builder.toString()) .contains("test -f <value> foo value") .contains(" -f,--file <value> a file") .contains("<foo> foo") .contains("<value>") .doesNotContain("bar"); }