diff --git a/doc/index.adoc b/doc/index.adoc index fca904db..d4b88be0 100644 --- a/doc/index.adoc +++ b/doc/index.adoc @@ -989,7 +989,7 @@ class ParameterNamesUsageFormatter implements IUsageFormatter { // Extend other required methods as seen in DefaultUsageFormatter // This is the method which does the actual output formatting - public void usage(StringBuilder out, String indent) { + public void usage(JCommander commander, StringBuilder out, String indent) { if (commander.getDescriptions() == null) { commander.createDescriptions(); } diff --git a/src/main/java/com/beust/jcommander/DefaultUsageFormatter.java b/src/main/java/com/beust/jcommander/DefaultUsageFormatter.java index aa37d7c5..1efdb579 100644 --- a/src/main/java/com/beust/jcommander/DefaultUsageFormatter.java +++ b/src/main/java/com/beust/jcommander/DefaultUsageFormatter.java @@ -27,49 +27,80 @@ * The default usage formatter. */ public class DefaultUsageFormatter implements IUsageFormatter { + public DefaultUsageFormatter() { + } + + /** + * Returns the internationalized version of the string if available, otherwise it returns def. + * @return the internationalized version of the string if available, otherwise it returns def + */ + protected static String getI18nString(ResourceBundle bundle, String key, String def) { + String s = bundle != null ? bundle.getString(key) : null; + return s != null ? s : def; + } + + /** + * Returns count-many spaces. + * @return count-many spaces + */ + protected static String s(int count) { + StringBuilder result = new StringBuilder(); - private final JCommander commander; + for (int i = 0; i < count; i++) { + result.append(" "); + } + return result.toString(); + } - public DefaultUsageFormatter(JCommander commander) { - this.commander = commander; + /** + * Returns new line followed by indent-many spaces. + * @return new line followed by indent-many spaces + */ + private static String newLineAndIndent(int indent) { + return "\n" + s(indent); } /** * Prints the usage to {@link JCommander#getConsole()} on the underlying commander instance. */ - public final void usage(String commandName) { + @Override + public final void usage(JCommander commander, String commandName) { StringBuilder sb = new StringBuilder(); - usage(commandName, sb); + usage(commander, commandName, sb); commander.getConsole().println(sb.toString()); } /** * Store the usage for the argument command in the argument string builder. */ - public final void usage(String commandName, StringBuilder out) { - usage(commandName, out, ""); + @Override + public final void usage(JCommander commander, String commandName, StringBuilder out) { + usage(commander, commandName, out, ""); } /** * Store the usage in the argument string builder. */ - public final void usage(StringBuilder out) { - usage(out, ""); + @Override + public final void usage(JCommander commander, StringBuilder out) { + usage(commander, out, ""); } /** * Store the usage for the command in the argument string builder, indenting every line with the * value of indent. */ - public final void usage(String commandName, StringBuilder out, String indent) { - String description = getCommandDescription(commandName); + @Override + public final void usage( + JCommander commander, String commandName, StringBuilder out, String indent) { + String description = getCommandDescription(commander, commandName); JCommander jc = commander.findCommandByAlias(commandName); if (description != null) { out.append(indent).append(description); out.append("\n"); } - jc.getUsageFormatter().usage(out, indent); + usage(jc, out, indent); } /** @@ -78,12 +109,13 @@ public final void usage(String commandName, StringBuilder out, String indent) { * subclass of this class. * * */ - public void usage(StringBuilder out, String indent) { + @Override + public void usage(JCommander commander, StringBuilder out, String indent) { if (commander.getDescriptions() == null) { commander.createDescriptions(); } @@ -95,7 +127,7 @@ public void usage(StringBuilder out, String indent) { final int indentCount = indent.length() + descriptionIndent; // Append first line (aka main line) of the usage - appendMainLine(out, hasOptions, hasCommands, indentCount, indent); + appendMainLine(commander, out, hasOptions, hasCommands, indentCount, indent); // Align the descriptions at the "longestName" column int longestName = 0; @@ -117,28 +149,30 @@ public void usage(StringBuilder out, String indent) { sortedParameters.sort(commander.getParameterDescriptionComparator()); // Append all the parameter names and descriptions - appendAllParametersDetails(out, indentCount, indent, sortedParameters); + appendAllParametersDetails(commander, out, indentCount, indent, sortedParameters); // Append commands if they were specified if (hasCommands) { - appendCommands(out, indentCount, descriptionIndent, indent); + appendCommands(commander, out, indentCount, descriptionIndent, indent); } } /** * Appends the main line segment of the usage to the argument string builder, indenting every * line with indentCount-many indent. - * + * @param commander the commander * @param out the builder to append to * @param hasOptions if the options section should be appended * @param hasCommands if the comments section should be appended * @param indentCount the amount of indentation to apply * @param indent the indentation */ - public void appendMainLine(StringBuilder out, boolean hasOptions, boolean hasCommands, int indentCount, - String indent) { + protected void appendMainLine( + JCommander commander, StringBuilder out, boolean hasOptions, boolean hasCommands, + int indentCount, + String indent) { String programName = commander.getProgramDisplayName() != null - ? commander.getProgramDisplayName() : "
"; + ? commander.getProgramDisplayName() : "
"; StringBuilder mainLine = new StringBuilder(); mainLine.append(indent).append("Usage: ").append(programName); @@ -150,24 +184,27 @@ public void appendMainLine(StringBuilder out, boolean hasOptions, boolean hasCom mainLine.append(indent).append(" [command] [command options]"); } - if (commander.getMainParameter() != null && commander.getMainParameter().getDescription() != null) { - mainLine.append(" ").append(commander.getMainParameter().getDescription().getDescription()); + if (commander.getMainParameter() != null + && commander.getMainParameter().getDescription() != null) { + mainLine.append(" ") + .append(commander.getMainParameter().getDescription().getDescription()); } - wrapDescription(out, indentCount, mainLine.toString()); + wrapDescription(commander, out, indentCount, mainLine.toString()); out.append("\n"); } /** * Appends the details of all parameters in the given order to the argument string builder, indenting every * line with indentCount-many indent. - * + * @param commander the commander * @param out the builder to append to * @param indentCount the amount of indentation to apply * @param indent the indentation * @param sortedParameters the parameters to append to the builder */ - public void appendAllParametersDetails(StringBuilder out, int indentCount, String indent, - List sortedParameters) { + protected void appendAllParametersDetails( + JCommander commander, StringBuilder out, int indentCount, String indent, + List sortedParameters) { if (sortedParameters.size() > 0) { out.append(indent).append(" Options:\n"); } @@ -179,18 +216,19 @@ public void appendAllParametersDetails(StringBuilder out, int indentCount, Strin // First line, command name out.append(indent) - .append(" ") - .append(parameter.required() ? "* " : " ") - .append(pd.getNames()) - .append("\n"); + .append(" ") + .append(parameter.required() ? "* " : " ") + .append(pd.getNames()) + .append("\n"); if (hasDescription) { - wrapDescription(out, indentCount, s(indentCount) + description); + wrapDescription(commander, out, indentCount, s(indentCount) + description); } Object def = pd.getDefault(); if (pd.isDynamicParameter()) { - String syntax = "Syntax: " + parameter.names()[0] + "key" + parameter.getAssignment() + "value"; + String syntax = + "Syntax: " + parameter.names()[0] + "key" + parameter.getAssignment() + "value"; if (hasDescription) { out.append(newLineAndIndent(indentCount)); @@ -201,7 +239,8 @@ public void appendAllParametersDetails(StringBuilder out, int indentCount, Strin } if (def != null && !pd.isHelp()) { - String displayedDef = Strings.isStringEmpty(def.toString()) ? "" : def.toString(); + String displayedDef = + Strings.isStringEmpty(def.toString()) ? "" : def.toString(); String defaultText = "Default: " + (parameter.password() ? "********" : displayedDef); if (hasDescription) { @@ -237,30 +276,34 @@ public void appendAllParametersDetails(StringBuilder out, int indentCount, Strin * indentCount-many indent. The commands are obtained from calling * {@link JCommander#getRawCommands()} and the commands are resolved using * {@link JCommander#findCommandByAlias(String)} on the underlying commander instance. - * + * @param commander the commander * @param out the builder to append to * @param indentCount the amount of indentation to apply * @param descriptionIndent the indentation for the description * @param indent the indentation */ - public void appendCommands(StringBuilder out, int indentCount, int descriptionIndent, String indent) { + protected void appendCommands( + JCommander commander, StringBuilder out, int indentCount, int descriptionIndent, + String indent) { out.append(indent + " Commands:\n"); // The magic value 3 is the number of spaces between the name of the option and its description - for (Map.Entry commands : commander.getRawCommands().entrySet()) { + for (Map.Entry commands : commander.getRawCommands() + .entrySet()) { Object arg = commands.getValue().getObjects().get(0); Parameters p = arg.getClass().getAnnotation(Parameters.class); if (p == null || !p.hidden()) { JCommander.ProgramName progName = commands.getKey(); String dispName = progName.getDisplayName(); - String description = indent + s(4) + dispName + s(6) + getCommandDescription(progName.getName()); - wrapDescription(out, indentCount + descriptionIndent, description); + String description = indent + s(4) + dispName + s(6) + getCommandDescription(commander, + progName.getName()); + wrapDescription(commander, out, indentCount + descriptionIndent, description); out.append("\n"); // Options for this command JCommander jc = commander.findCommandByAlias(progName.getName()); - jc.getUsageFormatter().usage(out, indent + s(6)); + usage(jc, out, indent + s(6)); out.append("\n"); } } @@ -270,11 +313,12 @@ public void appendCommands(StringBuilder out, int indentCount, int descriptionIn * Returns the description of the command corresponding to the argument command name. The commands are resolved * by calling {@link JCommander#findCommandByAlias(String)}, and the default resource bundle used from * {@link JCommander#getBundle()} on the underlying commander instance. - * + * @param commander the commander * @param commandName the name of the command to get the description for * @return the description of the command. */ - public String getCommandDescription(String commandName) { + @Override + public String getCommandDescription(JCommander commander, String commandName) { JCommander jc = commander.findCommandByAlias(commandName); if (jc == null) { @@ -309,15 +353,17 @@ public String getCommandDescription(String commandName) { /** * Wrap a potentially long line to the value obtained by calling {@link JCommander#getColumnSize()} on the * underlying commander instance. - * - * @param out the output - * @param indent the indentation in spaces for lines after the first line. + * @param commander the commander + * @param out the output + * @param indent the indentation in spaces for lines after the first line. * @param currentLineIndent the length of the indentation of the initial line - * @param description the text to wrap. No extra spaces are inserted before {@code - * description}. If the first line needs to be indented prepend the - * correct number of spaces to {@code description}. + * @param description the text to wrap. No extra spaces are inserted before {@code + * description}. If the first line needs to be indented prepend the + * correct number of spaces to {@code description}. */ - public void wrapDescription(StringBuilder out, int indent, int currentLineIndent, String description) { + protected void wrapDescription( + JCommander commander, StringBuilder out, int indent, int currentLineIndent, + String description) { int max = commander.getColumnSize(); String[] words = description.split(" "); int current = currentLineIndent; @@ -341,49 +387,17 @@ public void wrapDescription(StringBuilder out, int indent, int currentLineIndent } /** - * Wrap a potentially long line to {@link #commander#getColumnSize()}. - * - * @param out the output - * @param indent the indentation in spaces for lines after the first line. + * Wrap a potentially long line to {@link JCommander#getColumnSize()}. + * @param commander the commander + * @param out the output + * @param indent the indentation in spaces for lines after the first line. * @param description the text to wrap. No extra spaces are inserted before {@code - * description}. If the first line needs to be indented prepend the - * correct number of spaces to {@code description}. - * @see #wrapDescription(StringBuilder, int, int, String) - */ - public void wrapDescription(StringBuilder out, int indent, String description) { - wrapDescription(out, indent, 0, description); - } - - /** - * Returns the internationalized version of the string if available, otherwise it returns def. - * - * @return the internationalized version of the string if available, otherwise it returns def - */ - public static String getI18nString(ResourceBundle bundle, String key, String def) { - String s = bundle != null ? bundle.getString(key) : null; - return s != null ? s : def; - } - - /** - * Returns count-many spaces. - * - * @return count-many spaces - */ - public static String s(int count) { - StringBuilder result = new StringBuilder(); - - for (int i = 0; i < count; i++) { - result.append(" "); - } - return result.toString(); - } - - /** - * Returns new line followed by indent-many spaces. - * - * @return new line followed by indent-many spaces + * description}. If the first line needs to be indented prepend the + * correct number of spaces to {@code description}. + * @see #wrapDescription(JCommander, StringBuilder, int, int, String) */ - private static String newLineAndIndent(int indent) { - return "\n" + s(indent); + protected void wrapDescription( + JCommander commander, StringBuilder out, int indent, String description) { + wrapDescription(commander, out, indent, 0, description); } } diff --git a/src/main/java/com/beust/jcommander/IUsageFormatter.java b/src/main/java/com/beust/jcommander/IUsageFormatter.java index 1171a1e8..3d9a8a2c 100644 --- a/src/main/java/com/beust/jcommander/IUsageFormatter.java +++ b/src/main/java/com/beust/jcommander/IUsageFormatter.java @@ -26,30 +26,30 @@ public interface IUsageFormatter { /** * Display the usage for this command. */ - void usage(String commandName); + void usage(JCommander commander, String commandName); /** * Store the help for the command in the passed string builder. */ - void usage(String commandName, StringBuilder out); + void usage(JCommander commander, String commandName, StringBuilder out); /** * Store the help in the passed string builder. */ - void usage(StringBuilder out); + void usage(JCommander commander, StringBuilder out); /** * Store the help for the command in the passed string builder, indenting every line with "indent". */ - void usage(String commandName, StringBuilder out, String indent); + void usage(JCommander commander, String commandName, StringBuilder out, String indent); /** * Stores the help in the passed string builder, with the argument indentation. */ - void usage(StringBuilder out, String indent); + void usage(JCommander commander, StringBuilder out, String indent); /** * @return the description of the argument command */ - String getCommandDescription(String commandName); + String getCommandDescription(JCommander commander, String commandName); } diff --git a/src/main/java/com/beust/jcommander/JCommander.java b/src/main/java/com/beust/jcommander/JCommander.java index b06ad144..d88189f0 100644 --- a/src/main/java/com/beust/jcommander/JCommander.java +++ b/src/main/java/com/beust/jcommander/JCommander.java @@ -110,7 +110,7 @@ public void addValue(Object convertedValue) { /** * The usage formatter to use in {@link #usage()}. */ - private IUsageFormatter usageFormatter = new DefaultUsageFormatter(this); + private IUsageFormatter usageFormatter = new DefaultUsageFormatter(); private MainParameter mainParameter = null; @@ -1020,12 +1020,42 @@ public void setProgramName(String name, String... aliases) { */ public void usage() { StringBuilder sb = new StringBuilder(); - usageFormatter.usage(sb); + usageFormatter.usage(this, sb); getConsole().println(sb.toString()); } /** - * Sets the usage formatter. + * Prints the usage to given {@link StringBuilder} using the underlying {@link #usageFormatter} + * @param sb {@link StringBuilder} to append + */ + void usage(StringBuilder sb) { + // package access, for tests + usageFormatter.usage(this, sb); + } + + /** + * Prints the usage of subcommand on {@link #getConsole()} using the underlying {@link #usageFormatter}. + */ + public void usage(String commandName) { + StringBuilder sb = new StringBuilder(); + usageFormatter.usage(this, commandName, sb); + getConsole().println(sb.toString()); + } + + void usage(String commandName, StringBuilder sb) { + // package access, for tests + usageFormatter.usage(this, commandName, sb); + } + + /** + * @return Get the description of the argument command using the underlying {@link #usageFormatter} + */ + public String getCommandDescription(String commandName) { + return usageFormatter.getCommandDescription(this, commandName); + } + + /** + * Sets the usage formatter. This will set usage formatter for all subcommands recursively. * * @param usageFormatter the usage formatter * @throws IllegalArgumentException if the argument is null @@ -1034,6 +1064,9 @@ public void setUsageFormatter(IUsageFormatter usageFormatter) { if (usageFormatter == null) throw new IllegalArgumentException("Argument UsageFormatter must not be null"); this.usageFormatter = usageFormatter; + for (Map.Entry entry : commands.entrySet()) { + entry.getValue().setUsageFormatter(usageFormatter); + } } /** @@ -1393,6 +1426,7 @@ public void addCommand(String name, Object object, String... aliases) { jc.addObject(object); jc.createDescriptions(); jc.setProgramName(name, aliases); + jc.setUsageFormatter(usageFormatter); ProgramName progName = jc.programName; commands.put(progName, jc); diff --git a/src/main/java/com/beust/jcommander/UnixStyleUsageFormatter.java b/src/main/java/com/beust/jcommander/UnixStyleUsageFormatter.java index 03d10f8b..13dcf7f0 100644 --- a/src/main/java/com/beust/jcommander/UnixStyleUsageFormatter.java +++ b/src/main/java/com/beust/jcommander/UnixStyleUsageFormatter.java @@ -23,26 +23,26 @@ /** * A unix-style usage formatter. This works by overriding and modifying the output of - * {@link #appendAllParametersDetails(StringBuilder, int, String, List)} which is inherited from + * {@link #appendAllParametersDetails(JCommander, StringBuilder, int, String, List)} which is inherited from * {@link DefaultUsageFormatter}. */ public class UnixStyleUsageFormatter extends DefaultUsageFormatter { - public UnixStyleUsageFormatter(JCommander commander) { - super(commander); - } + public UnixStyleUsageFormatter() { } /** * Appends the details of all parameters in the given order to the argument string builder, indenting every * line with indentCount-many indent. * + * @param commander the commander * @param out the builder to append to * @param indentCount the amount of indentation to apply * @param indent the indentation * @param sortedParameters the parameters to append to the builder */ - public void appendAllParametersDetails(StringBuilder out, int indentCount, String indent, - List sortedParameters) { + @Override + protected void appendAllParametersDetails(JCommander commander, StringBuilder out, int indentCount, String indent, + List sortedParameters) { if (sortedParameters.size() > 0) { out.append(indent).append(" Options:\n"); } @@ -101,7 +101,7 @@ public void appendAllParametersDetails(StringBuilder out, int indentCount, Strin // Append description // The magic value 3 is the number of spaces between the name of the option and its description // in DefaultUsageFormatter#appendCommands(..) - wrapDescription(out, indentCount + prefixIndent - 3, initialLinePrefixLength, description); + wrapDescription(commander, out, indentCount + prefixIndent - 3, initialLinePrefixLength, description); out.append("\n"); } } diff --git a/src/test/java/com/beust/jcommander/DefaultUsageFormatterTest.java b/src/test/java/com/beust/jcommander/DefaultUsageFormatterTest.java index 07302c50..cb95aa66 100644 --- a/src/test/java/com/beust/jcommander/DefaultUsageFormatterTest.java +++ b/src/test/java/com/beust/jcommander/DefaultUsageFormatterTest.java @@ -60,7 +60,7 @@ class ArgsTemplate { .build(); // action - jc.getUsageFormatter().usage(sb); + jc.usage(sb); // verify String expected = "Usage:
[options]\n" @@ -104,7 +104,7 @@ public void testLongMainParameterDescription() { StringBuilder sb = new StringBuilder(); //action - jc.getUsageFormatter().usage(sb); + jc.usage(sb); //verify for (String line : sb.toString().split("\n")) { @@ -121,7 +121,7 @@ public void testLongCommandDescription() throws Exception { StringBuilder sb = new StringBuilder(); //action - jc.getUsageFormatter().usage(sb); + jc.usage(sb); //verify for (String line : sb.toString().split("\n")) { @@ -138,7 +138,7 @@ public void testDescriptionWrappingLongWord() { .build(); //action - jc.getUsageFormatter().usage(sb); + jc.usage(sb); //verify for (String line : sb.toString().split("\n")) { @@ -152,7 +152,7 @@ public void programName() { String programName = "main"; jcommander.setProgramName(programName); StringBuilder sb = new StringBuilder(); - jcommander.getUsageFormatter().usage(sb); + jcommander.usage(sb); Assert.assertTrue(sb.toString().contains(programName)); Assert.assertEquals(jcommander.getProgramName(), programName); @@ -171,7 +171,7 @@ class CommandTemplate { .build(); jcommander.setProgramName("main"); StringBuilder sb = new StringBuilder(); - jcommander.getUsageFormatter().usage(sb); + jcommander.usage(sb); Assert.assertEquals(sb.toString().indexOf("options"), -1); } @@ -188,7 +188,7 @@ class DSimple { JCommander jc = JCommander.newBuilder() .addObject(new DSimple()) .build(); - jc.getUsageFormatter().usage(new StringBuilder()); + jc.usage(new StringBuilder()); } /** @@ -199,7 +199,7 @@ public void nonexistentCommandShouldThrow() { String[] argv = {}; JCommander jc = JCommander.newBuilder().addObject(new Object()).build(); jc.parse(argv); - jc.getUsageFormatter().getCommandDescription("foo"); + jc.getCommandDescription("foo"); } @Test @@ -210,7 +210,7 @@ public void i18MissingKeyForCommand() { .build(); jc.addCommand(new ArgsLongCommandDescription()); StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); String usage = sb.toString(); Assert.assertTrue(usage.contains("text")); } @@ -220,7 +220,7 @@ public void noParseConstructor() { JCommander jCommander = JCommander.newBuilder() .addObject(new ArgsMainParameter1()) .build(); - jCommander.getUsageFormatter().usage(new StringBuilder()); + jCommander.usage(new StringBuilder()); // Before fix, this parse would throw an exception, because it calls createDescription, which // was already called by usage(), and can only be called once. jCommander.parse(); @@ -238,7 +238,7 @@ public void usageWithRequiredArgsAndResourceBundle() { .resourceBundle(getResourceBundle()) .build(); // Should be able to display usage without triggering validation - jc.getUsageFormatter().usage(new StringBuilder()); + jc.usage(new StringBuilder()); try { jc.parse("-h"); Assert.fail("Should have thrown a required parameter exception"); @@ -253,11 +253,11 @@ public void usageShouldNotChange() { JCommander jc = JCommander.newBuilder().addObject(new Args1()).build(); jc.parse("-log", "1"); StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); String expected = sb.toString(); sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); String actual = sb.toString(); Assert.assertEquals(actual, expected); } @@ -267,7 +267,7 @@ public void oom() { JCommander jc = JCommander.newBuilder() .addObject(new ArgsOutOfMemory()) .build(); - jc.getUsageFormatter().usage(new StringBuilder()); + jc.usage(new StringBuilder()); } @Test @@ -283,7 +283,7 @@ class Arg { StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); Assert.assertFalse(sb.toString().contains("Default")); } @@ -312,7 +312,7 @@ class ArgCommandB { c.addCommand("b", new ArgCommandB()); StringBuilder sb = new StringBuilder(); - c.getUsageFormatter().usage(sb); + c.usage(sb); Assert.assertTrue(sb.toString().contains("[command options]\n Commands:")); } @@ -340,7 +340,7 @@ class ArgCommandB { c.addCommand("b", new ArgCommandB()); StringBuilder sb = new StringBuilder(); - c.getUsageFormatter().usage(sb); + c.usage(sb); Assert.assertTrue(sb.toString().contains("command a parameters\n\n b")); } @@ -372,7 +372,7 @@ class ArgCommandB { aCommand.addCommand("b", new ArgCommandB()); StringBuilder sb = new StringBuilder(); - c.getUsageFormatter().usage(sb); + c.usage(sb); Assert.assertTrue(sb.toString().contains("command a parameters\n Commands:")); Assert.assertTrue(sb.toString().contains("command b\n Usage:")); } @@ -388,7 +388,7 @@ class Arg { JCommander c = JCommander.newBuilder() .addObject(a) .build(); - c.getUsageFormatter().usage(sb); + c.usage(sb); Assert.assertTrue(sb.toString().contains("Default: ")); } } diff --git a/src/test/java/com/beust/jcommander/ParameterOrderTest.java b/src/test/java/com/beust/jcommander/ParameterOrderTest.java index 73f1d76a..4d088a82 100644 --- a/src/test/java/com/beust/jcommander/ParameterOrderTest.java +++ b/src/test/java/com/beust/jcommander/ParameterOrderTest.java @@ -61,7 +61,7 @@ public void testOrder(Object cmd, String ... expected) { JCommander commander = new JCommander(cmd); StringBuilder out = new StringBuilder(); - commander.getUsageFormatter().usage(out); + commander.usage(out); String output = out.toString(); List order = new ArrayList<>(); for (String line : output.split("[\\n\\r]+")) { diff --git a/src/test/java/com/beust/jcommander/UnixStyleUsageFormatterTest.java b/src/test/java/com/beust/jcommander/UnixStyleUsageFormatterTest.java index 31d55ee4..63766997 100644 --- a/src/test/java/com/beust/jcommander/UnixStyleUsageFormatterTest.java +++ b/src/test/java/com/beust/jcommander/UnixStyleUsageFormatterTest.java @@ -49,10 +49,10 @@ class ArgsTemplate { JCommander jc = JCommander.newBuilder() .addObject(new ArgsTemplate()) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); // action - jc.getUsageFormatter().usage(sb); + jc.usage(sb); // verify String expected = "Usage:
[options]\n" @@ -76,11 +76,11 @@ public void testLongMainParameterDescription() { JCommander jc = JCommander.newBuilder() .addObject(new ArgsLongMainParameterDescription()) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); StringBuilder sb = new StringBuilder(); //action - jc.getUsageFormatter().usage(sb); + jc.usage(sb); //verify for (String line : sb.toString().split("\n")) { @@ -94,11 +94,11 @@ public void testLongCommandDescription() throws Exception { JCommander jc = JCommander.newBuilder() .addCommand(new ArgsLongCommandDescription()) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); StringBuilder sb = new StringBuilder(); //action - jc.getUsageFormatter().usage(sb); + jc.usage(sb); //verify for (String line : sb.toString().split("\n")) { @@ -113,10 +113,10 @@ public void testDescriptionWrappingLongWord() { final JCommander jc = JCommander.newBuilder() .addObject(new ArgsLongDescription()) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); //action - jc.getUsageFormatter().usage(sb); + jc.usage(sb); //verify for (String line : sb.toString().split("\n")) { @@ -127,11 +127,11 @@ public void testDescriptionWrappingLongWord() { @Test public void programName() { JCommander jcommander = new JCommander(); - jcommander.setUsageFormatter(new UnixStyleUsageFormatter(jcommander)); + jcommander.setUsageFormatter(new UnixStyleUsageFormatter()); String programName = "main"; jcommander.setProgramName(programName); StringBuilder sb = new StringBuilder(); - jcommander.getUsageFormatter().usage(sb); + jcommander.usage(sb); Assert.assertTrue(sb.toString().contains(programName)); Assert.assertEquals(jcommander.getProgramName(), programName); @@ -148,10 +148,10 @@ class CommandTemplate { JCommander jcommander = JCommander.newBuilder() .addObject(template) .build(); - jcommander.setUsageFormatter(new UnixStyleUsageFormatter(jcommander)); + jcommander.setUsageFormatter(new UnixStyleUsageFormatter()); jcommander.setProgramName("main"); StringBuilder sb = new StringBuilder(); - jcommander.getUsageFormatter().usage(sb); + jcommander.usage(sb); Assert.assertEquals(sb.toString().indexOf("options"), -1); } @@ -168,8 +168,8 @@ class DSimple { JCommander jc = JCommander.newBuilder() .addObject(new DSimple()) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); - jc.getUsageFormatter().usage(new StringBuilder()); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); + jc.usage(new StringBuilder()); } /** @@ -179,9 +179,9 @@ class DSimple { public void nonexistentCommandShouldThrow() { String[] argv = {}; JCommander jc = JCommander.newBuilder().addObject(new Object()).build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); jc.parse(argv); - jc.getUsageFormatter().getCommandDescription("foo"); + jc.getCommandDescription("foo"); } @Test @@ -190,10 +190,10 @@ public void i18MissingKeyForCommand() { .addObject(new ArgsHelp()) .resourceBundle(DefaultUsageFormatterTest.getResourceBundle()) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); jc.addCommand(new ArgsLongCommandDescription()); StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); String usage = sb.toString(); Assert.assertTrue(usage.contains("text")); } @@ -203,8 +203,8 @@ public void noParseConstructor() { JCommander jCommander = JCommander.newBuilder() .addObject(new ArgsMainParameter1()) .build(); - jCommander.setUsageFormatter(new UnixStyleUsageFormatter(jCommander)); - jCommander.getUsageFormatter().usage(new StringBuilder()); + jCommander.setUsageFormatter(new UnixStyleUsageFormatter()); + jCommander.usage(new StringBuilder()); // Before fix, this parse would throw an exception, because it calls createDescription, which // was already called by usage(), and can only be called once. jCommander.parse(); @@ -221,9 +221,9 @@ public void usageWithRequiredArgsAndResourceBundle() { .addObject(new Object[] {argsHelp, new ArgsRequired()}) .resourceBundle(DefaultUsageFormatterTest.getResourceBundle()) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); // Should be able to display usage without triggering validation - jc.getUsageFormatter().usage(new StringBuilder()); + jc.usage(new StringBuilder()); try { jc.parse("-h"); Assert.fail("Should have thrown a required parameter exception"); @@ -236,14 +236,14 @@ public void usageWithRequiredArgsAndResourceBundle() { @Test public void usageShouldNotChange() { JCommander jc = JCommander.newBuilder().addObject(new Args1()).build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); jc.parse("-log", "1"); StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); String expected = sb.toString(); sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); String actual = sb.toString(); Assert.assertEquals(actual, expected); } @@ -253,8 +253,8 @@ public void oom() { JCommander jc = JCommander.newBuilder() .addObject(new ArgsOutOfMemory()) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); - jc.getUsageFormatter().usage(new StringBuilder()); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); + jc.usage(new StringBuilder()); } @Test @@ -266,12 +266,12 @@ class Arg { Arg args = new Arg(); String[] argv = {"--help"}; JCommander jc = JCommander.newBuilder().addObject(args).build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); jc.parse(argv); StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); Assert.assertFalse(sb.toString().contains("Default")); } @@ -296,12 +296,12 @@ class ArgCommandB { JCommander jc = JCommander.newBuilder() .addObject(a) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); jc.addCommand("a", new ArgCommandA()); jc.addCommand("b", new ArgCommandB()); StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); Assert.assertTrue(sb.toString().contains("[command options]\n Commands:")); } @@ -325,12 +325,12 @@ class ArgCommandB { JCommander jc = JCommander.newBuilder() .addObject(a) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); jc.addCommand("a", new ArgCommandA()); jc.addCommand("b", new ArgCommandB()); StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); Assert.assertTrue(sb.toString().contains("command a parameters\n\n b")); } @@ -354,7 +354,7 @@ class ArgCommandB { JCommander jc = JCommander.newBuilder() .addObject(a) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); jc.setColumnSize(100); jc.addCommand("a", new ArgCommandA()); @@ -363,7 +363,7 @@ class ArgCommandB { aCommand.addCommand("b", new ArgCommandB()); StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.usage(sb); Assert.assertTrue(sb.toString().contains("command a parameters\n Commands:")); Assert.assertTrue(sb.toString().contains("command b\n Usage:")); } @@ -379,8 +379,8 @@ class Arg { JCommander jc = JCommander.newBuilder() .addObject(a) .build(); - jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); - jc.getUsageFormatter().usage(sb); + jc.setUsageFormatter(new UnixStyleUsageFormatter()); + jc.usage(sb); Assert.assertTrue(sb.toString().contains("default: ")); } } diff --git a/src/test/java/com/beust/jcommander/command/CommandAliasTest.java b/src/test/java/com/beust/jcommander/command/CommandAliasTest.java index 631097cd..9d3073c2 100644 --- a/src/test/java/com/beust/jcommander/command/CommandAliasTest.java +++ b/src/test/java/com/beust/jcommander/command/CommandAliasTest.java @@ -119,15 +119,15 @@ public void usageCanBeRetrievedWithBothCommandAndAlias() { CommandCommit commit = new CommandCommit(); jc.addCommand("commit", commit, "ci", "cmt"); StringBuilder out = new StringBuilder(); - jc.getUsageFormatter().usage("commit", out); + jc.getUsageFormatter().usage(jc, "commit", out); patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 1); out = new StringBuilder(); - jc.getUsageFormatter().usage("ci", out); + jc.getUsageFormatter().usage(jc, "ci", out); patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 1); out = new StringBuilder(); - jc.getUsageFormatter().usage("cmt", out); + jc.getUsageFormatter().usage(jc, "cmt", out); patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 1); } @@ -138,7 +138,7 @@ public void usageDisplaysCommandWithAliasesOnlyOnce() { CommandCommit commit = new CommandCommit(); jc.addCommand("commit", commit, "ci", "cmt"); StringBuilder out = new StringBuilder(); - jc.getUsageFormatter().usage(out); + jc.getUsageFormatter().usage(jc, out); // The usage should display this string twice: one as the command name // and one after Usage: patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 2); @@ -156,12 +156,12 @@ public void formattingLooksNice(){ CommandCommit commit = new CommandCommit(); jc.addCommand("commit", commit, "ci", "cmt"); StringBuilder sb = new StringBuilder(); - jc.getUsageFormatter().usage(sb); + jc.getUsageFormatter().usage(jc, sb); System.out.println("--- usage() formatting ---"); System.out.println(sb.toString()); sb = new StringBuilder(); - jc.getUsageFormatter().usage("commit", sb); + jc.getUsageFormatter().usage(jc, "commit", sb); System.out.println("--- usage('commit') formatting ---"); System.out.println(sb.toString()); } diff --git a/src/test/java/com/beust/jcommander/command/CommandTest.java b/src/test/java/com/beust/jcommander/command/CommandTest.java index a625bc5c..18fc2799 100644 --- a/src/test/java/com/beust/jcommander/command/CommandTest.java +++ b/src/test/java/com/beust/jcommander/command/CommandTest.java @@ -99,7 +99,7 @@ public void hiddenCommandTest() { jc.setProgramName("TestCommander"); StringBuilder out = new StringBuilder(); - jc.getUsageFormatter().usage(out); + jc.getUsageFormatter().usage(jc, out); Assert.assertTrue(out.toString().contains("add Add file contents to the index")); Assert.assertFalse(out.toString().contains("hidden Hidden command to add file contents to the index")); @@ -114,7 +114,7 @@ public void noParametersAnnotationOnCommandTest() { jc.setProgramName("TestCommander"); StringBuilder out = new StringBuilder(); - jc.getUsageFormatter().usage(out); + jc.getUsageFormatter().usage(jc, out); Assert.assertTrue(out.toString().contains("no-annotation")); } @@ -129,7 +129,7 @@ public void noTrailingSpaceInUsageTest() { jc.addCommand("commit", commit); jc.parse("-v", "commit", "--amend", "--author=cbeust", "A.java", "B.java"); StringBuilder out = new StringBuilder(); - jc.getUsageFormatter().usage(out); + jc.getUsageFormatter().usage(jc, out); String firstLine = out.toString().split("\n")[0]; Assert.assertFalse(firstLine.endsWith(" "), "Usage should not have trailing spaces"); } diff --git a/src/test/java/com/beust/jcommander/dynamic/DynamicParameterTest.java b/src/test/java/com/beust/jcommander/dynamic/DynamicParameterTest.java index 7d8e8e6c..3f305adc 100644 --- a/src/test/java/com/beust/jcommander/dynamic/DynamicParameterTest.java +++ b/src/test/java/com/beust/jcommander/dynamic/DynamicParameterTest.java @@ -40,7 +40,7 @@ public void usage() { JCommander jc = JCommander.newBuilder() .addObject(ds) .build(); - jc.getUsageFormatter().usage(new StringBuilder()); + jc.getUsageFormatter().usage(jc, new StringBuilder()); } public void differentAssignment() {