diff --git a/src/main/java/org/apache/commons/cli/help/TextStyle.java b/src/main/java/org/apache/commons/cli/help/TextStyle.java
index fef720f34..02346daae 100644
--- a/src/main/java/org/apache/commons/cli/help/TextStyle.java
+++ b/src/main/java/org/apache/commons/cli/help/TextStyle.java
@@ -369,7 +369,7 @@ public CharSequence pad(final boolean addIndent, final CharSequence text) {
rest = "";
} else {
int restLen = maxWidth - text.length();
- if (addIndent && restLen > indent) {
+ if (addIndent && restLen >= indent) {
indentPad = Util.repeatSpace(indent);
restLen -= indent;
} else {
diff --git a/src/test/java/org/apache/commons/cli/help/HelpFormatterTest.java b/src/test/java/org/apache/commons/cli/help/HelpFormatterTest.java
index 04041f644..e7b995bca 100644
--- a/src/test/java/org/apache/commons/cli/help/HelpFormatterTest.java
+++ b/src/test/java/org/apache/commons/cli/help/HelpFormatterTest.java
@@ -340,6 +340,39 @@ void testPrintOptions() throws IOException {
assertEquals(expected, actual);
}
+ /**
+ * Continuation description lines must share the same indent.
+ *
+ * @see [CLI-354] HelpFormatter: Description indentation is incorrect
+ */
+ @Test
+ void testPrintHelpWrappedDescriptionIndent() throws IOException {
+ final StringBuilder sb = new StringBuilder();
+ final TextHelpAppendable serializer = new TextHelpAppendable(sb);
+ final HelpFormatter formatter = HelpFormatter.builder().setHelpAppendable(serializer).setShowSince(false).get();
+ final String description = "an argument passed to the remote command. The value will be wrapped in double quotes "
+ + "and appended to the command-line. This option can be added multiple times.";
+ final Options options = new Options().addOption(Option.builder("V").longOpt("argument-value").hasArg().desc(description).get());
+
+ final List expected = new ArrayList<>();
+ expected.add(" usage: cs [-V ]");
+ expected.add("");
+ expected.add(" header");
+ expected.add("");
+ expected.add(" Options Description ");
+ expected.add(" -V, --argument-value an argument passed to the remote command. ");
+ expected.add(" The value will be wrapped in double quotes");
+ expected.add(" and appended to the command-line. This ");
+ expected.add(" option can be added multiple times. ");
+ expected.add("");
+ expected.add(" footer");
+ expected.add("");
+
+ formatter.printHelp("cs", "header", options, "footer", true);
+ final List actual = IOUtils.readLines(new StringReader(sb.toString()));
+ assertEquals(expected, actual);
+ }
+
@Test
void testSetOptionFormatBuilderTest() {
final HelpFormatter.Builder underTest = HelpFormatter.builder();
diff --git a/src/test/java/org/apache/commons/cli/help/TextStyleTest.java b/src/test/java/org/apache/commons/cli/help/TextStyleTest.java
index b3e946278..2f18ae3ba 100644
--- a/src/test/java/org/apache/commons/cli/help/TextStyleTest.java
+++ b/src/test/java/org/apache/commons/cli/help/TextStyleTest.java
@@ -71,6 +71,17 @@ static Stream padTestData() {
builder.setAlignment(TextStyle.Alignment.CENTER);
lst.add(Arguments.of(builder.get(), " Hello world ", " Hello world "));
+ // width equal to text length + indent applies indent on continuation lines
+ builder.setMaxWidth(16);
+ builder.setAlignment(TextStyle.Alignment.LEFT);
+ lst.add(Arguments.of(builder.get(), "Hello world ", " Hello world"));
+
+ builder.setAlignment(TextStyle.Alignment.RIGHT);
+ lst.add(Arguments.of(builder.get(), " Hello world", " Hello world"));
+
+ builder.setAlignment(TextStyle.Alignment.CENTER);
+ lst.add(Arguments.of(builder.get(), " Hello world ", " Hello world "));
+
// width greater than text length and less than text length + indent creates result of text length + pad
builder.setMaxWidth(14);
builder.setAlignment(TextStyle.Alignment.LEFT);