Wrong arity for default boolean type

- Set boolean type arity zero or more as default.
- Fixes #675
This commit is contained in:
Janne Valkealahti
2023-02-27 10:12:09 +00:00
parent fd73531986
commit c46bf91dae
4 changed files with 90 additions and 8 deletions

View File

@@ -255,10 +255,10 @@ class CommandRegistrationFactoryBean implements FactoryBean<CommandRegistration>
}
else {
if (ClassUtils.isAssignable(boolean.class, parameterType)) {
optionSpec.arity(OptionArity.ZERO);
optionSpec.arity(OptionArity.ZERO_OR_ONE);
}
else if (ClassUtils.isAssignable(Boolean.class, parameterType)) {
optionSpec.arity(OptionArity.ZERO);
optionSpec.arity(OptionArity.ZERO_OR_ONE);
}
}
@@ -298,10 +298,10 @@ class CommandRegistrationFactoryBean implements FactoryBean<CommandRegistration>
optionSpec.required();
optionSpec.position(mp.getParameterIndex());
if (ClassUtils.isAssignable(boolean.class, parameterType)) {
optionSpec.arity(OptionArity.ZERO);
optionSpec.arity(OptionArity.ZERO_OR_ONE);
}
else if (ClassUtils.isAssignable(Boolean.class, parameterType)) {
optionSpec.arity(OptionArity.ZERO);
optionSpec.arity(OptionArity.ZERO_OR_ONE);
}
else {
optionSpec.arity(OptionArity.EXACTLY_ONE);

View File

@@ -144,6 +144,71 @@ class CommandRegistrationFactoryBeanTests {
}
}
@Test
void setsOptionValuesWithBoolean() {
configCommon(OptionValuesWithBoolean.class, new OptionValuesWithBoolean(), "command1", new Class[] { boolean.class })
.run((context) -> {
CommandRegistrationFactoryBean fb = context.getBean(FACTORYBEANREF,
CommandRegistrationFactoryBean.class);
assertThat(fb).isNotNull();
CommandRegistration registration = fb.getObject();
assertThat(registration).isNotNull();
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
});
configCommon(OptionValuesWithBoolean.class, new OptionValuesWithBoolean(), "command2", new Class[] { Boolean.class })
.run((context) -> {
CommandRegistrationFactoryBean fb = context.getBean(FACTORYBEANREF,
CommandRegistrationFactoryBean.class);
assertThat(fb).isNotNull();
CommandRegistration registration = fb.getObject();
assertThat(registration).isNotNull();
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
});
configCommon(OptionValuesWithBoolean.class, new OptionValuesWithBoolean(), "command3", new Class[] { Boolean.class })
.run((context) -> {
CommandRegistrationFactoryBean fb = context.getBean(FACTORYBEANREF,
CommandRegistrationFactoryBean.class);
assertThat(fb).isNotNull();
CommandRegistration registration = fb.getObject();
assertThat(registration).isNotNull();
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
});
configCommon(OptionValuesWithBoolean.class, new OptionValuesWithBoolean(), "command4", new Class[] { Boolean.class })
.run((context) -> {
CommandRegistrationFactoryBean fb = context.getBean(FACTORYBEANREF,
CommandRegistrationFactoryBean.class);
assertThat(fb).isNotNull();
CommandRegistration registration = fb.getObject();
assertThat(registration).isNotNull();
assertThat(registration.getOptions().get(0).getArityMin()).isEqualTo(0);
assertThat(registration.getOptions().get(0).getArityMax()).isEqualTo(1);
});
}
@Command
private static class OptionValuesWithBoolean {
@Command
void command1(@Option(defaultValue = "false") boolean arg) {
}
@Command
void command2(@Option(defaultValue = "false") Boolean arg) {
}
@Command
void command3(@Option Boolean arg) {
}
@Command
void command4(Boolean arg) {
}
}
private <T> ApplicationContextRunner configCommon(Class<T> type, T bean) {
return configCommon(type, bean, "command", new Class[0]);
}