1 /***
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.cli;
18
19 import junit.framework.Test;
20 import junit.framework.TestCase;
21 import junit.framework.TestSuite;
22
23 /***
24 * @author John Keyes (john at integralsource.com)
25 * @version $Revision: 542144 $
26 */
27 public class OptionGroupTest extends TestCase
28 {
29
30 private Options _options = null;
31 private CommandLineParser parser = new PosixParser();
32
33
34 public static Test suite()
35 {
36 return new TestSuite ( OptionGroupTest.class );
37 }
38
39 public OptionGroupTest( String name )
40 {
41 super( name );
42 }
43
44 public void setUp()
45 {
46 Option file = new Option( "f", "file", false, "file to process" );
47 Option dir = new Option( "d", "directory", false, "directory to process" );
48 OptionGroup group = new OptionGroup();
49 group.addOption( file );
50 group.addOption( dir );
51 _options = new Options().addOptionGroup( group );
52
53 Option section = new Option( "s", "section", false, "section to process" );
54 Option chapter = new Option( "c", "chapter", false, "chapter to process" );
55 OptionGroup group2 = new OptionGroup();
56 group2.addOption( section );
57 group2.addOption( chapter );
58
59 _options.addOptionGroup( group2 );
60
61 Option importOpt = new Option( null, "import", false, "section to process" );
62 Option exportOpt = new Option( null, "export", false, "chapter to process" );
63 OptionGroup group3 = new OptionGroup();
64 group3.addOption( importOpt );
65 group3.addOption( exportOpt );
66 _options.addOptionGroup( group3 );
67
68 _options.addOption( "r", "revision", false, "revision number" );
69 }
70
71 public void tearDown()
72 {
73 }
74
75 public void testSingleOptionFromGroup()
76 {
77 String[] args = new String[] { "-f" };
78
79 try
80 {
81 CommandLine cl = parser.parse( _options, args);
82
83 assertTrue( "Confirm -r is NOT set", !cl.hasOption("r") );
84 assertTrue( "Confirm -f is set", cl.hasOption("f") );
85 assertTrue( "Confirm -d is NOT set", !cl.hasOption("d") );
86 assertTrue( "Confirm -s is NOT set", !cl.hasOption("s") );
87 assertTrue( "Confirm -c is NOT set", !cl.hasOption("c") );
88 assertTrue( "Confirm no extra args", cl.getArgList().size() == 0);
89 }
90 catch (ParseException e)
91 {
92 fail( e.toString() );
93 }
94 }
95
96 public void testSingleOption()
97 {
98 String[] args = new String[] { "-r" };
99
100 try
101 {
102 CommandLine cl = parser.parse( _options, args);
103
104 assertTrue( "Confirm -r is set", cl.hasOption("r") );
105 assertTrue( "Confirm -f is NOT set", !cl.hasOption("f") );
106 assertTrue( "Confirm -d is NOT set", !cl.hasOption("d") );
107 assertTrue( "Confirm -s is NOT set", !cl.hasOption("s") );
108 assertTrue( "Confirm -c is NOT set", !cl.hasOption("c") );
109 assertTrue( "Confirm no extra args", cl.getArgList().size() == 0);
110 }
111 catch (ParseException e)
112 {
113 fail( e.toString() );
114 }
115 }
116
117 public void testTwoValidOptions()
118 {
119 String[] args = new String[] { "-r", "-f" };
120
121 try
122 {
123 CommandLine cl = parser.parse( _options, args);
124
125 assertTrue( "Confirm -r is set", cl.hasOption("r") );
126 assertTrue( "Confirm -f is set", cl.hasOption("f") );
127 assertTrue( "Confirm -d is NOT set", !cl.hasOption("d") );
128 assertTrue( "Confirm -s is NOT set", !cl.hasOption("s") );
129 assertTrue( "Confirm -c is NOT set", !cl.hasOption("c") );
130 assertTrue( "Confirm no extra args", cl.getArgList().size() == 0);
131 }
132 catch (ParseException e)
133 {
134 fail( e.toString() );
135 }
136 }
137
138 public void testSingleLongOption()
139 {
140 String[] args = new String[] { "--file" };
141
142 try
143 {
144 CommandLine cl = parser.parse( _options, args);
145
146 assertTrue( "Confirm -r is NOT set", !cl.hasOption("r") );
147 assertTrue( "Confirm -f is set", cl.hasOption("f") );
148 assertTrue( "Confirm -d is NOT set", !cl.hasOption("d") );
149 assertTrue( "Confirm -s is NOT set", !cl.hasOption("s") );
150 assertTrue( "Confirm -c is NOT set", !cl.hasOption("c") );
151 assertTrue( "Confirm no extra args", cl.getArgList().size() == 0);
152 }
153 catch (ParseException e)
154 {
155 fail( e.toString() );
156 }
157 }
158
159 public void testTwoValidLongOptions()
160 {
161 String[] args = new String[] { "--revision", "--file" };
162
163 try
164 {
165 CommandLine cl = parser.parse( _options, args);
166
167 assertTrue( "Confirm -r is set", cl.hasOption("r") );
168 assertTrue( "Confirm -f is set", cl.hasOption("f") );
169 assertTrue( "Confirm -d is NOT set", !cl.hasOption("d") );
170 assertTrue( "Confirm -s is NOT set", !cl.hasOption("s") );
171 assertTrue( "Confirm -c is NOT set", !cl.hasOption("c") );
172 assertTrue( "Confirm no extra args", cl.getArgList().size() == 0);
173 }
174 catch (ParseException e)
175 {
176 fail( e.toString() );
177 }
178 }
179
180 public void testNoOptionsExtraArgs()
181 {
182 String[] args = new String[] { "arg1", "arg2" };
183
184 try
185 {
186 CommandLine cl = parser.parse( _options, args);
187
188 assertTrue( "Confirm -r is NOT set", !cl.hasOption("r") );
189 assertTrue( "Confirm -f is NOT set", !cl.hasOption("f") );
190 assertTrue( "Confirm -d is NOT set", !cl.hasOption("d") );
191 assertTrue( "Confirm -s is NOT set", !cl.hasOption("s") );
192 assertTrue( "Confirm -c is NOT set", !cl.hasOption("c") );
193 assertTrue( "Confirm TWO extra args", cl.getArgList().size() == 2);
194 }
195 catch (ParseException e)
196 {
197 fail( e.toString() );
198 }
199 }
200
201 public void testTwoOptionsFromGroup()
202 {
203 String[] args = new String[] { "-f", "-d" };
204
205 try
206 {
207 CommandLine cl = parser.parse( _options, args);
208 fail( "two arguments from group not allowed" );
209 }
210 catch (ParseException e)
211 {
212 if( !( e instanceof AlreadySelectedException ) )
213 {
214 fail( "incorrect exception caught:" + e.getMessage() );
215 }
216 }
217 }
218
219 public void testTwoLongOptionsFromGroup()
220 {
221 String[] args = new String[] { "--file", "--directory" };
222
223 try
224 {
225 CommandLine cl = parser.parse( _options, args);
226 fail( "two arguments from group not allowed" );
227 }
228 catch (ParseException e)
229 {
230 if( !( e instanceof AlreadySelectedException ) )
231 {
232 fail( "incorrect exception caught:" + e.getMessage() );
233 }
234 }
235 }
236
237 public void testTwoOptionsFromDifferentGroup()
238 {
239 String[] args = new String[] { "-f", "-s" };
240
241 try
242 {
243 CommandLine cl = parser.parse( _options, args);
244 assertTrue( "Confirm -r is NOT set", !cl.hasOption("r") );
245 assertTrue( "Confirm -f is set", cl.hasOption("f") );
246 assertTrue( "Confirm -d is NOT set", !cl.hasOption("d") );
247 assertTrue( "Confirm -s is set", cl.hasOption("s") );
248 assertTrue( "Confirm -c is NOT set", !cl.hasOption("c") );
249 assertTrue( "Confirm NO extra args", cl.getArgList().size() == 0);
250 }
251 catch (ParseException e)
252 {
253 fail( e.toString() );
254 }
255 }
256
257 public void testValidLongOnlyOptions()
258 {
259 try
260 {
261 CommandLine cl = parser.parse( _options, new String[]{"--export"});
262 assertTrue( "Confirm --export is set", cl.hasOption("export") );
263 }
264 catch (ParseException e)
265 {
266 fail( e.toString() );
267 }
268
269 try
270 {
271 CommandLine cl = parser.parse( _options, new String[]{"--import"});
272 assertTrue( "Confirm --import is set", cl.hasOption("import") );
273 }
274 catch (ParseException e)
275 {
276 fail( e.toString() );
277 }
278 }
279
280
281 }