View Javadoc
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         https://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  
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") // tests some deprecated classes
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 }