1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.cli;
19
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertFalse;
22 import static org.junit.jupiter.api.Assertions.assertNotNull;
23 import static org.junit.jupiter.api.Assertions.assertThrows;
24 import static org.junit.jupiter.api.Assertions.assertTrue;
25
26 import java.util.Properties;
27
28 import org.junit.jupiter.api.BeforeEach;
29 import org.junit.jupiter.api.Test;
30
31 @SuppressWarnings("deprecation")
32 class OptionGroupTest {
33
34 private Options options;
35 private final Parser parser = new PosixParser();
36
37 @BeforeEach
38 public void setUp() {
39 final Option file = new Option("f", "file", false, "file to process");
40 final Option dir = new Option("d", "directory", false, "directory to process");
41 final OptionGroup optionGroup1 = new OptionGroup();
42 optionGroup1.addOption(file);
43 optionGroup1.addOption(dir);
44 options = new Options().addOptionGroup(optionGroup1);
45
46 final Option section = new Option("s", "section", false, "section to process");
47 final Option chapter = new Option("c", "chapter", false, "chapter to process");
48 final OptionGroup optionGroup2 = new OptionGroup();
49 optionGroup2.addOption(section);
50 optionGroup2.addOption(chapter);
51
52 options.addOptionGroup(optionGroup2);
53
54 final Option importOpt = new Option(null, "import", false, "section to process");
55 final Option exportOpt = new Option(null, "export", false, "chapter to process");
56 final OptionGroup optionGroup3 = new OptionGroup();
57 optionGroup3.addOption(importOpt);
58 optionGroup3.addOption(exportOpt);
59 options.addOptionGroup(optionGroup3);
60
61 options.addOption("r", "revision", false, "revision number");
62 }
63
64 @Test
65 void testGetNames() {
66 final OptionGroup optionGroup = new OptionGroup();
67 assertFalse(optionGroup.isSelected());
68 optionGroup.addOption(OptionBuilder.create('a'));
69 optionGroup.addOption(OptionBuilder.create('b'));
70 assertNotNull(optionGroup.getNames(), "null names");
71 assertEquals(2, optionGroup.getNames().size());
72 assertTrue(optionGroup.getNames().contains("a"));
73 assertTrue(optionGroup.getNames().contains("b"));
74 }
75
76 @Test
77 void testNoOptionsExtraArgs() throws Exception {
78 final String[] args = {"arg1", "arg2"};
79 final CommandLine cl = parser.parse(options, args);
80 assertFalse(cl.hasOption("r"), "Confirm -r is NOT set");
81 assertFalse(cl.hasOption("f"), "Confirm -f is NOT set");
82 assertFalse(cl.hasOption("d"), "Confirm -d is NOT set");
83 assertFalse(cl.hasOption("s"), "Confirm -s is NOT set");
84 assertFalse(cl.hasOption("c"), "Confirm -c is NOT set");
85 assertEquals(2, cl.getArgList().size(), "Confirm TWO extra args");
86 }
87
88 @Test
89 void testSingleLongOption() throws Exception {
90 final String[] args = {"--file"};
91 final CommandLine cl = parser.parse(options, args);
92 assertFalse(cl.hasOption("r"), "Confirm -r is NOT set");
93 assertTrue(cl.hasOption("f"), "Confirm -f is set");
94 assertFalse(cl.hasOption("d"), "Confirm -d is NOT set");
95 assertFalse(cl.hasOption("s"), "Confirm -s is NOT set");
96 assertFalse(cl.hasOption("c"), "Confirm -c is NOT set");
97 assertTrue(cl.getArgList().isEmpty(), "Confirm no extra args");
98 }
99
100 @Test
101 void testSingleOption() throws Exception {
102 final String[] args = {"-r"};
103 final CommandLine cl = parser.parse(options, args);
104 assertTrue(cl.hasOption("r"), "Confirm -r is set");
105 assertFalse(cl.hasOption("f"), "Confirm -f is NOT set");
106 assertFalse(cl.hasOption("d"), "Confirm -d is NOT set");
107 assertFalse(cl.hasOption("s"), "Confirm -s is NOT set");
108 assertFalse(cl.hasOption("c"), "Confirm -c is NOT set");
109 assertTrue(cl.getArgList().isEmpty(), "Confirm no extra args");
110 }
111
112 @Test
113 void testSingleOptionFromGroup() throws Exception {
114 final String[] args = {"-f"};
115 final CommandLine cl = parser.parse(options, args);
116 assertFalse(cl.hasOption("r"), "Confirm -r is NOT set");
117 assertTrue(cl.hasOption("f"), "Confirm -f is set");
118 assertFalse(cl.hasOption("d"), "Confirm -d is NOT set");
119 assertFalse(cl.hasOption("s"), "Confirm -s is NOT set");
120 assertFalse(cl.hasOption("c"), "Confirm -c is NOT set");
121 assertTrue(cl.getArgList().isEmpty(), "Confirm no extra args");
122 }
123
124 @Test
125 void testToString() {
126 final OptionGroup optionGroup1 = new OptionGroup();
127 optionGroup1.addOption(new Option(null, "foo", false, "Foo"));
128 optionGroup1.addOption(new Option(null, "bar", false, "Bar"));
129 if (!"[--bar Bar, --foo Foo]".equals(optionGroup1.toString())) {
130 assertEquals("[--foo Foo, --bar Bar]", optionGroup1.toString());
131 }
132 final OptionGroup optionGroup2 = new OptionGroup();
133 optionGroup2.addOption(new Option("f", "foo", false, "Foo"));
134 optionGroup2.addOption(new Option("b", "bar", false, "Bar"));
135 if (!"[-b Bar, -f Foo]".equals(optionGroup2.toString())) {
136 assertEquals("[-f Foo, -b Bar]", optionGroup2.toString());
137 }
138 }
139
140 @Test
141 void testTwoLongOptionsFromGroup() throws Exception {
142 final String[] args = { "--file", "--directory" };
143 final AlreadySelectedException e = assertThrows(AlreadySelectedException.class, () -> parser.parse(options, args));
144 assertNotNull(e.getOptionGroup(), "null option group");
145 assertTrue(e.getOptionGroup().isSelected());
146 assertEquals("f", e.getOptionGroup().getSelected(), "selected option");
147 assertEquals("d", e.getOption().getOpt(), "option");
148 }
149
150 @Test
151 void testTwoOptionsFromDifferentGroup() throws Exception {
152 final String[] args = {"-f", "-s"};
153 final CommandLine cl = parser.parse(options, args);
154 assertFalse(cl.hasOption("r"), "Confirm -r is NOT set");
155 assertTrue(cl.hasOption("f"), "Confirm -f is set");
156 assertFalse(cl.hasOption("d"), "Confirm -d is NOT set");
157 assertTrue(cl.hasOption("s"), "Confirm -s is set");
158 assertFalse(cl.hasOption("c"), "Confirm -c is NOT set");
159 assertTrue(cl.getArgList().isEmpty(), "Confirm NO extra args");
160 }
161
162 @Test
163 void testTwoOptionsFromGroup() throws Exception {
164 final String[] args = { "-f", "-d" };
165 final AlreadySelectedException e = assertThrows(AlreadySelectedException.class, () -> parser.parse(options, args));
166 assertNotNull(e.getOptionGroup(), "null option group");
167 assertTrue(e.getOptionGroup().isSelected());
168 assertEquals("f", e.getOptionGroup().getSelected(), "selected option");
169 assertEquals("d", e.getOption().getOpt(), "option");
170 }
171
172 @Test
173 void testTwoOptionsFromGroupWithProperties() throws Exception {
174 final String[] args = {"-f"};
175 final Properties properties = new Properties();
176 properties.put("d", "true");
177 final CommandLine cl = parser.parse(options, args, properties);
178 assertTrue(cl.hasOption("f"));
179 assertFalse(cl.hasOption("d"));
180 }
181
182 @Test
183 void testTwoValidLongOptions() throws Exception {
184 final String[] args = {"--revision", "--file"};
185 final CommandLine cl = parser.parse(options, args);
186 assertTrue(cl.hasOption("r"), "Confirm -r is set");
187 assertTrue(cl.hasOption("f"), "Confirm -f is set");
188 assertFalse(cl.hasOption("d"), "Confirm -d is NOT set");
189 assertFalse(cl.hasOption("s"), "Confirm -s is NOT set");
190 assertFalse(cl.hasOption("c"), "Confirm -c is NOT set");
191 assertTrue(cl.getArgList().isEmpty(), "Confirm no extra args");
192 }
193
194 @Test
195 void testTwoValidOptions() throws Exception {
196 final String[] args = {"-r", "-f"};
197 final CommandLine cl = parser.parse(options, args);
198 assertTrue(cl.hasOption("r"), "Confirm -r is set");
199 assertTrue(cl.hasOption("f"), "Confirm -f is set");
200 assertFalse(cl.hasOption("d"), "Confirm -d is NOT set");
201 assertFalse(cl.hasOption("s"), "Confirm -s is NOT set");
202 assertFalse(cl.hasOption("c"), "Confirm -c is NOT set");
203 assertTrue(cl.getArgList().isEmpty(), "Confirm no extra args");
204 }
205
206 @Test
207 void testValidLongOnlyOptions() throws Exception {
208 final CommandLine cl1 = parser.parse(options, new String[] {"--export"});
209 assertTrue(cl1.hasOption("export"), "Confirm --export is set");
210 final CommandLine cl2 = parser.parse(options, new String[] {"--import"});
211 assertTrue(cl2.hasOption("import"), "Confirm --import is set");
212 }
213 }