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.assertNull;
23  import static org.junit.jupiter.api.Assertions.assertThrows;
24  import static org.junit.jupiter.api.Assertions.assertTrue;
25  
26  import org.junit.jupiter.api.Test;
27  import org.junit.jupiter.api.function.Executable;
28  
29  @SuppressWarnings("deprecation") // OptionBuilder is marked deprecated
30  class OptionBuilderTest {
31  
32      @Test
33      void testBaseOptionCharOpt() {
34          OptionBuilder.withDescription("option description");
35          final Option base = OptionBuilder.create('o');
36          assertEquals("o", base.getOpt());
37          assertEquals("option description", base.getDescription());
38          assertFalse(base.hasArg());
39      }
40  
41      @Test
42      void testBaseOptionStringOpt() {
43          OptionBuilder.withDescription("option description");
44          final Option base = OptionBuilder.create("o");
45          assertEquals("o", base.getOpt());
46          assertEquals("option description", base.getDescription());
47          assertFalse(base.hasArg());
48      }
49  
50      @Test
51      void testBuilderIsResettedAlways() {
52          OptionBuilder.withDescription("JUnit");
53          assertThrows(IllegalArgumentException.class, () -> OptionBuilder.create('"'));
54          assertNull(OptionBuilder.create('x').getDescription(), "we inherited a description");
55          assertThrows(IllegalStateException.class, (Executable) OptionBuilder::create);
56          assertNull(OptionBuilder.create('x').getDescription(), "we inherited a description");
57      }
58  
59      @Test
60      void testCompleteOption() {
61          OptionBuilder.withLongOpt("simple option");
62          OptionBuilder.hasArg();
63          OptionBuilder.isRequired();
64          OptionBuilder.hasArgs();
65          OptionBuilder.withType(Float.class);
66          OptionBuilder.withDescription("this is a simple option");
67          final Option simple = OptionBuilder.create('s');
68          assertEquals("s", simple.getOpt());
69          assertEquals("simple option", simple.getLongOpt());
70          assertEquals("this is a simple option", simple.getDescription());
71          assertEquals(simple.getType(), Float.class);
72          assertTrue(simple.hasArg());
73          assertTrue(simple.isRequired());
74          assertTrue(simple.hasArgs());
75      }
76  
77      @Test
78      void testCreateIncompleteOption() {
79          assertThrows(IllegalStateException.class, (Executable) OptionBuilder::create);
80          // implicitly reset the builder
81          OptionBuilder.create("opt");
82      }
83  
84      @Test
85      void testIllegalOptions() {
86          OptionBuilder.withDescription("option description");
87          // bad single character option
88          assertThrows(IllegalArgumentException.class, () -> OptionBuilder.create('"'));
89          // bad character in option string
90          assertThrows(IllegalArgumentException.class, () -> OptionBuilder.create("opt`"));
91          // valid option
92          OptionBuilder.create("opt");
93      }
94  
95      @Test
96      void testOptionArgNumbers() {
97          OptionBuilder.withDescription("option description");
98          OptionBuilder.hasArgs(2);
99          final Option opt = OptionBuilder.create('o');
100         assertEquals(2, opt.getArgs());
101     }
102 
103     @Test
104     void testSpecialOptChars() throws Exception {
105         OptionBuilder.withDescription("help options");
106         // '?'
107         final Option opt1 = OptionBuilder.create('?');
108         assertEquals("?", opt1.getOpt());
109         OptionBuilder.withDescription("read from stdin");
110         // '@'
111         final Option opt2 = OptionBuilder.create('@');
112         assertEquals("@", opt2.getOpt());
113         // ' '
114         assertThrows(IllegalArgumentException.class, () -> OptionBuilder.create(' '));
115     }
116 
117     @Test
118     void testTwoCompleteOptions() {
119         OptionBuilder.withLongOpt("simple option");
120         OptionBuilder.hasArg();
121         OptionBuilder.isRequired();
122         OptionBuilder.hasArgs();
123         OptionBuilder.withType(Float.class);
124         OptionBuilder.withDescription("this is a simple option");
125         Option simple = OptionBuilder.create('s');
126         assertEquals("s", simple.getOpt());
127         assertEquals("simple option", simple.getLongOpt());
128         assertEquals("this is a simple option", simple.getDescription());
129         assertEquals(simple.getType(), Float.class);
130         assertTrue(simple.hasArg());
131         assertTrue(simple.isRequired());
132         assertTrue(simple.hasArgs());
133         OptionBuilder.withLongOpt("dimple option");
134         OptionBuilder.hasArg();
135         OptionBuilder.withDescription("this is a dimple option");
136         simple = OptionBuilder.create('d');
137         assertEquals("d", simple.getOpt());
138         assertEquals("dimple option", simple.getLongOpt());
139         assertEquals("this is a dimple option", simple.getDescription());
140         assertEquals(String.class, simple.getType());
141         assertTrue(simple.hasArg());
142         assertFalse(simple.isRequired());
143         assertFalse(simple.hasArgs());
144     }
145 }