Skip to content

Commit c46bf91

Browse files
committed
Wrong arity for default boolean type
- Set boolean type arity zero or more as default. - Fixes #675
1 parent fd73531 commit c46bf91

File tree

4 files changed

+90
-8
lines changed

4 files changed

+90
-8
lines changed

spring-shell-core/src/main/java/org/springframework/shell/command/annotation/support/CommandRegistrationFactoryBean.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -255,10 +255,10 @@ private void onCommandParameter(MethodParameter mp, Builder builder) {
255255
}
256256
else {
257257
if (ClassUtils.isAssignable(boolean.class, parameterType)) {
258-
optionSpec.arity(OptionArity.ZERO);
258+
optionSpec.arity(OptionArity.ZERO_OR_ONE);
259259
}
260260
else if (ClassUtils.isAssignable(Boolean.class, parameterType)) {
261-
optionSpec.arity(OptionArity.ZERO);
261+
optionSpec.arity(OptionArity.ZERO_OR_ONE);
262262
}
263263
}
264264

@@ -298,10 +298,10 @@ else if (ClassUtils.isAssignable(boolean.class, parameterType)){
298298
optionSpec.required();
299299
optionSpec.position(mp.getParameterIndex());
300300
if (ClassUtils.isAssignable(boolean.class, parameterType)) {
301-
optionSpec.arity(OptionArity.ZERO);
301+
optionSpec.arity(OptionArity.ZERO_OR_ONE);
302302
}
303303
else if (ClassUtils.isAssignable(Boolean.class, parameterType)) {
304-
optionSpec.arity(OptionArity.ZERO);
304+
optionSpec.arity(OptionArity.ZERO_OR_ONE);
305305
}
306306
else {
307307
optionSpec.arity(OptionArity.EXACTLY_ONE);

spring-shell-core/src/test/java/org/springframework/shell/command/annotation/support/CommandRegistrationFactoryBeanTests.java

+65
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,71 @@ public AvailabilityProvider testAvailability() {
144144
}
145145
}
146146

147+
148+
@Test
149+
void setsOptionValuesWithBoolean() {
150+
configCommon(OptionValuesWithBoolean.class, new OptionValuesWithBoolean(), "command1", new Class[] { boolean.class })
151+
.run((context) -> {
152+
CommandRegistrationFactoryBean fb = context.getBean(FACTORYBEANREF,
153+
CommandRegistrationFactoryBean.class);
154+
assertThat(fb).isNotNull();
155+
CommandRegistration registration = fb.getObject();
156+
assertThat(registration).isNotNull();
157+
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
158+
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
159+
});
160+
configCommon(OptionValuesWithBoolean.class, new OptionValuesWithBoolean(), "command2", new Class[] { Boolean.class })
161+
.run((context) -> {
162+
CommandRegistrationFactoryBean fb = context.getBean(FACTORYBEANREF,
163+
CommandRegistrationFactoryBean.class);
164+
assertThat(fb).isNotNull();
165+
CommandRegistration registration = fb.getObject();
166+
assertThat(registration).isNotNull();
167+
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
168+
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
169+
});
170+
configCommon(OptionValuesWithBoolean.class, new OptionValuesWithBoolean(), "command3", new Class[] { Boolean.class })
171+
.run((context) -> {
172+
CommandRegistrationFactoryBean fb = context.getBean(FACTORYBEANREF,
173+
CommandRegistrationFactoryBean.class);
174+
assertThat(fb).isNotNull();
175+
CommandRegistration registration = fb.getObject();
176+
assertThat(registration).isNotNull();
177+
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
178+
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
179+
});
180+
configCommon(OptionValuesWithBoolean.class, new OptionValuesWithBoolean(), "command4", new Class[] { Boolean.class })
181+
.run((context) -> {
182+
CommandRegistrationFactoryBean fb = context.getBean(FACTORYBEANREF,
183+
CommandRegistrationFactoryBean.class);
184+
assertThat(fb).isNotNull();
185+
CommandRegistration registration = fb.getObject();
186+
assertThat(registration).isNotNull();
187+
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
188+
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
189+
});
190+
}
191+
192+
@Command
193+
private static class OptionValuesWithBoolean {
194+
195+
@Command
196+
void command1(@Option(defaultValue = "false") boolean arg) {
197+
}
198+
199+
@Command
200+
void command2(@Option(defaultValue = "false") Boolean arg) {
201+
}
202+
203+
@Command
204+
void command3(@Option Boolean arg) {
205+
}
206+
207+
@Command
208+
void command4(Boolean arg) {
209+
}
210+
}
211+
147212
private <T> ApplicationContextRunner configCommon(Class<T> type, T bean) {
148213
return configCommon(type, bean, "command", new Class[0]);
149214
}

spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardMethodTargetRegistrar.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,10 @@ else if ("-".equals(shellMapping.prefix()) && stripped.length() == 1) {
157157
}
158158
else {
159159
if (ClassUtils.isAssignable(boolean.class, parameterType)) {
160-
optionSpec.arity(OptionArity.ZERO);
160+
optionSpec.arity(OptionArity.ZERO_OR_ONE);
161161
}
162162
else if (ClassUtils.isAssignable(Boolean.class, parameterType)) {
163-
optionSpec.arity(OptionArity.ZERO);
163+
optionSpec.arity(OptionArity.ZERO_OR_ONE);
164164
}
165165
}
166166
if (!ObjectUtils.nullSafeEquals(so.defaultValue(), ShellOption.NONE)
@@ -198,10 +198,10 @@ else if (ClassUtils.isAssignable(Boolean.class, parameterType)) {
198198
.required()
199199
.position(mp.getParameterIndex());
200200
if (ClassUtils.isAssignable(boolean.class, parameterType)) {
201-
optionSpec.arity(OptionArity.ZERO);
201+
optionSpec.arity(OptionArity.ZERO_OR_ONE);
202202
}
203203
else if (ClassUtils.isAssignable(Boolean.class, parameterType)) {
204-
optionSpec.arity(OptionArity.ZERO);
204+
optionSpec.arity(OptionArity.ZERO_OR_ONE);
205205
}
206206
else {
207207
optionSpec.arity(OptionArity.EXACTLY_ONE);

spring-shell-standard/src/test/java/org/springframework/shell/standard/StandardMethodTargetRegistrarTests.java

+17
Original file line numberDiff line numberDiff line change
@@ -417,16 +417,29 @@ public void testOptionValuesWithBoolean() {
417417
assertThat(catalog.getRegistrations().get("foo1").getOptions()).hasSize(1);
418418
assertThat(catalog.getRegistrations().get("foo1").getOptions().get(0).getDefaultValue()).isEqualTo("false");
419419
assertThat(catalog.getRegistrations().get("foo1").getOptions().get(0).isRequired()).isFalse();
420+
assertThat(catalog.getRegistrations().get("foo1").getOptions().get(0).getArityMin()).isEqualTo(0);
421+
assertThat(catalog.getRegistrations().get("foo1").getOptions().get(0).getArityMax()).isEqualTo(1);
420422

421423
assertThat(catalog.getRegistrations().get("foo2")).isNotNull();
422424
assertThat(catalog.getRegistrations().get("foo2").getOptions()).hasSize(1);
423425
assertThat(catalog.getRegistrations().get("foo2").getOptions().get(0).getDefaultValue()).isEqualTo("true");
424426
assertThat(catalog.getRegistrations().get("foo2").getOptions().get(0).isRequired()).isFalse();
427+
assertThat(catalog.getRegistrations().get("foo2").getOptions().get(0).getArityMin()).isEqualTo(0);
428+
assertThat(catalog.getRegistrations().get("foo2").getOptions().get(0).getArityMax()).isEqualTo(1);
425429

426430
assertThat(catalog.getRegistrations().get("foo3")).isNotNull();
427431
assertThat(catalog.getRegistrations().get("foo3").getOptions()).hasSize(1);
428432
assertThat(catalog.getRegistrations().get("foo3").getOptions().get(0).isRequired()).isFalse();
429433
assertThat(catalog.getRegistrations().get("foo3").getOptions().get(0).getDefaultValue()).isEqualTo("false");
434+
assertThat(catalog.getRegistrations().get("foo3").getOptions().get(0).getArityMin()).isEqualTo(0);
435+
assertThat(catalog.getRegistrations().get("foo3").getOptions().get(0).getArityMax()).isEqualTo(1);
436+
437+
assertThat(catalog.getRegistrations().get("foo4")).isNotNull();
438+
assertThat(catalog.getRegistrations().get("foo4").getOptions()).hasSize(1);
439+
assertThat(catalog.getRegistrations().get("foo4").getOptions().get(0).isRequired()).isTrue();
440+
assertThat(catalog.getRegistrations().get("foo4").getOptions().get(0).getDefaultValue()).isNull();
441+
assertThat(catalog.getRegistrations().get("foo4").getOptions().get(0).getArityMin()).isEqualTo(0);
442+
assertThat(catalog.getRegistrations().get("foo4").getOptions().get(0).getArityMax()).isEqualTo(1);
430443
}
431444

432445
@ShellComponent
@@ -443,6 +456,10 @@ public void foo2(@ShellOption(defaultValue = "true") boolean arg1) {
443456
@ShellMethod(value = "foo3")
444457
public void foo3(@ShellOption boolean arg1) {
445458
}
459+
460+
@ShellMethod(value = "foo4")
461+
public void foo4(boolean arg1) {
462+
}
446463
}
447464

448465
@Test

0 commit comments

Comments
 (0)