From f8e398bf00a90b53f145baca603b7463a8513ed9 Mon Sep 17 00:00:00 2001 From: viiviii Date: Wed, 11 May 2022 17:06:23 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20int=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/Application.java | 9 ++-- src/main/java/chapter14/args/Args.java | 53 +++++++++++++++++++++++- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/main/java/chapter14/Application.java b/src/main/java/chapter14/Application.java index e01e518..ca77f84 100644 --- a/src/main/java/chapter14/Application.java +++ b/src/main/java/chapter14/Application.java @@ -8,17 +8,18 @@ class Application { public static void main(String[] args) { try { - Args arg = new Args("l,d*", args); + Args arg = new Args("l,p#,d*", args); boolean logging = arg.getBoolean('l'); + int port = arg.getInt('p'); String directory = arg.getString('d'); - executeApplication(logging, directory); + executeApplication(logging, port, directory); } catch (ParseException e) { System.out.printf("Parse error: %s\n", e.getMessage()); } } // stub - private static void executeApplication(boolean logging, String directory) { - System.out.printf("logging: %b, directory: %s\n", logging, directory); + private static void executeApplication(boolean logging, int port, String directory) { + System.out.printf("logging: %b, port: %d, directory: %s\n", logging, port, directory); } } diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index add22cc..3a6f136 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -10,12 +10,14 @@ public class Args { private Set unexpectedArguments = new TreeSet<>(); private Map booleanArgs = new HashMap<>(); private Map stringArgs = new HashMap<>(); + private Map intArgs = new HashMap<>(); private Set argsFound = new HashSet<>(); private int currentArgument; private char errorArgument = '\0'; + private String errorParameter = "TILT"; enum ErrorCode { - OK, MISSING_STRING + OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER } private ErrorCode errorCode = ErrorCode.OK; @@ -52,6 +54,8 @@ private void parseSchemaElement(String element) throws ParseException { parseBooleanSchemaElement(elementId); else if (isStringSchemaElement(elementTail)) parseStringSchemaElement(elementId); + else if (isIntegerSchemaElement(elementTail)) + parseIntegerSchemaElement(elementId); } private void validateSchemaElementId(char elementId) throws ParseException { @@ -77,6 +81,14 @@ private void parseBooleanSchemaElement(char elementId) { booleanArgs.put(elementId, false); } + private void parseIntegerSchemaElement(char elementId) { + intArgs.put(elementId, 0); + } + + private boolean isIntegerSchemaElement(String elementTail) { + return elementTail.equals("#"); + } + private boolean parseArguments() { for (currentArgument = 0; currentArgument < args.length; currentArgument++) { String arg = args[currentArgument]; @@ -109,6 +121,8 @@ private boolean setArgument(char argChar) { boolean set = true; if (isBoolean(argChar)) setBooleanArg(argChar, true); + else if (isInt(argChar)) + setIntArg(argChar, 0); else if (isString(argChar)) setStringArg(argChar, ""); else @@ -128,6 +142,28 @@ private void setStringArg(char argChar, String s) { } } + private boolean isInt(char argChar) { + return intArgs.containsKey(argChar); + } + + private void setIntArg(char argChar, int value) { + currentArgument++; + String parameter = null; + try { + parameter = args[currentArgument]; + intArgs.put(argChar, new Integer(parameter)); + } catch (ArrayIndexOutOfBoundsException e) { + valid = false; + errorArgument = argChar; + errorCode = ErrorCode.MISSING_INTEGER; + } catch (NumberFormatException e) { + valid = false; + errorArgument = argChar; + errorParameter = parameter; + errorCode = ErrorCode.INVALID_INTEGER; + } + } + private boolean isString(char argChar) { return stringArgs.containsKey(argChar); } @@ -159,6 +195,12 @@ public String errorMessage() throws Exception { case MISSING_STRING: return String.format("Could not find string parameter for -%c.", errorArgument); + case INVALID_INTEGER: + return String.format("Argument -%c expects an integer but was '%s'.", + errorArgument, errorParameter); + case MISSING_INTEGER: + return String.format("Could not find integer parameter for -%c.", + errorArgument); case OK: throw new Exception("TILT: Should not get here."); } @@ -184,6 +226,15 @@ private boolean falseIfNull(Boolean b) { return b == null ? false : b; } + + public int getInt(char arg) { + return zeroIfNull(intArgs.get(arg)); + } + + private int zeroIfNull(Integer i) { + return i == null ? 0 : i; + } + public String getString(char arg) { return blankIfNull(stringArgs.get(arg)); } From 4960f7d55e5f4577c06e290e0e34714ca8b4c8a8 Mon Sep 17 00:00:00 2001 From: viiviii Date: Wed, 11 May 2022 17:20:54 +0900 Subject: [PATCH 2/8] =?UTF-8?q?test:=20int=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/ApplicationTest.java | 18 ++- src/test/java/chapter14/args/ArgsTest.java | 133 ++++++++++++++++--- 2 files changed, 127 insertions(+), 24 deletions(-) diff --git a/src/test/java/chapter14/ApplicationTest.java b/src/test/java/chapter14/ApplicationTest.java index 680ed1c..c000de9 100644 --- a/src/test/java/chapter14/ApplicationTest.java +++ b/src/test/java/chapter14/ApplicationTest.java @@ -30,16 +30,28 @@ void stringArguments() { assertThat(output()).contains("root"); } + @Test + void integerArguments() { + //given + String[] args = new String[]{"-p", "42"}; + + //when + runMain(args); + + //then + assertThat(output()).contains("42"); + } + @Test void allArgumentsPresent() { //given - String[] args = new String[]{"-l", "-d", "user"}; + String[] args = new String[]{"-l", "-p", "8080", "-d", "user"}; //when runMain(args); //then - assertThat(output()).isEqualTo("logging: true, directory: user"); + assertThat(output()).isEqualTo("logging: true, port: 8080, directory: user"); } @Test @@ -51,7 +63,7 @@ void noArguments() { runMain(args); //then - assertThat(output()).isEqualTo("logging: false, directory:"); + assertThat(output()).isEqualTo("logging: false, port: 0, directory:"); } @Override diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index d62504b..4248f14 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -57,22 +57,6 @@ void noSchemaButWithMultipleArguments() throws Exception { assertThat(args.errorMessage()).isEqualTo("Argument(s) -xy unexpected."); } - @DisplayName("boolean 값이 없는 경우") - @Test - void simpleBooleanNotPresent() throws Exception { - //given - String schema = "x"; - String[] arguments = new String[]{}; - - //when - Args args = new Args(schema, arguments); - - //then - assertThat(args.isValid()).isTrue(); - assertThat(args.cardinality()).isZero(); - assertThat(args.getBoolean('x')).isFalse(); - } - @DisplayName("boolean 값이 있는 경우") @Test void simpleBooleanPresent() throws Exception { @@ -110,11 +94,11 @@ void simpleBooleanMultiplePresent() throws Exception { assertThat(args.getBoolean('z')).isFalse(); } - @DisplayName("String 값이 없는 경우") + @DisplayName("boolean 값이 없는 경우") @Test - void simpleStringNotPresent() throws Exception { + void simpleBooleanNotPresent() throws Exception { //given - String schema = "x*"; + String schema = "x"; String[] arguments = new String[]{}; //when @@ -123,8 +107,7 @@ void simpleStringNotPresent() throws Exception { //then assertThat(args.isValid()).isTrue(); assertThat(args.cardinality()).isZero(); - assertThat(args.has('x')).isFalse(); - assertThat(args.getString('x')).isEmpty(); + assertThat(args.getBoolean('x')).isFalse(); } @DisplayName("String 값이 있는 경우") @@ -165,6 +148,23 @@ void simpleStringMultiplePresent() throws Exception { assertThat(args.getString('z')).isEmpty(); } + @DisplayName("String 값이 없는 경우") + @Test + void simpleStringNotPresent() throws Exception { + //given + String schema = "x*"; + String[] arguments = new String[]{}; + + //when + Args args = new Args(schema, arguments); + + //then + assertThat(args.isValid()).isTrue(); + assertThat(args.cardinality()).isZero(); + assertThat(args.has('x')).isFalse(); + assertThat(args.getString('x')).isEmpty(); + } + @DisplayName("String Argument 값이 없는 경우") @Test void missingStringArgument() throws Exception { @@ -183,6 +183,97 @@ void missingStringArgument() throws Exception { assertThat(args.errorMessage()).isEqualTo("Could not find string parameter for -x."); } + @DisplayName("int 값이 있는 경우") + @Test + void simpleIntPresent() throws Exception { + //given + String schema = "x#"; + String[] arguments = new String[]{"-x", "42"}; + + //when + Args args = new Args(schema, arguments); + + //then + assertThat(args.isValid()).isTrue(); + assertThat(args.cardinality()).isOne(); + assertThat(args.has('x')).isTrue(); + assertThat(args.getInt('x')).isEqualTo(42); + } + + @DisplayName("int 값이 여러 개 있는 경우") + @Test + void simpleIntMultiplePresent() throws Exception { + //given + String schema = "x#,y#,z#"; + String[] arguments = new String[]{"-x", "8001", "-y", "8002"}; + + //when + Args args = new Args(schema, arguments); + + //then + assertThat(args.isValid()).isTrue(); + assertThat(args.cardinality()).isEqualTo(2); + assertThat(args.has('x')).isTrue(); + assertThat(args.has('y')).isTrue(); + assertThat(args.has('z')).isFalse(); + assertThat(args.getInt('x')).isEqualTo(8001); + assertThat(args.getInt('y')).isEqualTo(8002); + assertThat(args.getInt('z')).isZero(); + } + + @DisplayName("int 값이 없는 경우") + @Test + void simpleIntNotPresent() throws Exception { + //given + String schema = "x#"; + String[] arguments = new String[]{}; + + //when + Args args = new Args(schema, arguments); + + //then + assertThat(args.isValid()).isTrue(); + assertThat(args.cardinality()).isZero(); + assertThat(args.has('x')).isFalse(); + assertThat(args.getInt('x')).isZero(); + } + + @DisplayName("Integer Argument 값이 없는 경우") + @Test + void missingInteger() 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()).isOne(); + assertThat(args.has('x')).isTrue(); + assertThat(args.getInt('x')).isZero(); + assertThat(args.errorMessage()).isEqualTo("Could not find integer parameter for -x."); + } + + @DisplayName("integer Argument 값을 파싱할 수 없는 경우") + @Test + void invalidInteger() 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()).isOne(); + assertThat(args.has('x')).isTrue(); + assertThat(args.getInt('x')).isZero(); + assertThat(args.errorMessage()).isEqualTo("Argument -x expects an integer but was 'Forty two'."); + } + @DisplayName("Schema의 ElementId가 문자가 아니면 ParseException이 발생한다") @Test void throwParseExceptionWhenInvalidSchemaElementId() { From 064d7cbda8dbb990f0d78e55c38c51aba5947381 Mon Sep 17 00:00:00 2001 From: viiviii Date: Wed, 11 May 2022 17:32:40 +0900 Subject: [PATCH 3/8] =?UTF-8?q?test:=20=EA=B8=B0=EC=A1=B4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=B1=85=EC=97=90=20=EB=82=98?= =?UTF-8?q?=EC=98=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=99=80=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EB=AA=85=20=EB=B0=8F=20=EC=88=9C=EC=84=9C=20?= =?UTF-8?q?=EB=A7=9E=EC=B6=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chapter14/args/ArgsTest.java | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index 4248f14..7d6b6b5 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -57,6 +57,22 @@ void noSchemaButWithMultipleArguments() throws Exception { assertThat(args.errorMessage()).isEqualTo("Argument(s) -xy unexpected."); } + @DisplayName("schema가 문자가 아닌 경우") + @Test + void nonLetterSchema() { + //given + String nonLetterSchemaElementId = "*"; + String[] arguments = new String[]{}; + + //when + Exception exception = catchException(() -> new Args(nonLetterSchemaElementId, arguments)); + + //then + assertThat(exception) + .isInstanceOf(ParseException.class) + .hasMessage("Bad character: * in Args format: *"); + } + @DisplayName("boolean 값이 있는 경우") @Test void simpleBooleanPresent() throws Exception { @@ -274,22 +290,6 @@ void invalidInteger() throws Exception { assertThat(args.errorMessage()).isEqualTo("Argument -x expects an integer but was 'Forty two'."); } - @DisplayName("Schema의 ElementId가 문자가 아니면 ParseException이 발생한다") - @Test - void throwParseExceptionWhenInvalidSchemaElementId() { - //given - String containsNonLetterElementId = "l,d*,#"; - String[] arguments = new String[0]; - - //when - Exception exception = catchException(() -> new Args(containsNonLetterElementId, arguments)); - - //then - assertThat(exception) - .isInstanceOf(ParseException.class) - .hasMessage("Bad character: # in Args format: l,d*,#"); - } - @DisplayName("유효한 args에서 errorMessage를 조회할 경우 Excpetion이 발생한다") @Test void errorMessageThrowExceptionWhenErrorCodeIsOK() throws Exception { From 2eb94ebf184bf09ec2ccac9df7f72d6e955a880d Mon Sep 17 00:00:00 2001 From: viiviii Date: Wed, 11 May 2022 17:52:54 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=EC=9C=A0=ED=9A=A8=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=80=20Schema=20element=EB=A5=BC=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 5 +++++ src/test/java/chapter14/args/ArgsTest.java | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 3a6f136..8e3198d 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -56,6 +56,11 @@ else if (isStringSchemaElement(elementTail)) parseStringSchemaElement(elementId); else if (isIntegerSchemaElement(elementTail)) parseIntegerSchemaElement(elementId); + else { + throw new ParseException( + String.format("Argument: %c has invalid format: %s.", + elementId, elementTail), 0); + } } private void validateSchemaElementId(char elementId) throws ParseException { diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index 7d6b6b5..406e3a2 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -73,6 +73,22 @@ void nonLetterSchema() { .hasMessage("Bad character: * in Args format: *"); } + @DisplayName("schema format이 유효하지 않은 경우") + @Test + void invalidArgumentFormat() { + //given + String invalidSchemeFormat = "f~"; + String[] arguments = new String[]{}; + + //when + Exception exception = catchException(() -> new Args(invalidSchemeFormat, arguments)); + + //then + assertThat(exception) + .isInstanceOf(ParseException.class) + .hasMessage("Argument: f has invalid format: ~."); + } + @DisplayName("boolean 값이 있는 경우") @Test void simpleBooleanPresent() throws Exception { From e17bb4e1e90082b3e50664fba1c5180457884d4c Mon Sep 17 00:00:00 2001 From: viiviii Date: Wed, 11 May 2022 18:11:29 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20=EC=B1=85=EA=B3=BC=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EB=A7=9E=EC=B6=A4=20=EB=B0=8F=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B3=80=EA=B2=BD=20=EB=93=B1=20=EC=9E=91?= =?UTF-8?q?=EC=9D=80=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 89 +++++++++++++------------- 1 file changed, 43 insertions(+), 46 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 8e3198d..6f14e5b 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -15,13 +15,12 @@ public class Args { private int currentArgument; private char errorArgument = '\0'; private String errorParameter = "TILT"; + private ErrorCode errorCode = ErrorCode.OK; enum ErrorCode { OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER } - private ErrorCode errorCode = ErrorCode.OK; - public Args(String schema, String[] args) throws ParseException { this.schema = schema; this.args = args; @@ -70,6 +69,14 @@ private void validateSchemaElementId(char elementId) throws ParseException { } } + private void parseBooleanSchemaElement(char elementId) { + booleanArgs.put(elementId, false); + } + + private void parseIntegerSchemaElement(char elementId) { + intArgs.put(elementId, 0); + } + private void parseStringSchemaElement(char elementId) { stringArgs.put(elementId, ""); } @@ -82,14 +89,6 @@ private boolean isBooleanSchemaElement(String elementTail) { return elementTail.length() == 0; } - private void parseBooleanSchemaElement(char elementId) { - booleanArgs.put(elementId, false); - } - - private void parseIntegerSchemaElement(char elementId) { - intArgs.put(elementId, 0); - } - private boolean isIntegerSchemaElement(String elementTail) { return elementTail.equals("#"); } @@ -123,35 +122,23 @@ private void parseElement(char argChar) { } private boolean setArgument(char argChar) { - boolean set = true; - if (isBoolean(argChar)) + if (isBooleanArg(argChar)) setBooleanArg(argChar, true); - else if (isInt(argChar)) - setIntArg(argChar, 0); - else if (isString(argChar)) - setStringArg(argChar, ""); + else if (isStringArg(argChar)) + setStringArg(argChar); + else if (isIntArg(argChar)) + setIntArg(argChar); else - set = false; - - return set; - } + return false; - private void setStringArg(char argChar, String s) { - currentArgument++; - try { - stringArgs.put(argChar, args[currentArgument]); - } catch (ArrayIndexOutOfBoundsException e) { - valid = false; - errorArgument = argChar; - errorCode = ErrorCode.MISSING_STRING; - } + return true; } - private boolean isInt(char argChar) { + private boolean isIntArg(char argChar) { return intArgs.containsKey(argChar); } - private void setIntArg(char argChar, int value) { + private void setIntArg(char argChar) { currentArgument++; String parameter = null; try { @@ -169,7 +156,18 @@ private void setIntArg(char argChar, int value) { } } - private boolean isString(char argChar) { + private void setStringArg(char argChar) { + currentArgument++; + try { + stringArgs.put(argChar, args[currentArgument]); + } catch (ArrayIndexOutOfBoundsException e) { + valid = false; + errorArgument = argChar; + errorCode = ErrorCode.MISSING_STRING; + } + } + + private boolean isStringArg(char argChar) { return stringArgs.containsKey(argChar); } @@ -177,7 +175,7 @@ private void setBooleanArg(char argChar, boolean value) { booleanArgs.put(argChar, value); } - private boolean isBoolean(char argChar) { + private boolean isBooleanArg(char argChar) { return booleanArgs.containsKey(argChar); } @@ -197,6 +195,8 @@ public String errorMessage() throws Exception { return unexpectedArgumentMessage(); } else { switch (errorCode) { + case OK: + throw new Exception("TILT: Should not get here."); case MISSING_STRING: return String.format("Could not find string parameter for -%c.", errorArgument); @@ -206,8 +206,6 @@ public String errorMessage() throws Exception { case MISSING_INTEGER: return String.format("Could not find integer parameter for -%c.", errorArgument); - case OK: - throw new Exception("TILT: Should not get here."); } return ""; } @@ -223,29 +221,28 @@ private String unexpectedArgumentMessage() { return message.toString(); } - public boolean getBoolean(char arg) { - return falseIfNull(booleanArgs.get(arg)); - } - private boolean falseIfNull(Boolean b) { return b == null ? false : b; } - - public int getInt(char arg) { - return zeroIfNull(intArgs.get(arg)); - } - private int zeroIfNull(Integer i) { return i == null ? 0 : i; } + private String blankIfNull(String s) { + return s == null ? "" : s; + } + public String getString(char arg) { return blankIfNull(stringArgs.get(arg)); } - private String blankIfNull(String s) { - return s == null ? "" : s; + public int getInt(char arg) { + return zeroIfNull(intArgs.get(arg)); + } + + public boolean getBoolean(char arg) { + return falseIfNull(booleanArgs.get(arg)); } public boolean has(char arg) { From df62173709b37d7f58bc01c7080b3a205c4b4a9f Mon Sep 17 00:00:00 2001 From: viiviii Date: Wed, 11 May 2022 18:17:04 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20UNEXPECTED=5FARGUMENT=20errorCo?= =?UTF-8?q?de=20=EC=B6=94=EA=B0=80=ED=95=98=EC=97=AC=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 6f14e5b..af26d43 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -18,7 +18,7 @@ public class Args { private ErrorCode errorCode = ErrorCode.OK; enum ErrorCode { - OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER + OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER, UNEXPECTED_ARGUMENT } public Args(String schema, String[] args) throws ParseException { @@ -117,6 +117,7 @@ private void parseElement(char argChar) { argsFound.add(argChar); else { unexpectedArguments.add(argChar); + errorCode = ErrorCode.UNEXPECTED_ARGUMENT; valid = false; } } @@ -191,24 +192,23 @@ public String usage() { } public String errorMessage() throws Exception { - if (unexpectedArguments.size() > 0) { - return unexpectedArgumentMessage(); - } else { - switch (errorCode) { - case OK: - throw new Exception("TILT: Should not get here."); - case MISSING_STRING: - return String.format("Could not find string parameter for -%c.", - errorArgument); - case INVALID_INTEGER: - return String.format("Argument -%c expects an integer but was '%s'.", - errorArgument, errorParameter); - case MISSING_INTEGER: - return String.format("Could not find integer parameter for -%c.", - errorArgument); - } - return ""; + switch (errorCode) { + case OK: + throw new Exception("TILT: Should not get here."); + case UNEXPECTED_ARGUMENT: + return unexpectedArgumentMessage(); + case MISSING_STRING: + return String.format("Could not find string parameter for -%c.", + errorArgument); + case INVALID_INTEGER: + return String.format("Argument -%c expects an integer but was '%s'.", + errorArgument, errorParameter); + case MISSING_INTEGER: + return String.format("Could not find integer parameter for -%c.", + errorArgument); } + return ""; + } private String unexpectedArgumentMessage() { From 86b313e82abbdf62c7becad20c94a3fbf1a4a584 Mon Sep 17 00:00:00 2001 From: viiviii Date: Wed, 11 May 2022 18:27:43 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20ArgsException=20=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 | 22 +++++++++++++++------- src/test/java/chapter14/args/ArgsTest.java | 9 ++++----- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index af26d43..74e6171 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -31,7 +31,10 @@ private boolean parse() throws ParseException { if (schema.length() == 0 && args.length == 0) return true; parseSchema(); - parseArguments(); + try { + parseArguments(); + } catch (ArgsException e) { + } return valid; } @@ -93,7 +96,7 @@ private boolean isIntegerSchemaElement(String elementTail) { return elementTail.equals("#"); } - private boolean parseArguments() { + private boolean parseArguments() throws ArgsException { for (currentArgument = 0; currentArgument < args.length; currentArgument++) { String arg = args[currentArgument]; parseArgument(arg); @@ -101,18 +104,18 @@ private boolean parseArguments() { return true; } - private void parseArgument(String arg) { + private void parseArgument(String arg) throws ArgsException { if (arg.startsWith("-")) parseElements(arg); } - private void parseElements(String arg) { + private void parseElements(String arg) throws ArgsException { for (int i = 1; i < arg.length(); i++) { parseElement(arg.charAt(i)); } } - private void parseElement(char argChar) { + private void parseElement(char argChar) throws ArgsException { if (setArgument(argChar)) argsFound.add(argChar); else { @@ -122,7 +125,7 @@ private void parseElement(char argChar) { } } - private boolean setArgument(char argChar) { + private boolean setArgument(char argChar) throws ArgsException { if (isBooleanArg(argChar)) setBooleanArg(argChar, true); else if (isStringArg(argChar)) @@ -139,7 +142,7 @@ private boolean isIntArg(char argChar) { return intArgs.containsKey(argChar); } - private void setIntArg(char argChar) { + private void setIntArg(char argChar) throws ArgsException { currentArgument++; String parameter = null; try { @@ -149,11 +152,13 @@ private void setIntArg(char argChar) { valid = false; errorArgument = argChar; errorCode = ErrorCode.MISSING_INTEGER; + throw new ArgsException(); } catch (NumberFormatException e) { valid = false; errorArgument = argChar; errorParameter = parameter; errorCode = ErrorCode.INVALID_INTEGER; + throw new ArgsException(); } } @@ -252,4 +257,7 @@ public boolean has(char arg) { public boolean isValid() { return valid; } + + private class ArgsException extends Exception { + } } diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index 406e3a2..7cc50f5 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -282,13 +282,12 @@ void missingInteger() throws Exception { //then assertThat(args.isValid()).isFalse(); - assertThat(args.cardinality()).isOne(); - assertThat(args.has('x')).isTrue(); + assertThat(args.has('x')).isFalse(); assertThat(args.getInt('x')).isZero(); assertThat(args.errorMessage()).isEqualTo("Could not find integer parameter for -x."); } - @DisplayName("integer Argument 값을 파싱할 수 없는 경우") + @DisplayName("Integer Argument 값을 파싱할 수 없는 경우") @Test void invalidInteger() throws Exception { //given @@ -300,8 +299,8 @@ void invalidInteger() throws Exception { //then assertThat(args.isValid()).isFalse(); - assertThat(args.cardinality()).isOne(); - assertThat(args.has('x')).isTrue(); + assertThat(args.cardinality()).isZero(); + assertThat(args.has('x')).isFalse(); assertThat(args.getInt('x')).isZero(); assertThat(args.errorMessage()).isEqualTo("Argument -x expects an integer but was 'Forty two'."); } From cd553205a465712eefaaddead6cc0dbfab4b6917 Mon Sep 17 00:00:00 2001 From: viiviii Date: Wed, 11 May 2022 18:28:26 +0900 Subject: [PATCH 8/8] =?UTF-8?q?refactor:=20errorArgument=20->=20errorArgum?= =?UTF-8?q?entId=EB=A1=9C=20=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 74e6171..1f4429a 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -13,7 +13,7 @@ public class Args { private Map intArgs = new HashMap<>(); private Set argsFound = new HashSet<>(); private int currentArgument; - private char errorArgument = '\0'; + private char errorArgumentId = '\0'; private String errorParameter = "TILT"; private ErrorCode errorCode = ErrorCode.OK; @@ -150,12 +150,12 @@ private void setIntArg(char argChar) throws ArgsException { intArgs.put(argChar, new Integer(parameter)); } catch (ArrayIndexOutOfBoundsException e) { valid = false; - errorArgument = argChar; + errorArgumentId = argChar; errorCode = ErrorCode.MISSING_INTEGER; throw new ArgsException(); } catch (NumberFormatException e) { valid = false; - errorArgument = argChar; + errorArgumentId = argChar; errorParameter = parameter; errorCode = ErrorCode.INVALID_INTEGER; throw new ArgsException(); @@ -168,7 +168,7 @@ private void setStringArg(char argChar) { stringArgs.put(argChar, args[currentArgument]); } catch (ArrayIndexOutOfBoundsException e) { valid = false; - errorArgument = argChar; + errorArgumentId = argChar; errorCode = ErrorCode.MISSING_STRING; } } @@ -204,13 +204,13 @@ public String errorMessage() throws Exception { return unexpectedArgumentMessage(); case MISSING_STRING: return String.format("Could not find string parameter for -%c.", - errorArgument); + errorArgumentId); case INVALID_INTEGER: return String.format("Argument -%c expects an integer but was '%s'.", - errorArgument, errorParameter); + errorArgumentId, errorParameter); case MISSING_INTEGER: return String.format("Could not find integer parameter for -%c.", - errorArgument); + errorArgumentId); } return "";