Skip to content

Commit afc13c4

Browse files
committed
CLI-266: HelpFormatter.setOptionComparator(null) doesn't display the values in inserted order. Thank you to Ravi Teja. This also closes apache#6 from GitHub.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/cli/trunk@1749596 13f79535-47bb-0310-9956-ffa450edef68
1 parent f6af623 commit afc13c4

4 files changed

Lines changed: 110 additions & 4 deletions

File tree

src/changes/changes.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
<body>
2424

2525
<release version="1.4" date="tba" description="tba">
26+
<action type="fix" dev="britter" issue="CLI-266" due-to="Ravi Teja">
27+
HelpFormatter.setOptionComparator(null) doesn't display the values in inserted order
28+
</action>
2629
</release>
2730

2831
<release version="1.3.1" date="2015-06-17" description="Bug fix release for 1.3">

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
import java.io.Serializable;
2121
import java.util.Collection;
22-
import java.util.HashMap;
2322
import java.util.Iterator;
23+
import java.util.LinkedHashMap;
2424
import java.util.Map;
2525

2626
/**
@@ -34,7 +34,7 @@ public class OptionGroup implements Serializable
3434
private static final long serialVersionUID = 1L;
3535

3636
/** hold the options */
37-
private final Map<String, Option> optionMap = new HashMap<String, Option>();
37+
private final Map<String, Option> optionMap = new LinkedHashMap<String, Option>();
3838

3939
/** the name of the selected option */
4040
private String selected;

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import java.util.ArrayList;
2222
import java.util.Collection;
2323
import java.util.Collections;
24-
import java.util.HashMap;
2524
import java.util.HashSet;
2625
import java.util.LinkedHashMap;
2726
import java.util.List;
@@ -58,7 +57,7 @@ public class Options implements Serializable
5857
private final List<Object> requiredOpts = new ArrayList<Object>();
5958

6059
/** a map of the option groups */
61-
private final Map<String, OptionGroup> optionGroups = new HashMap<String, OptionGroup>();
60+
private final Map<String, OptionGroup> optionGroups = new LinkedHashMap<String, OptionGroup>();
6261

6362
/**
6463
* Add the specified option group.
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package org.apache.commons.cli.bug;
2+
3+
import org.apache.commons.cli.HelpFormatter;
4+
import org.apache.commons.cli.Option;
5+
import org.apache.commons.cli.OptionGroup;
6+
import org.apache.commons.cli.Options;
7+
import org.apache.commons.cli.ParseException;
8+
import org.junit.Assert;
9+
import org.junit.Test;
10+
11+
import java.util.ArrayList;
12+
import java.util.Arrays;
13+
import java.util.Collection;
14+
import java.util.Collections;
15+
import java.util.List;
16+
17+
public class BugCLI266Test {
18+
19+
private List<String> insertedOrder = Arrays.asList("h", "d", "f", "x", "s", "p", "t", "w", "o");
20+
private List<String> sortOrder = Arrays.asList("d", "f", "h", "o", "p", "s", "t", "w", "x");
21+
22+
@Test
23+
public void testOptionComparatorDefaultOrder() throws ParseException {
24+
HelpFormatter formatter = new HelpFormatter();
25+
List<Option> options = new ArrayList<Option>(getOptions().getOptions());
26+
Collections.sort(options, formatter.getOptionComparator());
27+
int i = 0;
28+
for(Option o: options) {
29+
Assert.assertEquals(o.getOpt(), sortOrder.get(i));
30+
i++;
31+
}
32+
}
33+
34+
@Test
35+
public void testOptionComparatorInsertedOrder() throws ParseException {
36+
Collection<Option> options = getOptions().getOptions();
37+
int i = 0;
38+
for(Option o: options) {
39+
Assert.assertEquals(o.getOpt(), insertedOrder.get(i));
40+
i++;
41+
}
42+
}
43+
44+
private Options getOptions() {
45+
Options options = new Options();
46+
Option help = Option.builder("h")
47+
.longOpt("help")
48+
.desc("Prints this help message")
49+
.build();
50+
options.addOption(help);
51+
52+
buildOptionsGroup(options);
53+
54+
Option t = Option.builder("t")
55+
.required()
56+
.hasArg()
57+
.argName("file")
58+
.build();
59+
Option w = Option.builder("w")
60+
.required()
61+
.hasArg()
62+
.argName("word")
63+
.build();
64+
Option o = Option.builder("o")
65+
.hasArg()
66+
.argName("directory")
67+
.build();
68+
options.addOption(t);
69+
options.addOption(w);
70+
options.addOption(o);
71+
return options;
72+
}
73+
74+
private void buildOptionsGroup(Options options) {
75+
OptionGroup firstGroup = new OptionGroup();
76+
OptionGroup secondGroup = new OptionGroup();
77+
firstGroup.setRequired(true);
78+
secondGroup.setRequired(true);
79+
80+
firstGroup.addOption(Option.builder("d")
81+
.longOpt("db")
82+
.hasArg()
83+
.argName("table-name")
84+
.build());
85+
firstGroup.addOption(Option.builder("f")
86+
.longOpt("flat-file")
87+
.hasArg()
88+
.argName("input.csv")
89+
.build());
90+
options.addOptionGroup(firstGroup);
91+
92+
secondGroup.addOption(Option.builder("x")
93+
.hasArg()
94+
.argName("arg1")
95+
.build());
96+
secondGroup.addOption(Option.builder("s")
97+
.build());
98+
secondGroup.addOption(Option.builder("p")
99+
.hasArg()
100+
.argName("arg1")
101+
.build());
102+
options.addOptionGroup(secondGroup);
103+
}
104+
}

0 commit comments

Comments
 (0)