Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 47 additions & 16 deletions src/main/java/chapter14/args/Args.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public class Args {
private List<String> argsList;

enum ErrorCode {
OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER, UNEXPECTED_ARGUMENT
OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER,
UNEXPECTED_ARGUMENT, MISSING_DOUBLE, INVALID_DOUBLE
}

public Args(String schema, String[] args) throws ParseException {
Expand Down Expand Up @@ -50,12 +51,14 @@ private void parseSchemaElement(String element) throws ParseException {
char elementId = element.charAt(0);
String elementTail = element.substring(1);
validateSchemaElementId(elementId);
if (isBooleanSchemaElement(elementTail)) {
if (elementTail.length() == 0) {
marshalers.put(elementId, new BooleanArgumentMarshaler());
} else if (isStringSchemaElement(elementTail)) {
} else if (elementTail.equals("*")) {
marshalers.put(elementId, new StringArgumentMarshaler());
} else if (isIntegerSchemaElement(elementTail)) {
} else if (elementTail.equals("#")) {
marshalers.put(elementId, new IntegerArgumentMarshaler());
} else if (elementTail.equals("##")) {
marshalers.put(elementId, new DoubleArgumentMarshaler());
} else {
throw new ParseException(
String.format("Argument: %c has invalid format: %s.",
Expand All @@ -70,18 +73,6 @@ private void validateSchemaElementId(char elementId) throws ParseException {
}
}

private boolean isStringSchemaElement(String elementTail) {
return elementTail.equals("*");
}

private boolean isBooleanSchemaElement(String elementTail) {
return elementTail.length() == 0;
}

private boolean isIntegerSchemaElement(String elementTail) {
return elementTail.equals("#");
}

private boolean parseArguments() throws ArgsException {
for (currentArgument = argsList.iterator(); currentArgument.hasNext(); ) {
String arg = currentArgument.next();
Expand Down Expand Up @@ -151,6 +142,12 @@ public String errorMessage() throws Exception {
case MISSING_INTEGER:
return String.format("Could not find integer parameter for -%c.",
errorArgumentId);
case INVALID_DOUBLE:
return String.format("Argument -%c expects an double but was '%s'.",
errorArgumentId, errorParameter);
case MISSING_DOUBLE:
return String.format("Could not find double parameter for -%c.",
errorArgumentId);
}
return "";

Expand Down Expand Up @@ -195,6 +192,15 @@ public boolean getBoolean(char arg) {
return b;
}

public double getDouble(char arg) {
ArgumentMarshaler am = marshalers.get(arg);
try {
return am == null ? 0.0 : (Double) am.get();
} catch (ClassCastException e) {
return 0.0;
}
}

public boolean has(char arg) {
return argsFound.contains(arg);
}
Expand Down Expand Up @@ -269,4 +275,29 @@ public Object get() {
return intValue;
}
}

private class DoubleArgumentMarshaler implements ArgumentMarshaler {
private double doubleValue = 0;

@Override
public void set(Iterator<String> currentArgument) throws ArgsException {
String parameter = null;
try {
parameter = currentArgument.next();
doubleValue = Double.parseDouble(parameter);
} catch (NoSuchElementException e) {
errorCode = ErrorCode.MISSING_DOUBLE;
throw new ArgsException();
} catch (NumberFormatException e) {
errorParameter = parameter;
errorCode = ErrorCode.INVALID_DOUBLE;
throw new ArgsException();
}
}

@Override
public Object get() {
return doubleValue;
}
}
}
67 changes: 67 additions & 0 deletions src/test/java/chapter14/args/ArgsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,72 @@ void invalidInteger() throws Exception {
assertThat(args.errorMessage()).isEqualTo("Argument -x expects an integer but was 'Forty two'.");
}

@DisplayName("double 값이 있는 경우")
@Test
void simpleDoublePresent() throws Exception {
//given
String schema = "x##";
String[] arguments = new String[]{"-x", "42.3"};

//when
Args args = new Args(schema, arguments);

//then
assertThat(args.isValid()).isTrue();
assertThat(args.cardinality()).isOne();
assertThat(args.has('x')).isTrue();
assertThat(args.getDouble('x')).isEqualTo(42.3);
}

@DisplayName("Double 값이 없는 경우")
@Test
void simpleDoubleNotPresent() throws Exception {
//given
Args args = new Args("x##", new String[]{});

//when
double actual = args.getDouble('y');

//then
assertThat(actual).isZero();
}

@DisplayName("Double Argument 값이 없는 경우")
@Test
void missingDouble() throws Exception {
//given
String schema = "x##";
String[] arguments = new String[]{"-x"}; // missing

//when
Args args = new Args(schema, arguments);

//then
assertThat(args.isValid()).isFalse();
assertThat(args.cardinality()).isZero();
assertThat(args.has('x')).isFalse();
assertThat(args.getDouble('x')).isZero();
assertThat(args.errorMessage()).isEqualTo("Could not find double parameter for -x.");
}

@DisplayName("Double Argument 값을 파싱할 수 없는 경우")
@Test
void invalidDouble() throws Exception {
//given
String schema = "x##";
String[] arguments = new String[]{"-x", "Forty two"};

//when
Args args = new Args(schema, arguments);

//then
assertThat(args.isValid()).isFalse();
assertThat(args.cardinality()).isZero();
assertThat(args.has('x')).isFalse();
assertThat(args.getDouble('x')).isZero();
assertThat(args.errorMessage()).isEqualTo("Argument -x expects an double but was 'Forty two'.");
}

@DisplayName("잘못된 타입으로 호출한 경우")
@Test
void invalidType() throws Exception {
Expand All @@ -343,6 +409,7 @@ void invalidType() throws Exception {
assertThat(args.getBoolean('x')).isFalse(); // x is type int
assertThat(args.getString('x')).isEmpty(); // x is type int
assertThat(args.getInt('y')).isZero(); // y is type String
assertThat(args.getDouble('y')).isZero(); // y is type String
}

@DisplayName("유효한 args에서 errorMessage를 조회할 경우 Excpetion이 발생한다")
Expand Down