diff --git a/src/main/java/org/apache/commons/cli/help/TextHelpAppendable.java b/src/main/java/org/apache/commons/cli/help/TextHelpAppendable.java index d813b2eb2..5377ed8dc 100644 --- a/src/main/java/org/apache/commons/cli/help/TextHelpAppendable.java +++ b/src/main/java/org/apache/commons/cli/help/TextHelpAppendable.java @@ -78,7 +78,7 @@ public static int indexOfWrap(final CharSequence text, final int width, final in } // handle case of width > text. // the line ends before the max wrap pos or a new line char found - final int limit = Math.min(startPos + width, text.length() - 1); + int limit = Math.min(startPos + width, text.length()); for (int idx = startPos; idx < limit; idx++) { if (BREAK_CHAR_SET.contains(text.charAt(idx))) { return idx; @@ -87,6 +87,8 @@ public static int indexOfWrap(final CharSequence text, final int width, final in if (startPos + width >= text.length()) { return text.length(); } + + limit = Math.min(startPos + width, text.length() - 1); int pos; // look for the last whitespace character before limit for (pos = limit; pos >= startPos; --pos) { @@ -311,15 +313,15 @@ protected Queue makeColumnQueue(final CharSequence columnData, final Tex final String indent = Util.repeatSpace(style.getIndent()); final Queue result = new LinkedList<>(); int wrapPos = 0; - int nextPos; + int lastPos; final int wrappedMaxWidth = style.getMaxWidth() - indent.length(); while (wrapPos < columnData.length()) { final int workingWidth = wrapPos == 0 ? style.getMaxWidth() : wrappedMaxWidth; - nextPos = indexOfWrap(columnData, workingWidth, wrapPos); - final CharSequence working = columnData.subSequence(wrapPos, nextPos); + lastPos = indexOfWrap(columnData, workingWidth, wrapPos); + final CharSequence working = columnData.subSequence(wrapPos, lastPos); result.add(lpad + style.pad(wrapPos > 0, working)); - wrapPos = Util.indexOfNonWhitespace(columnData, nextPos); - wrapPos = wrapPos == -1 ? nextPos : wrapPos; + wrapPos = Util.indexOfNonWhitespace(columnData, lastPos); + wrapPos = wrapPos == -1 ? lastPos + 1 : wrapPos; } return result; } diff --git a/src/test/java/org/apache/commons/cli/help/TextHelpAppendableTest.java b/src/test/java/org/apache/commons/cli/help/TextHelpAppendableTest.java index d1e16d388..1c383498d 100644 --- a/src/test/java/org/apache/commons/cli/help/TextHelpAppendableTest.java +++ b/src/test/java/org/apache/commons/cli/help/TextHelpAppendableTest.java @@ -49,7 +49,7 @@ public void setUp() { } @Test - void tesstMakeColumnQueue() { + void testMakeColumnQueue() { final String text = "The quick brown fox jumps over the lazy dog"; final TextStyle.Builder styleBuilder = TextStyle.builder().setMaxWidth(10).setIndent(0).setLeftPad(0); @@ -98,6 +98,20 @@ void tesstMakeColumnQueue() { assertEquals(expected, result, "right aligned failed"); } + @Test + void testMakeColumnQueueWithMultipleTrailingLineBreaks() { + // this test should work with any n>1 multiple trailing characters from TestHelpAppendable.BREAK_CHAR_SET. + final String text = "Header\t" + (char) Character.PARAGRAPH_SEPARATOR; + final TextStyle.Builder styleBuilder = TextStyle.builder().setMaxWidth(10).setIndent(0).setLeftPad(0); + + Queue expected = new LinkedList<>(); + expected.add("Header "); + expected.add(" "); + + Queue result = underTest.makeColumnQueue(text, styleBuilder.get()); + assertEquals(expected, result, "left aligned failed"); + } + @Test void testAdjustTableFormat() { // test width smaller than header