From 7ff20f21e4c0a30872fd691b8982a51f5612d26c Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 11:14:19 +0900 Subject: [PATCH 1/3] =?UTF-8?q?test:=20double=20=EC=9C=A0=ED=98=95=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chapter14/args/ArgsTest.java | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index ab97b0e..fcfe149 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -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 { @@ -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이 발생한다") From fc13726378a2a00b75d303eef3190d3899894c32 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 11:22:34 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20isxxxSchemaElement()=20?= =?UTF-8?q?=EC=9D=B8=EB=9D=BC=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=ED=95=98=EC=97=AC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 60e6b82..9aed572 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -50,11 +50,11 @@ 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 { throw new ParseException( @@ -70,18 +70,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(); From c7040373d444b324b0fdaa137872188e3b3dcd6c Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 11:50:49 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20double=20=EC=9C=A0=ED=98=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 45 +++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 9aed572..e45390b 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -16,7 +16,8 @@ public class Args { private List 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 { @@ -56,6 +57,8 @@ private void parseSchemaElement(String element) throws ParseException { marshalers.put(elementId, new StringArgumentMarshaler()); } 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.", @@ -139,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 ""; @@ -183,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); } @@ -257,4 +275,29 @@ public Object get() { return intValue; } } + + private class DoubleArgumentMarshaler implements ArgumentMarshaler { + private double doubleValue = 0; + + @Override + public void set(Iterator 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; + } + } }