Skip to content

Commit 95e3a60

Browse files
committed
Better data type
Add missing tests
1 parent 68844bf commit 95e3a60

4 files changed

Lines changed: 93 additions & 16 deletions

File tree

src/main/java/org/apache/commons/cli/Char.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ final class Char {
3737
/** Space. */
3838
static final char SP = ' ';
3939

40+
/** Tab. */
41+
static final char TAB = '\t';
42+
4043
private Char() {
4144
// empty
4245
}

src/main/java/org/apache/commons/cli/HelpFormatter.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -81,23 +81,23 @@ public static final class Builder implements Supplier<HelpFormatter> {
8181
private boolean showDeprecated;
8282

8383
/**
84-
* The output PrintStream, defaults to {@link System#out}.
84+
* The output PrintWriter, defaults to wrapping {@link System#out}.
8585
*/
86-
private PrintStream printStream = System.out;
86+
private PrintWriter printStream = new PrintWriter(System.out);
8787

8888
@Override
8989
public HelpFormatter get() {
9090
return new HelpFormatter(showDeprecated, printStream);
9191
}
9292

9393
/**
94-
* Sets the output PrintStream, defaults to {@link System#out}.
94+
* Sets the output PrintWriter, defaults to wrapping {@link System#out}.
9595
*
96-
* @param printStream the output PrintStream, not null.
96+
* @param printWriter the output PrintWriter, not null.
9797
* @return this.
9898
*/
99-
public Builder setPrintStream(final PrintStream printStream) {
100-
this.printStream = Objects.requireNonNull(printStream, "printStream");
99+
public Builder setPrintWriter(final PrintWriter printWriter) {
100+
this.printStream = Objects.requireNonNull(printWriter, "printWriter");
101101
return this;
102102
}
103103

@@ -254,7 +254,7 @@ public static Builder builder() {
254254
/**
255255
* Where to print help.
256256
*/
257-
private final PrintStream printStream;
257+
private final PrintWriter printWriter;
258258

259259
/**
260260
* The separator displayed between the long option and its value.
@@ -265,18 +265,18 @@ public static Builder builder() {
265265
* Constructs a new instance.
266266
*/
267267
public HelpFormatter() {
268-
this(false, System.out);
268+
this(false, new PrintWriter(System.out));
269269
}
270270

271271
/**
272272
* Constructs a new instance.
273273
* @param printStream TODO
274274
*/
275-
private HelpFormatter(final boolean showDeprecated, final PrintStream printStream) {
275+
private HelpFormatter(final boolean showDeprecated, final PrintWriter printStream) {
276276
// TODO All other instance HelpFormatter instance variables.
277277
// Make HelpFormatter immutable for 2.0
278278
this.showDeprecated = showDeprecated;
279-
this.printStream = printStream;
279+
this.printWriter = printStream;
280280
}
281281

282282
/**
@@ -363,11 +363,11 @@ protected String createPadding(final int len) {
363363
*/
364364
protected int findWrapPos(final String text, final int width, final int startPos) {
365365
// the line ends before the max wrap pos or a new line char found
366-
int pos = text.indexOf('\n', startPos);
366+
int pos = text.indexOf(Char.LF, startPos);
367367
if (pos != -1 && pos <= width) {
368368
return pos + 1;
369369
}
370-
pos = text.indexOf('\t', startPos);
370+
pos = text.indexOf(Char.TAB, startPos);
371371
if (pos != -1 && pos <= width) {
372372
return pos + 1;
373373
}
@@ -377,7 +377,7 @@ protected int findWrapPos(final String text, final int width, final int startPos
377377
// look for the last whitespace character before startPos+width
378378
for (pos = startPos + width; pos >= startPos; --pos) {
379379
final char c = text.charAt(pos);
380-
if (c == ' ' || c == '\n' || c == '\r') {
380+
if (c == Char.SP || c == Char.LF || c == Char.CR) {
381381
break;
382382
}
383383
}
@@ -511,7 +511,7 @@ public void printHelp(final int width, final String cmdLineSyntax, final String
511511
*/
512512
public void printHelp(final int width, final String cmdLineSyntax, final String header, final Options options, final String footer,
513513
final boolean autoUsage) {
514-
final PrintWriter pw = new PrintWriter(printStream);
514+
final PrintWriter pw = new PrintWriter(printWriter);
515515
printHelp(pw, width, cmdLineSyntax, header, options, getLeftPadding(), getDescPadding(), footer, autoUsage);
516516
pw.flush();
517517
}

src/test/java/org/apache/commons/cli/HelpFormatterTest.java

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more
2525
import java.io.PrintWriter;
2626
import java.io.StringWriter;
2727

28+
import org.apache.commons.cli.HelpFormatter.Builder;
2829
import org.junit.jupiter.api.Test;
2930

3031
/**
@@ -128,7 +129,7 @@ public void testFindWrapPos() {
128129
}
129130

130131
@Test
131-
public void testHeaderStartingWithLineSeparator() {
132+
public void testHeaderStartingWithLineSeparator0() {
132133
// related to Bugzilla #21215
133134
final Options options = new Options();
134135
final HelpFormatter formatter = new HelpFormatter();
@@ -147,6 +148,78 @@ public void testHeaderStartingWithLineSeparator() {
147148
//@formatter:on
148149
}
149150

151+
@Test
152+
public void testHeaderStartingWithLineSeparator1() {
153+
// related to Bugzilla #21215
154+
final Options options = new Options();
155+
final String header = EOL + "Header";
156+
final String footer = "Footer";
157+
final Builder builder = HelpFormatter.builder();
158+
StringWriter out = new StringWriter();
159+
builder.setPrintWriter(new PrintWriter(out)).get().printHelp(new PrintWriter(out), 80, "foobar", header, options, 2, 2, footer, true);
160+
//@formatter:off
161+
assertEquals(
162+
"usage: foobar" + EOL +
163+
"" + EOL +
164+
"Header" + EOL +
165+
"" + EOL +
166+
"Footer" + EOL,
167+
out.toString());
168+
//@formatter:on
169+
out = new StringWriter();
170+
builder.setPrintWriter(new PrintWriter(out)).get().printHelp("foobar", header, options, footer);
171+
//@formatter:off
172+
assertEquals(
173+
"usage: foobar" + EOL +
174+
"" + EOL +
175+
"Header" + EOL +
176+
"" + EOL +
177+
"Footer" + EOL,
178+
out.toString());
179+
//@formatter:on
180+
out = new StringWriter();
181+
builder.setPrintWriter(new PrintWriter(out)).get().printHelp(80, "foobar", header, options, footer);
182+
//@formatter:off
183+
assertEquals(
184+
"usage: foobar" + EOL +
185+
"" + EOL +
186+
"Header" + EOL +
187+
"" + EOL +
188+
"Footer" + EOL,
189+
out.toString());
190+
//@formatter:on
191+
out = new StringWriter();
192+
builder.setPrintWriter(new PrintWriter(out)).get().printHelp("foobar", header, options, footer, false);
193+
//@formatter:off
194+
assertEquals(
195+
"usage: foobar" + EOL +
196+
"" + EOL +
197+
"Header" + EOL +
198+
"" + EOL +
199+
"Footer" + EOL,
200+
out.toString());
201+
//@formatter:on
202+
out = new StringWriter();
203+
builder.setPrintWriter(new PrintWriter(out)).get().printHelp("foobar", header, options, footer, true);
204+
//@formatter:off
205+
assertEquals(
206+
"usage: foobar" + EOL +
207+
"" + EOL +
208+
"Header" + EOL +
209+
"" + EOL +
210+
"Footer" + EOL,
211+
out.toString());
212+
//@formatter:on
213+
out = new StringWriter();
214+
builder.setPrintWriter(new PrintWriter(out)).get().printHelp("foobar", options, false);
215+
//@formatter:off
216+
assertEquals(
217+
"usage: foobar" + EOL +
218+
"" + EOL,
219+
out.toString());
220+
//@formatter:on
221+
}
222+
150223
@Test
151224
public void testHelpWithLongOptSeparator() {
152225
final Options options = new Options();

src/test/java/org/apache/commons/cli/bug/BugsTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import java.io.ByteArrayOutputStream;
2828
import java.io.PrintStream;
29+
import java.io.PrintWriter;
2930
import java.util.Iterator;
3031
import java.util.Properties;
3132

@@ -253,7 +254,7 @@ public void test13666_Builder() throws Exception {
253254
options.addOption(dirOption);
254255
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
255256
final String eol = System.lineSeparator();
256-
final HelpFormatter formatter = HelpFormatter.builder().setPrintStream(new PrintStream(baos)).get();
257+
final HelpFormatter formatter = HelpFormatter.builder().setPrintWriter(new PrintWriter(baos)).get();
257258
formatter.printHelp("dir", options);
258259
assertEquals("usage: dir" + eol + " -d <arg> dir" + eol, baos.toString());
259260
}

0 commit comments

Comments
 (0)