Skip to content

Commit

Permalink
#321 added unit tests for default value provider and fixed code
Browse files Browse the repository at this point in the history
  • Loading branch information
NicolasMassart committed Aug 31, 2018
1 parent 457ede7 commit 08bf1ed
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/main/java/picocli/CommandLine.java
Original file line number Diff line number Diff line change
Expand Up @@ -5394,6 +5394,7 @@ private static boolean updateCommandAttributes(Command cmd, CommandSpec commandS
commandSpec.initVersion(cmd.version());
commandSpec.initHelpCommand(cmd.helpCommand());
commandSpec.initVersionProvider(cmd.versionProvider(), factory);
commandSpec.initDefaultValueProvider(cmd.defaultValueProvider(), factory);
UsageMessageSpec usageMessage = commandSpec.usageMessage();
usageMessage.initSynopsisHeading(cmd.synopsisHeading());
usageMessage.initCommandListHeading(cmd.commandListHeading());
Expand Down Expand Up @@ -6237,7 +6238,12 @@ private void applyDefaultValues(List<ArgSpec> required) throws Exception {
private void applyDefault(IDefaultValueProvider defaultValueProvider,
ArgSpec arg, List<ArgSpec> required) throws Exception {

String defaultValue = defaultValueProvider == null ? arg.defaultValue() : defaultValueProvider.defaultValue(arg) ;
boolean isDefaultOrInitialVaLuePresent = arg.defaultValue() != null || arg.initialValue() != null;

// Default value provider is only used if the argSpec doesn't already have a default
// value or an initial value
String defaultValue = defaultValueProvider != null && !isDefaultOrInitialVaLuePresent ?
defaultValueProvider.defaultValue(arg) : arg.defaultValue() ;

if (defaultValue == null) { return; }
if (tracer.isDebug()) {tracer.debug("Applying defaultValue (%s) to %s%n", defaultValue, arg);}
Expand Down
82 changes: 82 additions & 0 deletions src/test/java/picocli/CommandLineDefaultProviderTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package picocli;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import org.junit.Test;
import picocli.CommandLine.Command;
import picocli.CommandLine.IDefaultValueProvider;
import picocli.CommandLine.Model.ArgSpec;
import picocli.CommandLine.Option;
import picocli.CommandLine.Parameters;

public class CommandLineDefaultProviderTest {

static class TestDefaultProvider implements IDefaultValueProvider {
public String defaultValue(ArgSpec argSpec) {
return "Default provider string value";
}
}

@Command(defaultValueProvider = TestDefaultProvider.class)
static class App {
@Option(names = "-a")
private String optionStringFieldWithoutDefaultNorInitialValue;
@Option(names = "-b", defaultValue = "Annotated default value")
private String optionStringFieldWithAnnotatedDefault;
@Option(names = "-c")
private String optionStringFieldWithInitDefault = "Initial default value";

@Parameters(arity = "0..1")
private String paramStringFieldWithoutDefaultNorInitialValue;
@Parameters(arity = "0..1", defaultValue = "Annotated default value")
private String paramStringFieldWithAnnotatedDefault;
@Parameters(arity = "0..1")
private String paramStringFieldWithInitDefault = "Initial default value";

private String stringForSetterDefault;
@Option(names = "-d", defaultValue = "Annotated setter default value")
void setString(String val) { stringForSetterDefault = val; }
}


@Test
public void testCommandDefaultProviderByAnnotation() {

CommandLine cmd = new CommandLine(App.class);
cmd.parse();

App app = cmd.getCommand();
// if no default defined on the option, command default provider should be used
assertEquals("Default provider string value",app.optionStringFieldWithoutDefaultNorInitialValue);
assertEquals("Default provider string value",app.paramStringFieldWithoutDefaultNorInitialValue);
// if a default is defined on the option either by annotation or by initial value, it must
// override the default provider.
assertEquals("Annotated default value",app.optionStringFieldWithAnnotatedDefault);
assertEquals("Annotated default value",app.paramStringFieldWithAnnotatedDefault);

assertEquals("Initial default value",app.optionStringFieldWithInitDefault);
assertEquals("Initial default value",app.paramStringFieldWithInitDefault);

assertEquals("Annotated setter default value",app.stringForSetterDefault);

}

static class AppWithoutAnnotation {
@Option(names = "-a")
private String stringFieldWithoutDefaultNorInitialValue;
}

@Test
public void testCommandDefaultProviderSetting() {

CommandLine cmd = new CommandLine(App.class);
cmd.setDefaultValueProvider(new TestDefaultProvider());
cmd.parse();

App app = cmd.getCommand();
// if no default defined on the option, command default provider should be used
assertEquals("Default provider string value",app.optionStringFieldWithoutDefaultNorInitialValue);
}
}

0 comments on commit 08bf1ed

Please sign in to comment.