diff --git a/src/main/java/chapter14/Application.java b/src/main/java/chapter14/Application.java index e9acbe7..904f8d9 100644 --- a/src/main/java/chapter14/Application.java +++ b/src/main/java/chapter14/Application.java @@ -13,7 +13,7 @@ public static void main(String[] args) { String directory = arg.getString('d'); executeApplication(logging, port, directory); } catch (ArgsException e) { - System.out.printf("Argument error: %s\n", e.getMessage()); + System.out.printf("Argument error: %s\n", e.errorMessage()); } } diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index d3dd8bc..07e4ac8 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -2,148 +2,106 @@ import java.util.*; +import static chapter14.args.ArgsException.ErrorCode.*; + public class Args { - private String schema; - private Map marshalers = new HashMap<>(); - private Set argsFound = new HashSet<>(); - private Iterator currentArgument; - private List argsList; + private Map marshalers; + private Set argsFound; + private ListIterator currentArgument; public Args(String schema, String[] args) throws ArgsException { - this.schema = schema; - argsList = Arrays.asList(args); - parse(); - } + marshalers = new HashMap<>(); + argsFound = new HashSet<>(); - private void parse() throws ArgsException { - parseSchema(); - parseArguments(); + parseSchema(schema); + parseArgumentStrings(Arrays.asList(args)); } - private boolean parseSchema() throws ArgsException { + private void parseSchema(String schema) throws ArgsException { for (String element : schema.split(",")) { if (element.length() > 0) { parseSchemaElement(element.trim()); } } - return true; } private void parseSchemaElement(String element) throws ArgsException { char elementId = element.charAt(0); String elementTail = element.substring(1); validateSchemaElementId(elementId); - if (elementTail.length() == 0) { + if (elementTail.length() == 0) marshalers.put(elementId, new BooleanArgumentMarshaler()); - } else if (elementTail.equals("*")) { + else if (elementTail.equals("*")) marshalers.put(elementId, new StringArgumentMarshaler()); - } else if (elementTail.equals("#")) { + else if (elementTail.equals("#")) marshalers.put(elementId, new IntegerArgumentMarshaler()); - } else if (elementTail.equals("##")) { + else if (elementTail.equals("##")) marshalers.put(elementId, new DoubleArgumentMarshaler()); - } else { - throw new ArgsException(ArgsException.ErrorCode.INVALID_ARGUMENT_FORMAT, - elementId, elementTail); - } + else + throw new ArgsException(INVALID_ARGUMENT_FORMAT, elementId, elementTail); + } private void validateSchemaElementId(char elementId) throws ArgsException { if (!Character.isLetter(elementId)) { - throw new ArgsException(ArgsException.ErrorCode.INVALID_ARGUMENT_NAME, - elementId, null); - } - } - - private void parseArguments() throws ArgsException { - for (currentArgument = argsList.iterator(); currentArgument.hasNext(); ) { - String arg = currentArgument.next(); - parseArgument(arg); + throw new ArgsException(INVALID_ARGUMENT_NAME, elementId, null); } } - private void parseArgument(String arg) throws ArgsException { - if (arg.startsWith("-")) - parseElements(arg); - } - - private void parseElements(String arg) throws ArgsException { - for (int i = 1; i < arg.length(); i++) { - parseElement(arg.charAt(i)); + private void parseArgumentStrings(List argsList) throws ArgsException { + for (currentArgument = argsList.listIterator(); currentArgument.hasNext(); ) { + String argString = currentArgument.next(); + if (argString.startsWith("-")) { + parseArgumentCharacters(argString.substring(1)); + } else { + currentArgument.previous(); + break; + } } } - private void parseElement(char argChar) throws ArgsException { - if (setArgument(argChar)) - argsFound.add(argChar); - else { - throw new ArgsException(ArgsException.ErrorCode.UNEXPECTED_ARGUMENT, - argChar, null); + private void parseArgumentCharacters(String argChars) throws ArgsException { + for (int i = 0; i < argChars.length(); i++) { + parseArgumentCharacter(argChars.charAt(i)); } } - private boolean setArgument(char argChar) throws ArgsException { + private void parseArgumentCharacter(char argChar) throws ArgsException { ArgumentMarshaler m = marshalers.get(argChar); - if (m == null) - return false; - try { - m.set(currentArgument); - return true; - } catch (ArgsException e) { - e.setErrorArgumentId(argChar); - throw e; + if (m == null) { + throw new ArgsException(UNEXPECTED_ARGUMENT, argChar, null); + } else { + argsFound.add(argChar); + try { + m.set(currentArgument); + } catch (ArgsException e) { + e.setErrorArgumentId(argChar); + throw e; + } } } - public int cardinality() { - return argsFound.size(); + public boolean has(char arg) { + return argsFound.contains(arg); } - public String usage() { - if (schema.length() > 0) - return "-[" + schema + "]"; - else - return ""; + public int nextArgument() { + return currentArgument.nextIndex(); } public boolean getBoolean(char arg) { - ArgumentMarshaler am = marshalers.get(arg); - boolean b = false; - try { - b = am != null && (Boolean) am.get(); - } catch (ClassCastException e) { - b = false; - } - return b; + return BooleanArgumentMarshaler.getValue(marshalers.get(arg)); } public String getString(char arg) { - ArgumentMarshaler am = marshalers.get(arg); - try { - return am == null ? "" : (String) am.get(); - } catch (ClassCastException e) { - return ""; - } + return StringArgumentMarshaler.getValue(marshalers.get(arg)); } public int getInt(char arg) { - ArgumentMarshaler am = marshalers.get(arg); - try { - return am == null ? 0 : (Integer) am.get(); - } catch (ClassCastException e) { - return 0; - } + return IntegerArgumentMarshaler.getValue(marshalers.get(arg)); } 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); + return DoubleArgumentMarshaler.getValue(marshalers.get(arg)); } } diff --git a/src/main/java/chapter14/args/ArgsException.java b/src/main/java/chapter14/args/ArgsException.java index 4e9addb..5f6b985 100644 --- a/src/main/java/chapter14/args/ArgsException.java +++ b/src/main/java/chapter14/args/ArgsException.java @@ -51,10 +51,10 @@ public void setErrorCode(ErrorCode errorCode) { this.errorCode = errorCode; } - public String errorMessage() throws Exception { + public String errorMessage() { switch (errorCode) { case OK: - throw new Exception("TILT: Should not get here."); + return "TILT: Should not get here."; case UNEXPECTED_ARGUMENT: return String.format("Argument(s) -%c unexpected.", errorArgumentId); case MISSING_STRING: diff --git a/src/main/java/chapter14/args/ArgumentMarshaler.java b/src/main/java/chapter14/args/ArgumentMarshaler.java index 8a641aa..ebf4a48 100644 --- a/src/main/java/chapter14/args/ArgumentMarshaler.java +++ b/src/main/java/chapter14/args/ArgumentMarshaler.java @@ -4,6 +4,4 @@ public interface ArgumentMarshaler { void set(Iterator currentArgument) throws ArgsException; - - Object get(); } diff --git a/src/main/java/chapter14/args/BooleanArgumentMarshaler.java b/src/main/java/chapter14/args/BooleanArgumentMarshaler.java index 4619a7e..8ec3e0e 100644 --- a/src/main/java/chapter14/args/BooleanArgumentMarshaler.java +++ b/src/main/java/chapter14/args/BooleanArgumentMarshaler.java @@ -10,8 +10,11 @@ public void set(Iterator currentArgument) throws ArgsException { booleanValue = true; } - @Override - public Object get() { - return booleanValue; + public static boolean getValue(ArgumentMarshaler am) { + if (am != null && am instanceof BooleanArgumentMarshaler) { + return ((BooleanArgumentMarshaler) am).booleanValue; + } else { + return false; + } } } \ No newline at end of file diff --git a/src/main/java/chapter14/args/DoubleArgumentMarshaler.java b/src/main/java/chapter14/args/DoubleArgumentMarshaler.java index 16544d3..e737b01 100644 --- a/src/main/java/chapter14/args/DoubleArgumentMarshaler.java +++ b/src/main/java/chapter14/args/DoubleArgumentMarshaler.java @@ -22,8 +22,11 @@ public void set(Iterator currentArgument) throws ArgsException { } } - @Override - public Object get() { - return doubleValue; + public static double getValue(ArgumentMarshaler am) { + if (am != null && am instanceof DoubleArgumentMarshaler) { + return ((DoubleArgumentMarshaler) am).doubleValue; + } else { + return 0.0; + } } } \ No newline at end of file diff --git a/src/main/java/chapter14/args/IntegerArgumentMarshaler.java b/src/main/java/chapter14/args/IntegerArgumentMarshaler.java index ee040a5..5162230 100644 --- a/src/main/java/chapter14/args/IntegerArgumentMarshaler.java +++ b/src/main/java/chapter14/args/IntegerArgumentMarshaler.java @@ -22,8 +22,11 @@ public void set(Iterator currentArgument) throws ArgsException { } } - @Override - public Object get() { - return intValue; + public static int getValue(ArgumentMarshaler am) { + if (am != null && am instanceof IntegerArgumentMarshaler) { + return ((IntegerArgumentMarshaler) am).intValue; + } else { + return 0; + } } } \ No newline at end of file diff --git a/src/main/java/chapter14/args/StringArgumentMarshaler.java b/src/main/java/chapter14/args/StringArgumentMarshaler.java index 2eef6d9..b0698e4 100644 --- a/src/main/java/chapter14/args/StringArgumentMarshaler.java +++ b/src/main/java/chapter14/args/StringArgumentMarshaler.java @@ -17,8 +17,11 @@ public void set(Iterator currentArgument) throws ArgsException { } } - @Override - public Object get() { - return stringValue; + public static String getValue(ArgumentMarshaler am) { + if (am != null && am instanceof StringArgumentMarshaler) { + return ((StringArgumentMarshaler) am).stringValue; + } else { + return ""; + } } } \ No newline at end of file diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index b28ab04..0b331a2 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -20,7 +20,7 @@ void noSchemaAndArguments() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isZero(); + assertThat(args.nextArgument()).isZero(); } @DisplayName("schema가 없고 argument가 1개 있는 경우") @@ -52,7 +52,6 @@ void multipleSchemasButNoArguments() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isZero(); assertThat(args.has('x')).isFalse(); assertThat(args.has('y')).isFalse(); assertThat(args.has('z')).isFalse(); @@ -108,7 +107,6 @@ void spacesInFormat() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isEqualTo(2); assertThat(args.has('x')).isTrue(); assertThat(args.has('y')).isTrue(); } @@ -124,7 +122,6 @@ void simpleBooleanPresent() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isOne(); assertThat(args.getBoolean('x')).isTrue(); } @@ -139,7 +136,6 @@ void simpleBooleanMultiplePresent() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isEqualTo(2); assertThat(args.has('x')).isTrue(); assertThat(args.has('y')).isTrue(); assertThat(args.has('z')).isFalse(); @@ -172,7 +168,6 @@ void simpleStringPresent() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isOne(); assertThat(args.has('x')).isTrue(); assertThat(args.getString('x')).isEqualTo("param"); } @@ -188,7 +183,6 @@ void simpleStringMultiplePresent() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isEqualTo(2); assertThat(args.has('x')).isTrue(); assertThat(args.has('y')).isTrue(); assertThat(args.has('z')).isFalse(); @@ -221,7 +215,6 @@ void simpleIntPresent() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isOne(); assertThat(args.has('x')).isTrue(); assertThat(args.getInt('x')).isEqualTo(42); } @@ -237,7 +230,6 @@ void simpleIntMultiplePresent() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isEqualTo(2); assertThat(args.has('x')).isTrue(); assertThat(args.has('y')).isTrue(); assertThat(args.has('z')).isFalse(); @@ -270,7 +262,6 @@ void simpleDoublePresent() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.cardinality()).isOne(); assertThat(args.has('x')).isTrue(); assertThat(args.getDouble('x')).isEqualTo(42.3); } diff --git a/src/test/java/chapter14/args/BooleanArgumentMarshalerTest.java b/src/test/java/chapter14/args/BooleanArgumentMarshalerTest.java new file mode 100644 index 0000000..2b7f28d --- /dev/null +++ b/src/test/java/chapter14/args/BooleanArgumentMarshalerTest.java @@ -0,0 +1,52 @@ +package chapter14.args; + +import org.junit.jupiter.api.Test; + +import java.util.Iterator; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + + +class BooleanArgumentMarshalerTest { + + @Test + void getValueNotPresent() { + //given + ArgumentMarshaler am = new BooleanArgumentMarshaler(); + + //when, then + assertThat(BooleanArgumentMarshaler.getValue(am)).isFalse(); + } + + @Test + void getValuePresent() throws ArgsException { + //given + Iterator list = List.of("test").iterator(); + + //when + ArgumentMarshaler am = new BooleanArgumentMarshaler(); + am.set(list); + + //then + assertThat(BooleanArgumentMarshaler.getValue(am)).isTrue(); + } + + @Test + void getValueNotEqualsType() throws ArgsException { + //given + Iterator list = List.of("param").iterator(); + + //when + ArgumentMarshaler otherType = new StringArgumentMarshaler(); + otherType.set(list); + + //then + assertThat(BooleanArgumentMarshaler.getValue(otherType)).isFalse(); + } + + @Test + void getValueNull() { + assertThat(BooleanArgumentMarshaler.getValue(null)).isFalse(); + } +} \ No newline at end of file diff --git a/src/test/java/chapter14/args/DoubleArgumentMarshalerTest.java b/src/test/java/chapter14/args/DoubleArgumentMarshalerTest.java index 609941e..354c8c2 100644 --- a/src/test/java/chapter14/args/DoubleArgumentMarshalerTest.java +++ b/src/test/java/chapter14/args/DoubleArgumentMarshalerTest.java @@ -11,7 +11,6 @@ import static org.assertj.core.api.Assertions.catchException; class DoubleArgumentMarshalerTest { - private ArgumentMarshaler am = new DoubleArgumentMarshaler(); @DisplayName("값을 파싱할 수 없는 경우") @Test @@ -20,6 +19,7 @@ void invalidDouble() { Iterator argument = List.of("Forty two").iterator(); //when + ArgumentMarshaler am = new DoubleArgumentMarshaler(); Exception exception = catchException(() -> am.set(argument)); //then @@ -37,6 +37,7 @@ void missingDouble() { Iterator argument = Collections.emptyIterator(); //when + ArgumentMarshaler am = new DoubleArgumentMarshaler(); Exception exception = catchException(() -> am.set(argument)); //then @@ -45,4 +46,44 @@ void missingDouble() { ArgsException e = (ArgsException) exception; assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_DOUBLE); } + + @Test + void getValueNotPresent() { + //given + ArgumentMarshaler am = new DoubleArgumentMarshaler(); + + //when, then + assertThat(DoubleArgumentMarshaler.getValue(am)).isZero(); + } + + @Test + void getValuePresent() throws ArgsException { + //given + Iterator list = List.of("42.3").iterator(); + + //when + ArgumentMarshaler am = new DoubleArgumentMarshaler(); + am.set(list); + + //then + assertThat(DoubleArgumentMarshaler.getValue(am)).isEqualTo(42.3); + } + + @Test + void getValueNotEqualsType() throws ArgsException { + //given + Iterator list = List.of("param").iterator(); + + //when + ArgumentMarshaler otherType = new StringArgumentMarshaler(); + otherType.set(list); + + //then + assertThat(DoubleArgumentMarshaler.getValue(otherType)).isZero(); + } + + @Test + void getValueNull() { + assertThat(DoubleArgumentMarshaler.getValue(null)).isZero(); + } } \ No newline at end of file diff --git a/src/test/java/chapter14/args/IntegerArgumentMarshalerTest.java b/src/test/java/chapter14/args/IntegerArgumentMarshalerTest.java index 9135c20..9c94d1e 100644 --- a/src/test/java/chapter14/args/IntegerArgumentMarshalerTest.java +++ b/src/test/java/chapter14/args/IntegerArgumentMarshalerTest.java @@ -11,7 +11,6 @@ import static org.assertj.core.api.Assertions.catchException; class IntegerArgumentMarshalerTest { - private ArgumentMarshaler am = new IntegerArgumentMarshaler(); @DisplayName("Integer Argument 값을 파싱할 수 없는 경우") @Test @@ -20,6 +19,7 @@ void invalidInteger() { Iterator argument = List.of("Forty two").iterator(); //when + ArgumentMarshaler am = new IntegerArgumentMarshaler(); Exception exception = catchException(() -> am.set(argument)); //then @@ -37,6 +37,7 @@ void missingInteger() { Iterator argument = Collections.emptyIterator(); //when + ArgumentMarshaler am = new IntegerArgumentMarshaler(); Exception exception = catchException(() -> am.set(argument)); //then @@ -45,4 +46,44 @@ void missingInteger() { ArgsException e = (ArgsException) exception; assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_INTEGER); } + + @Test + void getValueNotPresent() { + //given + ArgumentMarshaler am = new IntegerArgumentMarshaler(); + + //when, then + assertThat(IntegerArgumentMarshaler.getValue(am)).isZero(); + } + + @Test + void getValuePresent() throws ArgsException { + //given + Iterator list = List.of("42").iterator(); + + //when + ArgumentMarshaler am = new IntegerArgumentMarshaler(); + am.set(list); + + //then + assertThat(IntegerArgumentMarshaler.getValue(am)).isEqualTo(42); + } + + @Test + void getValueNotEqualsType() throws ArgsException { + //given + Iterator list = List.of("param").iterator(); + + //when + ArgumentMarshaler otherType = new StringArgumentMarshaler(); + otherType.set(list); + + //then + assertThat(IntegerArgumentMarshaler.getValue(otherType)).isZero(); + } + + @Test + void getValueNull() { + assertThat(IntegerArgumentMarshaler.getValue(null)).isZero(); + } } \ No newline at end of file diff --git a/src/test/java/chapter14/args/StringArgumentMarshalerTest.java b/src/test/java/chapter14/args/StringArgumentMarshalerTest.java index 9f7772c..fed79ca 100644 --- a/src/test/java/chapter14/args/StringArgumentMarshalerTest.java +++ b/src/test/java/chapter14/args/StringArgumentMarshalerTest.java @@ -5,12 +5,12 @@ import java.util.Collections; import java.util.Iterator; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchException; class StringArgumentMarshalerTest { - private ArgumentMarshaler am = new StringArgumentMarshaler(); @DisplayName("Argument 값이 없는 경우") @Test @@ -19,6 +19,7 @@ void missingString() { Iterator argument = Collections.emptyIterator(); //when + ArgumentMarshaler am = new StringArgumentMarshaler(); Exception exception = catchException(() -> am.set(argument)); //then @@ -27,4 +28,46 @@ void missingString() { ArgsException e = (ArgsException) exception; assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_STRING); } + + + @Test + void getValueNotPresent() { + //given + ArgumentMarshaler am = new StringArgumentMarshaler(); + + //when, then + assertThat(StringArgumentMarshaler.getValue(am)).isEmpty(); + } + + @Test + void getValuePresent() throws ArgsException { + //given + Iterator list = List.of("param").iterator(); + + //when + ArgumentMarshaler am = new StringArgumentMarshaler(); + am.set(list); + + //then + assertThat(StringArgumentMarshaler.getValue(am)).isEqualTo("param"); + } + + @Test + void getValueNotEqualsType() throws ArgsException { + //given + Iterator list = List.of("42").iterator(); + + //when + ArgumentMarshaler otherType = new IntegerArgumentMarshaler(); + otherType.set(list); + + //then + assertThat(StringArgumentMarshaler.getValue(otherType)).isEmpty(); + } + + + @Test + void getValueNull() { + assertThat(StringArgumentMarshaler.getValue(null)).isEmpty(); + } } \ No newline at end of file