11package picocli ;
22
3- import org .junit .Ignore ;
43import org .junit .Rule ;
54import org .junit .Test ;
65import org .junit .contrib .java .lang .system .ProvideSystemProperty ;
109import java .io .ByteArrayOutputStream ;
1110import java .io .PrintStream ;
1211import java .io .PrintWriter ;
13- import java .util .*;
12+ import java .util .Arrays ;
13+ import java .util .LinkedHashSet ;
14+ import java .util .Set ;
1415
1516import static org .junit .Assert .*;
16- import static picocli .CommandLine .*;
17- import static picocli .CommandLine .AbbreviationMatcher .*;
17+ import static picocli .CommandLine .AbbreviationMatcher .match ;
18+ import static picocli .CommandLine .AbbreviationMatcher .splitIntoChunks ;
19+ import static picocli .CommandLine .Command ;
20+ import static picocli .CommandLine .Model ;
21+ import static picocli .CommandLine .Option ;
22+ import static picocli .CommandLine .ParameterException ;
23+ import static picocli .CommandLine .ParseResult ;
24+ import static picocli .CommandLine .UnmatchedArgumentException ;
1825
1926public class AbbreviationMatcherTest {
2027
@@ -42,58 +49,59 @@ private Set<String> createSet() {
4249 @ Test
4350 public void testPrefixMatch () {
4451 Set <String > set = createSet ();
45-
46- assertEquals ("kebab-case" , match (set , "kebab-case" , false ));
47- assertEquals ("kebab-case-extra" , match (set , "kebab-case-extra" , false ));
48- assertEquals ("very-long-kebab-case" , match (set , "very-long-kebab-case" , false ));
49- assertEquals ("very-long-kebab-case" , match (set , "v-l-k-c" , false ));
50- assertEquals ("very-long-kebab-case" , match (set , "vLKC" , false ));
51- assertEquals ("camelCase" , match (set , "camelCase" , false ));
52- assertEquals ("camelCase" , match (set , "cC" , false ));
53- assertEquals ("camelCase" , match (set , "c-c" , false ));
54- assertEquals ("camelCase" , match (set , "camC" , false ));
55- assertEquals ("camelCase" , match (set , "camel" , false ));
56- assertEquals ("camelCase" , match (set , "ca" , false ));
57- assertEquals ("super-long-option" , match (set , "s-l-o" , false ));
58- assertEquals ("super-long-option" , match (set , "s-long-opt" , false ));
59- assertEquals ("super-long-option" , match (set , "super" , false ));
60- assertEquals ("super-long-option" , match (set , "sup" , false ));
61- assertEquals ("super-long-option" , match (set , "sup-long" , false ));
62- assertNotEquals ("super-long-option" , match (set , "SLO" , false ));
63- assertEquals ("super-long-option" , match (set , "sLO" , false ));
64- assertEquals ("super-long-option" , match (set , "s-opt" , false ));
65- assertEquals ("veryLongCamelCase" , match (set , "veryLongCamelCase" , false ));
66- assertEquals ("veryLongCamelCase" , match (set , "vLCC" , false ));
67- assertEquals ("veryLongCamelCase" , match (set , "v-l-c-c" , false ));
68- assertEquals ("extremely-long-option-with-many-components" , match (set , "extr-opt-comp" , false ));
69- assertEquals ("extremely-long-option-with-many-components" , match (set , "extr-long-opt-comp" , false ));
70- assertEquals ("extremely-long-option-with-many-components" , match (set , "extr-comp" , false ));
71- assertNotEquals ("extremely-long-option-with-many-components" , match (set , "extr-opt-long-comp" , false ));
72- assertNotEquals ("extremely-long-option-with-many-components" , match (set , "long" , false ));
52+ CommandLine cmd = new CommandLine (Model .CommandSpec .create ());
53+
54+ assertEquals ("kebab-case" , match (set , "kebab-case" , false , cmd ));
55+ assertEquals ("kebab-case-extra" , match (set , "kebab-case-extra" , false , cmd ));
56+ assertEquals ("very-long-kebab-case" , match (set , "very-long-kebab-case" , false , cmd ));
57+ assertEquals ("very-long-kebab-case" , match (set , "v-l-k-c" , false , cmd ));
58+ assertEquals ("very-long-kebab-case" , match (set , "vLKC" , false , cmd ));
59+ assertEquals ("camelCase" , match (set , "camelCase" , false , cmd ));
60+ assertEquals ("camelCase" , match (set , "cC" , false , cmd ));
61+ assertEquals ("camelCase" , match (set , "c-c" , false , cmd ));
62+ assertEquals ("camelCase" , match (set , "camC" , false , cmd ));
63+ assertEquals ("camelCase" , match (set , "camel" , false , cmd ));
64+ assertEquals ("camelCase" , match (set , "ca" , false , cmd ));
65+ assertEquals ("super-long-option" , match (set , "s-l-o" , false , cmd ));
66+ assertEquals ("super-long-option" , match (set , "s-long-opt" , false , cmd ));
67+ assertEquals ("super-long-option" , match (set , "super" , false , cmd ));
68+ assertEquals ("super-long-option" , match (set , "sup" , false , cmd ));
69+ assertEquals ("super-long-option" , match (set , "sup-long" , false , cmd ));
70+ assertNotEquals ("super-long-option" , match (set , "SLO" , false , cmd ));
71+ assertEquals ("super-long-option" , match (set , "sLO" , false , cmd ));
72+ assertEquals ("super-long-option" , match (set , "s-opt" , false , cmd ));
73+ assertEquals ("veryLongCamelCase" , match (set , "veryLongCamelCase" , false , cmd ));
74+ assertEquals ("veryLongCamelCase" , match (set , "vLCC" , false , cmd ));
75+ assertEquals ("veryLongCamelCase" , match (set , "v-l-c-c" , false , cmd ));
76+ assertEquals ("extremely-long-option-with-many-components" , match (set , "extr-opt-comp" , false , cmd ));
77+ assertEquals ("extremely-long-option-with-many-components" , match (set , "extr-long-opt-comp" , false , cmd ));
78+ assertEquals ("extremely-long-option-with-many-components" , match (set , "extr-comp" , false , cmd ));
79+ assertNotEquals ("extremely-long-option-with-many-components" , match (set , "extr-opt-long-comp" , false , cmd ));
80+ assertNotEquals ("extremely-long-option-with-many-components" , match (set , "long" , false , cmd ));
7381
7482 try {
75- match (set , "vLC" , false );
83+ match (set , "vLC" , false , cmd );
7684 fail ("Expected exception" );
77- } catch (IllegalArgumentException ex ) {
78- assertEquals ("'vLC' is not unique: it matches 'very-long-kebab-case', 'veryLongCamelCase'" , ex .getMessage ());
85+ } catch (ParameterException ex ) {
86+ assertEquals ("Error: 'vLC' is not unique: it matches 'very-long-kebab-case', 'veryLongCamelCase'" , ex .getMessage ());
7987 }
8088 try {
81- match (set , "k-c" , false );
89+ match (set , "k-c" , false , cmd );
8290 fail ("Expected exception" );
83- } catch (IllegalArgumentException ex ) {
84- assertEquals ("'k-c' is not unique: it matches 'kebab-case-extra', 'kebab-case-extra-extra', 'kebab-case'" , ex .getMessage ());
91+ } catch (ParameterException ex ) {
92+ assertEquals ("Error: 'k-c' is not unique: it matches 'kebab-case-extra', 'kebab-case-extra-extra', 'kebab-case'" , ex .getMessage ());
8593 }
8694 try {
87- match (set , "kC" , false );
95+ match (set , "kC" , false , cmd );
8896 fail ("Expected exception" );
89- } catch (IllegalArgumentException ex ) {
90- assertEquals ("'kC' is not unique: it matches 'kebab-case-extra', 'kebab-case-extra-extra', 'kebab-case'" , ex .getMessage ());
97+ } catch (ParameterException ex ) {
98+ assertEquals ("Error: 'kC' is not unique: it matches 'kebab-case-extra', 'kebab-case-extra-extra', 'kebab-case'" , ex .getMessage ());
9199 }
92100 try {
93- match (set , "keb-ca" , false );
101+ match (set , "keb-ca" , false , cmd );
94102 fail ("Expected exception" );
95- } catch (IllegalArgumentException ex ) {
96- assertEquals ("'keb-ca' is not unique: it matches 'kebab-case-extra', 'kebab-case-extra-extra', 'kebab-case'" , ex .getMessage ());
103+ } catch (ParameterException ex ) {
104+ assertEquals ("Error: 'keb-ca' is not unique: it matches 'kebab-case-extra', 'kebab-case-extra-extra', 'kebab-case'" , ex .getMessage ());
97105 }
98106 }
99107
@@ -107,26 +115,28 @@ public void testUserManualExamples() {
107115 original .add ("--super-long-option" );
108116 original .add ("some-long-command" );
109117
110- assertNotEquals ("--veryLongCamelCase" , match (original , "--VLCC" , false ));
111- assertEquals ("--veryLongCamelCase" , match (original , "--very" , false ));
112- assertEquals ("--veryLongCamelCase" , match (original , "--vLCC" , false ));
113- assertEquals ("--veryLongCamelCase" , match (original , "--vCase" , false ));
114-
115- assertEquals ("--super-long-option" , match (original , "--sup" , false ));
116- assertNotEquals ("--super-long-option" , match (original , "--Sup" , false ));
117- assertEquals ("--super-long-option" , match (original , "--sLO" , false ));
118- assertEquals ("--super-long-option" , match (original , "--s-l-o" , false ));
119- assertEquals ("--super-long-option" , match (original , "--s-lon" , false ));
120- assertEquals ("--super-long-option" , match (original , "--s-opt" , false ));
121- assertEquals ("--super-long-option" , match (original , "--sOpt" , false ));
122-
123- assertNotEquals ("some-long-command" , match (original , "So" , false ));
124- assertEquals ("some-long-command" , match (original , "so" , false ));
125- assertEquals ("some-long-command" , match (original , "sLC" , false ));
126- assertEquals ("some-long-command" , match (original , "s-l-c" , false ));
127- assertEquals ("some-long-command" , match (original , "soLoCo" , false ));
128- assertNotEquals ("some-long-command" , match (original , "SoLoCo" , false ));
129- assertEquals ("some-long-command" , match (original , "someCom" , false ));
118+ CommandLine cmd = new CommandLine (Model .CommandSpec .create ());
119+
120+ assertNotEquals ("--veryLongCamelCase" , match (original , "--VLCC" , false , cmd ));
121+ assertEquals ("--veryLongCamelCase" , match (original , "--very" , false , cmd ));
122+ assertEquals ("--veryLongCamelCase" , match (original , "--vLCC" , false , cmd ));
123+ assertEquals ("--veryLongCamelCase" , match (original , "--vCase" , false , cmd ));
124+
125+ assertEquals ("--super-long-option" , match (original , "--sup" , false , cmd ));
126+ assertNotEquals ("--super-long-option" , match (original , "--Sup" , false , cmd ));
127+ assertEquals ("--super-long-option" , match (original , "--sLO" , false , cmd ));
128+ assertEquals ("--super-long-option" , match (original , "--s-l-o" , false , cmd ));
129+ assertEquals ("--super-long-option" , match (original , "--s-lon" , false , cmd ));
130+ assertEquals ("--super-long-option" , match (original , "--s-opt" , false , cmd ));
131+ assertEquals ("--super-long-option" , match (original , "--sOpt" , false , cmd ));
132+
133+ assertNotEquals ("some-long-command" , match (original , "So" , false , cmd ));
134+ assertEquals ("some-long-command" , match (original , "so" , false , cmd ));
135+ assertEquals ("some-long-command" , match (original , "sLC" , false , cmd ));
136+ assertEquals ("some-long-command" , match (original , "s-l-c" , false , cmd ));
137+ assertEquals ("some-long-command" , match (original , "soLoCo" , false , cmd ));
138+ assertNotEquals ("some-long-command" , match (original , "SoLoCo" , false , cmd ));
139+ assertEquals ("some-long-command" , match (original , "someCom" , false , cmd ));
130140 }
131141
132142 @ Test
@@ -538,4 +548,19 @@ class App {
538548 assertEquals ("Unknown option: '--AB'" , ex .getMessage ());
539549 }
540550 }
551+
552+ @ Test
553+ public void testAbbreviatedOptionWithAttachedValue () {
554+ @ Command
555+ class Bean {
556+ @ Option (names = "--xxx-yyy" )
557+ int x ;
558+ }
559+ Bean bean = new Bean ();
560+ CommandLine cmd = new CommandLine (bean );
561+ cmd .setAbbreviatedOptionsAllowed (true );
562+ cmd .parseArgs ("--x-y=123" );
563+ assertEquals (123 , bean .x );
564+ }
565+
541566}
0 commit comments