From 964cc48c80a8a2d401697c7d9959cec52b316b75 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 12:32:51 +0900 Subject: [PATCH 01/14] =?UTF-8?q?1.=20ErrorCode=20ArgsException=20class?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index e45390b..4c601a1 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -12,13 +12,9 @@ public class Args { private Iterator currentArgument; private char errorArgumentId = '\0'; private String errorParameter = "TILT"; - private ErrorCode errorCode = ErrorCode.OK; + private ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.OK; private List argsList; - enum ErrorCode { - OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER, - UNEXPECTED_ARGUMENT, MISSING_DOUBLE, INVALID_DOUBLE - } public Args(String schema, String[] args) throws ParseException { this.schema = schema; @@ -97,7 +93,7 @@ private void parseElement(char argChar) throws ArgsException { argsFound.add(argChar); else { unexpectedArguments.add(argChar); - errorCode = ErrorCode.UNEXPECTED_ARGUMENT; + errorCode = ArgsException.ErrorCode.UNEXPECTED_ARGUMENT; valid = false; } } @@ -209,7 +205,11 @@ public boolean isValid() { return valid; } - private class ArgsException extends Exception { + private static class ArgsException extends Exception { + public enum ErrorCode { + OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER, + UNEXPECTED_ARGUMENT, MISSING_DOUBLE, INVALID_DOUBLE + } } private interface ArgumentMarshaler { @@ -240,7 +240,7 @@ public void set(Iterator currentArgument) throws ArgsException { try { stringValue = currentArgument.next(); } catch (NoSuchElementException e) { - errorCode = ErrorCode.MISSING_STRING; + errorCode = ArgsException.ErrorCode.MISSING_STRING; throw new ArgsException(); } } @@ -261,11 +261,11 @@ public void set(Iterator currentArgument) throws ArgsException { parameter = currentArgument.next(); intValue = Integer.parseInt(parameter); } catch (NoSuchElementException e) { - errorCode = ErrorCode.MISSING_INTEGER; + errorCode = ArgsException.ErrorCode.MISSING_INTEGER; throw new ArgsException(); } catch (NumberFormatException e) { errorParameter = parameter; - errorCode = ErrorCode.INVALID_INTEGER; + errorCode = ArgsException.ErrorCode.INVALID_INTEGER; throw new ArgsException(); } } @@ -286,11 +286,11 @@ public void set(Iterator currentArgument) throws ArgsException { parameter = currentArgument.next(); doubleValue = Double.parseDouble(parameter); } catch (NoSuchElementException e) { - errorCode = ErrorCode.MISSING_DOUBLE; + errorCode = ArgsException.ErrorCode.MISSING_DOUBLE; throw new ArgsException(); } catch (NumberFormatException e) { errorParameter = parameter; - errorCode = ErrorCode.INVALID_DOUBLE; + errorCode = ArgsException.ErrorCode.INVALID_DOUBLE; throw new ArgsException(); } } From ddf34060d223ccd1df233a87bf4a340bee6756f7 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 13:13:39 +0900 Subject: [PATCH 02/14] =?UTF-8?q?2.=20ParseException=20=EB=8C=80=EC=8B=A0?= =?UTF-8?q?=20ArgsException=EC=9D=84=20=EB=8D=98=EC=A7=80=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/Application.java | 6 ++-- src/main/java/chapter14/args/Args.java | 34 ++++++++++++++-------- src/test/java/chapter14/args/ArgsTest.java | 6 ++-- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/chapter14/Application.java b/src/main/java/chapter14/Application.java index ca77f84..1b5f2bd 100644 --- a/src/main/java/chapter14/Application.java +++ b/src/main/java/chapter14/Application.java @@ -2,8 +2,6 @@ import chapter14.args.Args; -import java.text.ParseException; - class Application { public static void main(String[] args) { @@ -13,8 +11,8 @@ public static void main(String[] args) { int port = arg.getInt('p'); String directory = arg.getString('d'); executeApplication(logging, port, directory); - } catch (ParseException e) { - System.out.printf("Parse error: %s\n", e.getMessage()); + } catch (Args.ArgsException e) { + System.out.printf("Argument error: %s\n", e.getMessage()); } } diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 4c601a1..b7986d4 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -1,6 +1,5 @@ package chapter14.args; -import java.text.ParseException; import java.util.*; public class Args { @@ -16,13 +15,13 @@ public class Args { private List argsList; - public Args(String schema, String[] args) throws ParseException { + public Args(String schema, String[] args) throws ArgsException { this.schema = schema; argsList = Arrays.asList(args); valid = parse(); } - private boolean parse() throws ParseException { + private boolean parse() throws ArgsException { if (schema.length() == 0 && argsList.size() == 0) return true; parseSchema(); @@ -33,7 +32,7 @@ private boolean parse() throws ParseException { return valid; } - private boolean parseSchema() throws ParseException { + private boolean parseSchema() throws ArgsException { for (String element : schema.split(",")) { if (element.length() > 0) { String trimmedElement = element.trim(); @@ -43,7 +42,7 @@ private boolean parseSchema() throws ParseException { return true; } - private void parseSchemaElement(String element) throws ParseException { + private void parseSchemaElement(String element) throws ArgsException { char elementId = element.charAt(0); String elementTail = element.substring(1); validateSchemaElementId(elementId); @@ -56,16 +55,16 @@ private void parseSchemaElement(String element) throws ParseException { } else if (elementTail.equals("##")) { marshalers.put(elementId, new DoubleArgumentMarshaler()); } else { - throw new ParseException( + throw new ArgsException( String.format("Argument: %c has invalid format: %s.", - elementId, elementTail), 0); + elementId, elementTail)); } } - private void validateSchemaElementId(char elementId) throws ParseException { + private void validateSchemaElementId(char elementId) throws ArgsException { if (!Character.isLetter(elementId)) { - throw new ParseException( - "Bad character: " + elementId + " in Args format: " + schema, 0); + throw new ArgsException( + "Bad character: " + elementId + " in Args format: " + schema); } } @@ -146,7 +145,6 @@ public String errorMessage() throws Exception { errorArgumentId); } return ""; - } private String unexpectedArgumentMessage() { @@ -205,7 +203,19 @@ public boolean isValid() { return valid; } - private static class ArgsException extends Exception { + public static class ArgsException extends Exception { + + public ArgsException() { + } + + public ArgsException(String message) { + super(message); + } + + public String errorMessage() { + return super.getMessage(); + } + public enum ErrorCode { OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER, UNEXPECTED_ARGUMENT, MISSING_DOUBLE, INVALID_DOUBLE diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index fcfe149..af9e341 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -3,8 +3,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.text.ParseException; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchException; @@ -90,7 +88,7 @@ void nonLetterSchema() { //then assertThat(exception) - .isInstanceOf(ParseException.class) + .isInstanceOf(Args.ArgsException.class) .hasMessage("Bad character: * in Args format: *"); } @@ -106,7 +104,7 @@ void invalidArgumentFormat() { //then assertThat(exception) - .isInstanceOf(ParseException.class) + .isInstanceOf(Args.ArgsException.class) .hasMessage("Argument: f has invalid format: ~."); } From 4d99dd21998a567aad549d488777f663aa8b4ecb Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 13:36:00 +0900 Subject: [PATCH 03/14] =?UTF-8?q?3.=20=EC=98=88=EC=99=B8=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20ArgsException=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=B5=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 63 +++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index b7986d4..68a3868 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -107,6 +107,7 @@ private boolean setArgument(char argChar) throws ArgsException { } catch (ArgsException e) { valid = false; errorArgumentId = argChar; + e.setErrorArgumentId(argChar); throw e; } } @@ -204,6 +205,10 @@ public boolean isValid() { } public static class ArgsException extends Exception { + private Set unexpectedArguments = new TreeSet<>(); + private char errorArgumentId = '\0'; + private String errorParameter = "TILT"; + private ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.OK; public ArgsException() { } @@ -212,8 +217,52 @@ public ArgsException(String message) { super(message); } - public String errorMessage() { - return super.getMessage(); + public ArgsException(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + public ArgsException(ErrorCode errorCode, String errorParameter) { + this.errorCode = errorCode; + this.errorParameter = errorParameter; + } + + public void setErrorArgumentId(char errorArgumentId) { + this.errorArgumentId = errorArgumentId; + } + + public String errorMessage() throws Exception { + 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.", + errorArgumentId); + case INVALID_INTEGER: + return String.format("Argument -%c expects an integer but was '%s'.", + errorArgumentId, errorParameter); + 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 ""; + } + + private String unexpectedArgumentMessage() { + StringBuffer message = new StringBuffer("Argument(s) -"); + for (char c : unexpectedArguments) { + message.append(c); + } + message.append(" unexpected."); + + return message.toString(); } public enum ErrorCode { @@ -251,7 +300,7 @@ public void set(Iterator currentArgument) throws ArgsException { stringValue = currentArgument.next(); } catch (NoSuchElementException e) { errorCode = ArgsException.ErrorCode.MISSING_STRING; - throw new ArgsException(); + throw new ArgsException(ArgsException.ErrorCode.MISSING_STRING); } } @@ -272,11 +321,11 @@ public void set(Iterator currentArgument) throws ArgsException { intValue = Integer.parseInt(parameter); } catch (NoSuchElementException e) { errorCode = ArgsException.ErrorCode.MISSING_INTEGER; - throw new ArgsException(); + throw new ArgsException(ArgsException.ErrorCode.MISSING_INTEGER); } catch (NumberFormatException e) { errorParameter = parameter; errorCode = ArgsException.ErrorCode.INVALID_INTEGER; - throw new ArgsException(); + throw new ArgsException(ArgsException.ErrorCode.INVALID_INTEGER, parameter); } } @@ -297,11 +346,11 @@ public void set(Iterator currentArgument) throws ArgsException { doubleValue = Double.parseDouble(parameter); } catch (NoSuchElementException e) { errorCode = ArgsException.ErrorCode.MISSING_DOUBLE; - throw new ArgsException(); + throw new ArgsException(ArgsException.ErrorCode.MISSING_DOUBLE, parameter); } catch (NumberFormatException e) { errorParameter = parameter; errorCode = ArgsException.ErrorCode.INVALID_DOUBLE; - throw new ArgsException(); + throw new ArgsException(ArgsException.ErrorCode.INVALID_DOUBLE, parameter); } } From fce7916657739d6f117e0cfe9ed7b51926853ee5 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 13:38:23 +0900 Subject: [PATCH 04/14] =?UTF-8?q?4.=20parse()=EC=9D=98=20=EB=B9=88=20catch?= =?UTF-8?q?=EC=A0=88=20=EC=A0=9C=EA=B1=B0=ED=95=98=EC=97=AC=20ArgsExceptio?= =?UTF-8?q?n=EC=9D=84=20=EB=8D=98=EC=A7=80=EA=B2=8C=20=EB=B3=80=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 | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 68a3868..5d67d8c 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -25,10 +25,7 @@ private boolean parse() throws ArgsException { if (schema.length() == 0 && argsList.size() == 0) return true; parseSchema(); - try { - parseArguments(); - } catch (ArgsException e) { - } + parseArguments(); return valid; } From a3800c3dcd96213cf8d768e842a83f95576ba193 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 13:49:30 +0900 Subject: [PATCH 05/14] =?UTF-8?q?5.=20=EC=98=88=EC=99=B8=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EA=B0=92=EC=9D=84=20=EA=BA=BC=EB=82=B4=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chapter14/args/ArgsTest.java | 63 +++++++++++++--------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index af9e341..c5ad30b 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -234,12 +234,15 @@ void missingStringArgument() throws Exception { String[] arguments = new String[]{"-x"}; // missing //when - Args args = new Args(schema, arguments); + Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(args.isValid()).isFalse(); - assertThat(args.getString('x')).isEmpty(); - assertThat(args.errorMessage()).isEqualTo("Could not find string parameter for -x."); + assertThat(exception).isInstanceOf(Args.ArgsException.class); + + Args.ArgsException e = (Args.ArgsException) exception; + assertThat(e.errorMessage()).isEqualTo("Could not find string parameter for -x."); + assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.MISSING_STRING); + assertThat(e.getErrorArgumentId()).isEqualTo('x'); } @DisplayName("int 값이 있는 경우") @@ -301,12 +304,15 @@ void missingInteger() throws Exception { String[] arguments = new String[]{"-x"}; // missing //when - Args args = new Args(schema, arguments); + Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(args.isValid()).isFalse(); - assertThat(args.getInt('x')).isZero(); - assertThat(args.errorMessage()).isEqualTo("Could not find integer parameter for -x."); + assertThat(exception).isInstanceOf(Args.ArgsException.class); + + Args.ArgsException e = (Args.ArgsException) exception; + assertThat(e.errorMessage()).isEqualTo("Could not find integer parameter for -x."); + assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.MISSING_INTEGER); + assertThat(e.getErrorArgumentId()).isEqualTo('x'); } @DisplayName("Integer Argument 값을 파싱할 수 없는 경우") @@ -317,14 +323,16 @@ void invalidInteger() throws Exception { String[] arguments = new String[]{"-x", "Forty two"}; //when - Args args = new Args(schema, arguments); + Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(args.isValid()).isFalse(); - 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'."); + assertThat(exception).isInstanceOf(Args.ArgsException.class); + + Args.ArgsException e = (Args.ArgsException) exception; + assertThat(e.errorMessage()).isEqualTo("Argument -x expects an integer but was 'Forty two'."); + assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.INVALID_INTEGER); + assertThat(e.getErrorArgumentId()).isEqualTo('x'); + assertThat(e.getErrorParameter()).isEqualTo("Forty two"); } @DisplayName("double 값이 있는 경우") @@ -365,14 +373,15 @@ void missingDouble() throws Exception { String[] arguments = new String[]{"-x"}; // missing //when - Args args = new Args(schema, arguments); + Exception exception = catchException(() -> 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."); + assertThat(exception).isInstanceOf(Args.ArgsException.class); + + Args.ArgsException e = (Args.ArgsException) exception; + assertThat(e.errorMessage()).isEqualTo("Could not find double parameter for -x."); + assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.MISSING_DOUBLE); + assertThat(e.getErrorArgumentId()).isEqualTo('x'); } @DisplayName("Double Argument 값을 파싱할 수 없는 경우") @@ -383,14 +392,16 @@ void invalidDouble() throws Exception { String[] arguments = new String[]{"-x", "Forty two"}; //when - Args args = new Args(schema, arguments); + Exception exception = catchException(() -> 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'."); + assertThat(exception).isInstanceOf(Args.ArgsException.class); + + Args.ArgsException e = (Args.ArgsException) exception; + assertThat(e.errorMessage()).isEqualTo("Argument -x expects an double but was 'Forty two'."); + assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.INVALID_DOUBLE); + assertThat(e.getErrorArgumentId()).isEqualTo('x'); + assertThat(e.getErrorParameter()).isEqualTo("Forty two"); } @DisplayName("잘못된 타입으로 호출한 경우") From 85e3140d62607908e4d598846c887057b822ab91 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 14:10:18 +0900 Subject: [PATCH 06/14] =?UTF-8?q?6.=20UNEXPECTED=5FARGUMENT=EB=8F=84=20Arg?= =?UTF-8?q?sException=EC=9D=84=20=EB=8D=98=EC=A7=80=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=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 | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 5d67d8c..9b5f549 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -91,6 +91,7 @@ private void parseElement(char argChar) throws ArgsException { unexpectedArguments.add(argChar); errorCode = ArgsException.ErrorCode.UNEXPECTED_ARGUMENT; valid = false; + throw new ArgsException(ArgsException.ErrorCode.UNEXPECTED_ARGUMENT, argChar, null); } } @@ -223,6 +224,12 @@ public ArgsException(ErrorCode errorCode, String errorParameter) { this.errorParameter = errorParameter; } + public ArgsException(ErrorCode errorCode, char errorArgumentId, String errorParameter) { + this.errorCode = errorCode; + this.errorArgumentId = errorArgumentId; + this.errorParameter = errorParameter; + } + public void setErrorArgumentId(char errorArgumentId) { this.errorArgumentId = errorArgumentId; } @@ -262,6 +269,18 @@ private String unexpectedArgumentMessage() { return message.toString(); } + public ErrorCode getErrorCode() { + return errorCode; + } + + public char getErrorArgumentId() { + return errorArgumentId; + } + + public String getErrorParameter() { + return errorParameter; + } + public enum ErrorCode { OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER, UNEXPECTED_ARGUMENT, MISSING_DOUBLE, INVALID_DOUBLE From f65ec8aa2a9ccb0da20bdb72d96f57b9092818df Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 14:17:59 +0900 Subject: [PATCH 07/14] =?UTF-8?q?7.=20UNEXPECTED=5FARGUMENT=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EB=B3=80=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, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 9b5f549..ace49ed 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -203,7 +203,6 @@ public boolean isValid() { } public static class ArgsException extends Exception { - private Set unexpectedArguments = new TreeSet<>(); private char errorArgumentId = '\0'; private String errorParameter = "TILT"; private ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.OK; @@ -239,7 +238,8 @@ public String errorMessage() throws Exception { case OK: throw new Exception("TILT: Should not get here."); case UNEXPECTED_ARGUMENT: - return unexpectedArgumentMessage(); + return String.format("Argument(s) -%c unexpected.", + errorArgumentId); case MISSING_STRING: return String.format("Could not find string parameter for -%c.", errorArgumentId); @@ -259,16 +259,6 @@ public String errorMessage() throws Exception { return ""; } - private String unexpectedArgumentMessage() { - StringBuffer message = new StringBuffer("Argument(s) -"); - for (char c : unexpectedArguments) { - message.append(c); - } - message.append(" unexpected."); - - return message.toString(); - } - public ErrorCode getErrorCode() { return errorCode; } From 9d9dc79e4926e4714ef6accc4dc4ce717f0f7fd5 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 14:19:19 +0900 Subject: [PATCH 08/14] =?UTF-8?q?8.=20=EC=98=88=EC=99=B8=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EA=B0=92=EC=9D=84=20=EA=BA=BC=EB=82=B4=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chapter14/args/ArgsTest.java | 25 ++++++---------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index c5ad30b..38cd2a9 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -31,28 +31,15 @@ void noSchemaButWithOneArgument() throws Exception { String[] arguments = new String[]{"-x"}; //when - Args args = new Args(schema, arguments); + Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(args.isValid()).isFalse(); - assertThat(args.cardinality()).isZero(); - assertThat(args.errorMessage()).isEqualTo("Argument(s) -x unexpected."); - } - - @DisplayName("schema가 없고 argument가 여러 개 있는 경우") - @Test - void noSchemaButWithMultipleArguments() throws Exception { - //given - String schema = ""; - String[] arguments = new String[]{"-x", "-y"}; - - //when - Args args = new Args(schema, arguments); + assertThat(exception).isInstanceOf(Args.ArgsException.class); - //then - assertThat(args.isValid()).isFalse(); - assertThat(args.cardinality()).isZero(); - assertThat(args.errorMessage()).isEqualTo("Argument(s) -xy unexpected."); + Args.ArgsException e = (Args.ArgsException) exception; + assertThat(e.errorMessage()).isEqualTo("Argument(s) -x unexpected."); + assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.UNEXPECTED_ARGUMENT); + assertThat(e.getErrorArgumentId()).isEqualTo('x'); } @DisplayName("Schema가 있고, arugment가 없는 경우") From b38aca5243f6b724ca9e2f10f31ee61d26d17a79 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 14:26:26 +0900 Subject: [PATCH 09/14] =?UTF-8?q?9.=20Args=EC=97=90=EC=84=9C=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=B4=EC=A7=84=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=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 | 49 -------------------------- 1 file changed, 49 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index ace49ed..be1edb5 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -5,13 +5,9 @@ public class Args { private String schema; private boolean valid = true; - private Set unexpectedArguments = new TreeSet<>(); private Map marshalers = new HashMap<>(); private Set argsFound = new HashSet<>(); private Iterator currentArgument; - private char errorArgumentId = '\0'; - private String errorParameter = "TILT"; - private ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.OK; private List argsList; @@ -88,8 +84,6 @@ private void parseElement(char argChar) throws ArgsException { if (setArgument(argChar)) argsFound.add(argChar); else { - unexpectedArguments.add(argChar); - errorCode = ArgsException.ErrorCode.UNEXPECTED_ARGUMENT; valid = false; throw new ArgsException(ArgsException.ErrorCode.UNEXPECTED_ARGUMENT, argChar, null); } @@ -104,7 +98,6 @@ private boolean setArgument(char argChar) throws ArgsException { return true; } catch (ArgsException e) { valid = false; - errorArgumentId = argChar; e.setErrorArgumentId(argChar); throw e; } @@ -121,41 +114,6 @@ public String usage() { return ""; } - public String errorMessage() throws Exception { - 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.", - errorArgumentId); - case INVALID_INTEGER: - return String.format("Argument -%c expects an integer but was '%s'.", - errorArgumentId, errorParameter); - 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 ""; - } - - private String unexpectedArgumentMessage() { - StringBuffer message = new StringBuffer("Argument(s) -"); - for (char c : unexpectedArguments) { - message.append(c); - } - message.append(" unexpected."); - - return message.toString(); - } - public String getString(char arg) { ArgumentMarshaler am = marshalers.get(arg); try { @@ -305,7 +263,6 @@ public void set(Iterator currentArgument) throws ArgsException { try { stringValue = currentArgument.next(); } catch (NoSuchElementException e) { - errorCode = ArgsException.ErrorCode.MISSING_STRING; throw new ArgsException(ArgsException.ErrorCode.MISSING_STRING); } } @@ -326,11 +283,8 @@ public void set(Iterator currentArgument) throws ArgsException { parameter = currentArgument.next(); intValue = Integer.parseInt(parameter); } catch (NoSuchElementException e) { - errorCode = ArgsException.ErrorCode.MISSING_INTEGER; throw new ArgsException(ArgsException.ErrorCode.MISSING_INTEGER); } catch (NumberFormatException e) { - errorParameter = parameter; - errorCode = ArgsException.ErrorCode.INVALID_INTEGER; throw new ArgsException(ArgsException.ErrorCode.INVALID_INTEGER, parameter); } } @@ -351,11 +305,8 @@ public void set(Iterator currentArgument) throws ArgsException { parameter = currentArgument.next(); doubleValue = Double.parseDouble(parameter); } catch (NoSuchElementException e) { - errorCode = ArgsException.ErrorCode.MISSING_DOUBLE; throw new ArgsException(ArgsException.ErrorCode.MISSING_DOUBLE, parameter); } catch (NumberFormatException e) { - errorParameter = parameter; - errorCode = ArgsException.ErrorCode.INVALID_DOUBLE; throw new ArgsException(ArgsException.ErrorCode.INVALID_DOUBLE, parameter); } } From 4019db2e5df12c4bc7beb027baa805771277df2a Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 14:42:33 +0900 Subject: [PATCH 10/14] =?UTF-8?q?10.=20ArgsException=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/Application.java | 3 +- src/main/java/chapter14/args/Args.java | 75 ---------------- .../java/chapter14/args/ArgsException.java | 85 +++++++++++++++++++ .../chapter14/args/ArgsExceptionTest.java | 80 +++++++++++++++++ src/test/java/chapter14/args/ArgsTest.java | 62 +++++--------- 5 files changed, 187 insertions(+), 118 deletions(-) create mode 100644 src/main/java/chapter14/args/ArgsException.java create mode 100644 src/test/java/chapter14/args/ArgsExceptionTest.java diff --git a/src/main/java/chapter14/Application.java b/src/main/java/chapter14/Application.java index 1b5f2bd..e9acbe7 100644 --- a/src/main/java/chapter14/Application.java +++ b/src/main/java/chapter14/Application.java @@ -1,6 +1,7 @@ package chapter14; import chapter14.args.Args; +import chapter14.args.ArgsException; class Application { @@ -11,7 +12,7 @@ public static void main(String[] args) { int port = arg.getInt('p'); String directory = arg.getString('d'); executeApplication(logging, port, directory); - } catch (Args.ArgsException e) { + } catch (ArgsException e) { System.out.printf("Argument error: %s\n", e.getMessage()); } } diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index be1edb5..efa1e30 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -160,81 +160,6 @@ public boolean isValid() { return valid; } - public static class ArgsException extends Exception { - private char errorArgumentId = '\0'; - private String errorParameter = "TILT"; - private ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.OK; - - public ArgsException() { - } - - public ArgsException(String message) { - super(message); - } - - public ArgsException(ErrorCode errorCode) { - this.errorCode = errorCode; - } - - public ArgsException(ErrorCode errorCode, String errorParameter) { - this.errorCode = errorCode; - this.errorParameter = errorParameter; - } - - public ArgsException(ErrorCode errorCode, char errorArgumentId, String errorParameter) { - this.errorCode = errorCode; - this.errorArgumentId = errorArgumentId; - this.errorParameter = errorParameter; - } - - public void setErrorArgumentId(char errorArgumentId) { - this.errorArgumentId = errorArgumentId; - } - - public String errorMessage() throws Exception { - switch (errorCode) { - case OK: - throw new Exception("TILT: Should not get here."); - case UNEXPECTED_ARGUMENT: - return String.format("Argument(s) -%c unexpected.", - errorArgumentId); - case MISSING_STRING: - return String.format("Could not find string parameter for -%c.", - errorArgumentId); - case INVALID_INTEGER: - return String.format("Argument -%c expects an integer but was '%s'.", - errorArgumentId, errorParameter); - 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 ""; - } - - public ErrorCode getErrorCode() { - return errorCode; - } - - public char getErrorArgumentId() { - return errorArgumentId; - } - - public String getErrorParameter() { - return errorParameter; - } - - public enum ErrorCode { - OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER, - UNEXPECTED_ARGUMENT, MISSING_DOUBLE, INVALID_DOUBLE - } - } - private interface ArgumentMarshaler { void set(Iterator currentArgument) throws ArgsException; diff --git a/src/main/java/chapter14/args/ArgsException.java b/src/main/java/chapter14/args/ArgsException.java new file mode 100644 index 0000000..79e4017 --- /dev/null +++ b/src/main/java/chapter14/args/ArgsException.java @@ -0,0 +1,85 @@ +package chapter14.args; + +public class ArgsException extends Exception { + private char errorArgumentId = '\0'; + private String errorParameter = "TILT"; + private ErrorCode errorCode = ErrorCode.OK; + + public ArgsException() { + } + + public ArgsException(String message) { + super(message); + } + + public ArgsException(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + public ArgsException(ErrorCode errorCode, String errorParameter) { + this.errorCode = errorCode; + this.errorParameter = errorParameter; + } + + public ArgsException(ErrorCode errorCode, char errorArgumentId, String errorParameter) { + this.errorCode = errorCode; + this.errorArgumentId = errorArgumentId; + this.errorParameter = errorParameter; + } + + public char getErrorArgumentId() { + return errorArgumentId; + } + + public void setErrorArgumentId(char errorArgumentId) { + this.errorArgumentId = errorArgumentId; + } + + public String getErrorParameter() { + return errorParameter; + } + + public void setErrorParameter(String errorParameter) { + this.errorParameter = errorParameter; + } + + public ErrorCode getErrorCode() { + return errorCode; + } + + public void setErrorCode(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + public String errorMessage() throws Exception { + switch (errorCode) { + case OK: + throw new Exception("TILT: Should not get here."); + case UNEXPECTED_ARGUMENT: + return String.format("Argument(s) -%c unexpected.", errorArgumentId); + case MISSING_STRING: + return String.format("Could not find string parameter for -%c.", + errorArgumentId); + case INVALID_INTEGER: + return String.format("Argument -%c expects an integer but was '%s'.", + errorArgumentId, errorParameter); + 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 ""; + } + + public enum ErrorCode { + OK, UNEXPECTED_ARGUMENT, + MISSING_STRING, + MISSING_INTEGER, INVALID_INTEGER, + MISSING_DOUBLE, INVALID_DOUBLE + } +} diff --git a/src/test/java/chapter14/args/ArgsExceptionTest.java b/src/test/java/chapter14/args/ArgsExceptionTest.java new file mode 100644 index 0000000..0786192 --- /dev/null +++ b/src/test/java/chapter14/args/ArgsExceptionTest.java @@ -0,0 +1,80 @@ +package chapter14.args; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class ArgsExceptionTest { + + @Test + void unexpectedMessage() throws Exception { + //given + ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.UNEXPECTED_ARGUMENT; + + //when + ArgsException e = new ArgsException(errorCode, 'x', null); + + //then + assertThat(e.errorMessage()).isEqualTo("Argument(s) -x unexpected."); + } + + @Test + void missingStringMessage() throws Exception { + //given + ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.MISSING_STRING; + + //when + ArgsException e = new ArgsException(errorCode, 'x', null); + + //then + assertThat(e.errorMessage()).isEqualTo("Could not find string parameter for -x."); + } + + @Test + void invalidIntegerMessage() throws Exception { + //given + ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.INVALID_INTEGER; + + //when + ArgsException e = new ArgsException(errorCode, 'x', "Forty two"); + + //then + assertThat(e.errorMessage()).isEqualTo("Argument -x expects an integer but was 'Forty two'."); + } + + @Test + void missingIntegerMessage() throws Exception { + //given + ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.MISSING_INTEGER; + + //when + ArgsException e = new ArgsException(errorCode, 'x', null); + + //then + assertThat(e.errorMessage()).isEqualTo("Could not find integer parameter for -x."); + } + + @Test + void invalidDoubleMessage() throws Exception { + //given + ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.INVALID_DOUBLE; + + //when + ArgsException e = new ArgsException(errorCode, 'x', "Forty two"); + + //then + assertThat(e.errorMessage()).isEqualTo("Argument -x expects an double but was 'Forty two'."); + } + + @Test + void missingDoubleMessage() throws Exception { + //given + ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.MISSING_DOUBLE; + + //when + ArgsException e = new ArgsException(errorCode, 'x', null); + + //then + assertThat(e.errorMessage()).isEqualTo("Could not find double parameter for -x."); + } +} \ 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 38cd2a9..a849c8a 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -34,11 +34,10 @@ void noSchemaButWithOneArgument() throws Exception { Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(exception).isInstanceOf(Args.ArgsException.class); + assertThat(exception).isInstanceOf(ArgsException.class); - Args.ArgsException e = (Args.ArgsException) exception; - assertThat(e.errorMessage()).isEqualTo("Argument(s) -x unexpected."); - assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.UNEXPECTED_ARGUMENT); + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.UNEXPECTED_ARGUMENT); assertThat(e.getErrorArgumentId()).isEqualTo('x'); } @@ -75,7 +74,7 @@ void nonLetterSchema() { //then assertThat(exception) - .isInstanceOf(Args.ArgsException.class) + .isInstanceOf(ArgsException.class) .hasMessage("Bad character: * in Args format: *"); } @@ -91,7 +90,7 @@ void invalidArgumentFormat() { //then assertThat(exception) - .isInstanceOf(Args.ArgsException.class) + .isInstanceOf(ArgsException.class) .hasMessage("Argument: f has invalid format: ~."); } @@ -224,11 +223,10 @@ void missingStringArgument() throws Exception { Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(exception).isInstanceOf(Args.ArgsException.class); + assertThat(exception).isInstanceOf(ArgsException.class); - Args.ArgsException e = (Args.ArgsException) exception; - assertThat(e.errorMessage()).isEqualTo("Could not find string parameter for -x."); - assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.MISSING_STRING); + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_STRING); assertThat(e.getErrorArgumentId()).isEqualTo('x'); } @@ -294,11 +292,10 @@ void missingInteger() throws Exception { Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(exception).isInstanceOf(Args.ArgsException.class); + assertThat(exception).isInstanceOf(ArgsException.class); - Args.ArgsException e = (Args.ArgsException) exception; - assertThat(e.errorMessage()).isEqualTo("Could not find integer parameter for -x."); - assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.MISSING_INTEGER); + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_INTEGER); assertThat(e.getErrorArgumentId()).isEqualTo('x'); } @@ -313,11 +310,10 @@ void invalidInteger() throws Exception { Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(exception).isInstanceOf(Args.ArgsException.class); + assertThat(exception).isInstanceOf(ArgsException.class); - Args.ArgsException e = (Args.ArgsException) exception; - assertThat(e.errorMessage()).isEqualTo("Argument -x expects an integer but was 'Forty two'."); - assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.INVALID_INTEGER); + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.INVALID_INTEGER); assertThat(e.getErrorArgumentId()).isEqualTo('x'); assertThat(e.getErrorParameter()).isEqualTo("Forty two"); } @@ -363,11 +359,10 @@ void missingDouble() throws Exception { Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(exception).isInstanceOf(Args.ArgsException.class); + assertThat(exception).isInstanceOf(ArgsException.class); - Args.ArgsException e = (Args.ArgsException) exception; - assertThat(e.errorMessage()).isEqualTo("Could not find double parameter for -x."); - assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.MISSING_DOUBLE); + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_DOUBLE); assertThat(e.getErrorArgumentId()).isEqualTo('x'); } @@ -382,11 +377,10 @@ void invalidDouble() throws Exception { Exception exception = catchException(() -> new Args(schema, arguments)); //then - assertThat(exception).isInstanceOf(Args.ArgsException.class); + assertThat(exception).isInstanceOf(ArgsException.class); - Args.ArgsException e = (Args.ArgsException) exception; - assertThat(e.errorMessage()).isEqualTo("Argument -x expects an double but was 'Forty two'."); - assertThat(e.getErrorCode()).isEqualTo(Args.ArgsException.ErrorCode.INVALID_DOUBLE); + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.INVALID_DOUBLE); assertThat(e.getErrorArgumentId()).isEqualTo('x'); assertThat(e.getErrorParameter()).isEqualTo("Forty two"); } @@ -407,20 +401,4 @@ void invalidType() throws Exception { assertThat(args.getInt('y')).isZero(); // y is type String assertThat(args.getDouble('y')).isZero(); // y is type String } - - @DisplayName("유효한 args에서 errorMessage를 조회할 경우 Excpetion이 발생한다") - @Test - void errorMessageThrowExceptionWhenErrorCodeIsOK() throws Exception { - //given - Args args = new Args("x", new String[]{"-x"}); - assertThat(args.isValid()).isTrue(); - - //when - Exception exception = catchException(args::errorMessage); - - //then - assertThat(exception) - .isInstanceOf(Exception.class) - .hasMessage("TILT: Should not get here."); - } } \ No newline at end of file From eee067dee960d2b3f583d08e3527506f074a8bb1 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 15:27:16 +0900 Subject: [PATCH 11/14] =?UTF-8?q?11.=20ArgumentMarshaler=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 83 ----------------- .../chapter14/args/ArgumentMarshaler.java | 9 ++ .../args/BooleanArgumentMarshaler.java | 17 ++++ .../args/DoubleArgumentMarshaler.java | 29 ++++++ .../args/IntegerArgumentMarshaler.java | 29 ++++++ .../args/StringArgumentMarshaler.java | 24 +++++ src/test/java/chapter14/args/ArgsTest.java | 92 ------------------- .../args/DoubleArgumentMarshalerTest.java | 48 ++++++++++ .../args/IntegerArgumentMarshalerTest.java | 48 ++++++++++ .../args/StringArgumentMarshalerTest.java | 30 ++++++ 10 files changed, 234 insertions(+), 175 deletions(-) create mode 100644 src/main/java/chapter14/args/ArgumentMarshaler.java create mode 100644 src/main/java/chapter14/args/BooleanArgumentMarshaler.java create mode 100644 src/main/java/chapter14/args/DoubleArgumentMarshaler.java create mode 100644 src/main/java/chapter14/args/IntegerArgumentMarshaler.java create mode 100644 src/main/java/chapter14/args/StringArgumentMarshaler.java create mode 100644 src/test/java/chapter14/args/DoubleArgumentMarshalerTest.java create mode 100644 src/test/java/chapter14/args/IntegerArgumentMarshalerTest.java create mode 100644 src/test/java/chapter14/args/StringArgumentMarshalerTest.java diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index efa1e30..15626b6 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -10,7 +10,6 @@ public class Args { private Iterator currentArgument; private List argsList; - public Args(String schema, String[] args) throws ArgsException { this.schema = schema; argsList = Arrays.asList(args); @@ -159,86 +158,4 @@ public boolean has(char arg) { public boolean isValid() { return valid; } - - private interface ArgumentMarshaler { - void set(Iterator currentArgument) throws ArgsException; - - Object get(); - } - - private class BooleanArgumentMarshaler implements ArgumentMarshaler { - private boolean booleanValue = false; - - @Override - public void set(Iterator currentArgument) throws ArgsException { - booleanValue = true; - } - - @Override - public Object get() { - return booleanValue; - } - } - - private class StringArgumentMarshaler implements ArgumentMarshaler { - private String stringValue = ""; - - @Override - public void set(Iterator currentArgument) throws ArgsException { - try { - stringValue = currentArgument.next(); - } catch (NoSuchElementException e) { - throw new ArgsException(ArgsException.ErrorCode.MISSING_STRING); - } - } - - @Override - public Object get() { - return stringValue; - } - } - - private class IntegerArgumentMarshaler implements ArgumentMarshaler { - private int intValue = 0; - - @Override - public void set(Iterator currentArgument) throws ArgsException { - String parameter = null; - try { - parameter = currentArgument.next(); - intValue = Integer.parseInt(parameter); - } catch (NoSuchElementException e) { - throw new ArgsException(ArgsException.ErrorCode.MISSING_INTEGER); - } catch (NumberFormatException e) { - throw new ArgsException(ArgsException.ErrorCode.INVALID_INTEGER, parameter); - } - } - - @Override - 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) { - throw new ArgsException(ArgsException.ErrorCode.MISSING_DOUBLE, parameter); - } catch (NumberFormatException e) { - throw new ArgsException(ArgsException.ErrorCode.INVALID_DOUBLE, parameter); - } - } - - @Override - public Object get() { - return doubleValue; - } - } } diff --git a/src/main/java/chapter14/args/ArgumentMarshaler.java b/src/main/java/chapter14/args/ArgumentMarshaler.java new file mode 100644 index 0000000..8a641aa --- /dev/null +++ b/src/main/java/chapter14/args/ArgumentMarshaler.java @@ -0,0 +1,9 @@ +package chapter14.args; + +import java.util.Iterator; + +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 new file mode 100644 index 0000000..4619a7e --- /dev/null +++ b/src/main/java/chapter14/args/BooleanArgumentMarshaler.java @@ -0,0 +1,17 @@ +package chapter14.args; + +import java.util.Iterator; + +public class BooleanArgumentMarshaler implements ArgumentMarshaler { + private boolean booleanValue = false; + + @Override + public void set(Iterator currentArgument) throws ArgsException { + booleanValue = true; + } + + @Override + public Object get() { + return booleanValue; + } +} \ No newline at end of file diff --git a/src/main/java/chapter14/args/DoubleArgumentMarshaler.java b/src/main/java/chapter14/args/DoubleArgumentMarshaler.java new file mode 100644 index 0000000..16544d3 --- /dev/null +++ b/src/main/java/chapter14/args/DoubleArgumentMarshaler.java @@ -0,0 +1,29 @@ +package chapter14.args; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +import static chapter14.args.ArgsException.ErrorCode.INVALID_DOUBLE; +import static chapter14.args.ArgsException.ErrorCode.MISSING_DOUBLE; + +public 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) { + throw new ArgsException(MISSING_DOUBLE); + } catch (NumberFormatException e) { + throw new ArgsException(INVALID_DOUBLE, parameter); + } + } + + @Override + public Object get() { + return doubleValue; + } +} \ No newline at end of file diff --git a/src/main/java/chapter14/args/IntegerArgumentMarshaler.java b/src/main/java/chapter14/args/IntegerArgumentMarshaler.java new file mode 100644 index 0000000..ee040a5 --- /dev/null +++ b/src/main/java/chapter14/args/IntegerArgumentMarshaler.java @@ -0,0 +1,29 @@ +package chapter14.args; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +import static chapter14.args.ArgsException.ErrorCode.INVALID_INTEGER; +import static chapter14.args.ArgsException.ErrorCode.MISSING_INTEGER; + +public class IntegerArgumentMarshaler implements ArgumentMarshaler { + private int intValue = 0; + + @Override + public void set(Iterator currentArgument) throws ArgsException { + String parameter = null; + try { + parameter = currentArgument.next(); + intValue = Integer.parseInt(parameter); + } catch (NoSuchElementException e) { + throw new ArgsException(MISSING_INTEGER); + } catch (NumberFormatException e) { + throw new ArgsException(INVALID_INTEGER, parameter); + } + } + + @Override + public Object get() { + return intValue; + } +} \ No newline at end of file diff --git a/src/main/java/chapter14/args/StringArgumentMarshaler.java b/src/main/java/chapter14/args/StringArgumentMarshaler.java new file mode 100644 index 0000000..2eef6d9 --- /dev/null +++ b/src/main/java/chapter14/args/StringArgumentMarshaler.java @@ -0,0 +1,24 @@ +package chapter14.args; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +import static chapter14.args.ArgsException.ErrorCode.MISSING_STRING; + +public class StringArgumentMarshaler implements ArgumentMarshaler { + private String stringValue = ""; + + @Override + public void set(Iterator currentArgument) throws ArgsException { + try { + stringValue = currentArgument.next(); + } catch (NoSuchElementException e) { + throw new ArgsException(MISSING_STRING); + } + } + + @Override + public Object get() { + return stringValue; + } +} \ 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 a849c8a..e9f43c9 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -212,24 +212,6 @@ void simpleStringNotPresent() throws Exception { assertThat(actual).isEmpty(); } - @DisplayName("String Argument 값이 없는 경우") - @Test - void missingStringArgument() throws Exception { - //given - String schema = "x*"; - String[] arguments = new String[]{"-x"}; // missing - - //when - Exception exception = catchException(() -> new Args(schema, arguments)); - - //then - assertThat(exception).isInstanceOf(ArgsException.class); - - ArgsException e = (ArgsException) exception; - assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_STRING); - assertThat(e.getErrorArgumentId()).isEqualTo('x'); - } - @DisplayName("int 값이 있는 경우") @Test void simpleIntPresent() throws Exception { @@ -281,43 +263,6 @@ void simpleIntNotPresent() throws Exception { assertThat(actual).isZero(); } - @DisplayName("Integer Argument 값이 없는 경우") - @Test - void missingInteger() throws Exception { - //given - String schema = "x#"; - String[] arguments = new String[]{"-x"}; // missing - - //when - Exception exception = catchException(() -> new Args(schema, arguments)); - - //then - assertThat(exception).isInstanceOf(ArgsException.class); - - ArgsException e = (ArgsException) exception; - assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_INTEGER); - assertThat(e.getErrorArgumentId()).isEqualTo('x'); - } - - @DisplayName("Integer Argument 값을 파싱할 수 없는 경우") - @Test - void invalidInteger() throws Exception { - //given - String schema = "x#"; - String[] arguments = new String[]{"-x", "Forty two"}; - - //when - Exception exception = catchException(() -> new Args(schema, arguments)); - - //then - assertThat(exception).isInstanceOf(ArgsException.class); - - ArgsException e = (ArgsException) exception; - assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.INVALID_INTEGER); - assertThat(e.getErrorArgumentId()).isEqualTo('x'); - assertThat(e.getErrorParameter()).isEqualTo("Forty two"); - } - @DisplayName("double 값이 있는 경우") @Test void simpleDoublePresent() throws Exception { @@ -348,43 +293,6 @@ void simpleDoubleNotPresent() throws Exception { assertThat(actual).isZero(); } - @DisplayName("Double Argument 값이 없는 경우") - @Test - void missingDouble() throws Exception { - //given - String schema = "x##"; - String[] arguments = new String[]{"-x"}; // missing - - //when - Exception exception = catchException(() -> new Args(schema, arguments)); - - //then - assertThat(exception).isInstanceOf(ArgsException.class); - - ArgsException e = (ArgsException) exception; - assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_DOUBLE); - assertThat(e.getErrorArgumentId()).isEqualTo('x'); - } - - @DisplayName("Double Argument 값을 파싱할 수 없는 경우") - @Test - void invalidDouble() throws Exception { - //given - String schema = "x##"; - String[] arguments = new String[]{"-x", "Forty two"}; - - //when - Exception exception = catchException(() -> new Args(schema, arguments)); - - //then - assertThat(exception).isInstanceOf(ArgsException.class); - - ArgsException e = (ArgsException) exception; - assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.INVALID_DOUBLE); - assertThat(e.getErrorArgumentId()).isEqualTo('x'); - assertThat(e.getErrorParameter()).isEqualTo("Forty two"); - } - @DisplayName("잘못된 타입으로 호출한 경우") @Test void invalidType() throws Exception { diff --git a/src/test/java/chapter14/args/DoubleArgumentMarshalerTest.java b/src/test/java/chapter14/args/DoubleArgumentMarshalerTest.java new file mode 100644 index 0000000..609941e --- /dev/null +++ b/src/test/java/chapter14/args/DoubleArgumentMarshalerTest.java @@ -0,0 +1,48 @@ +package chapter14.args; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +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 DoubleArgumentMarshalerTest { + private ArgumentMarshaler am = new DoubleArgumentMarshaler(); + + @DisplayName("값을 파싱할 수 없는 경우") + @Test + void invalidDouble() { + //given + Iterator argument = List.of("Forty two").iterator(); + + //when + Exception exception = catchException(() -> am.set(argument)); + + //then + assertThat(exception).isInstanceOf(ArgsException.class); + + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.INVALID_DOUBLE); + assertThat(e.getErrorParameter()).isEqualTo("Forty two"); + } + + @DisplayName("Argument 값이 없는 경우") + @Test + void missingDouble() { + //given + Iterator argument = Collections.emptyIterator(); + + //when + Exception exception = catchException(() -> am.set(argument)); + + //then + assertThat(exception).isInstanceOf(ArgsException.class); + + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_DOUBLE); + } +} \ No newline at end of file diff --git a/src/test/java/chapter14/args/IntegerArgumentMarshalerTest.java b/src/test/java/chapter14/args/IntegerArgumentMarshalerTest.java new file mode 100644 index 0000000..9135c20 --- /dev/null +++ b/src/test/java/chapter14/args/IntegerArgumentMarshalerTest.java @@ -0,0 +1,48 @@ +package chapter14.args; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +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 IntegerArgumentMarshalerTest { + private ArgumentMarshaler am = new IntegerArgumentMarshaler(); + + @DisplayName("Integer Argument 값을 파싱할 수 없는 경우") + @Test + void invalidInteger() { + //given + Iterator argument = List.of("Forty two").iterator(); + + //when + Exception exception = catchException(() -> am.set(argument)); + + //then + assertThat(exception).isInstanceOf(ArgsException.class); + + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.INVALID_INTEGER); + assertThat(e.getErrorParameter()).isEqualTo("Forty two"); + } + + @DisplayName("Argument 값이 없는 경우") + @Test + void missingInteger() { + //given + Iterator argument = Collections.emptyIterator(); + + //when + Exception exception = catchException(() -> am.set(argument)); + + //then + assertThat(exception).isInstanceOf(ArgsException.class); + + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_INTEGER); + } +} \ No newline at end of file diff --git a/src/test/java/chapter14/args/StringArgumentMarshalerTest.java b/src/test/java/chapter14/args/StringArgumentMarshalerTest.java new file mode 100644 index 0000000..9f7772c --- /dev/null +++ b/src/test/java/chapter14/args/StringArgumentMarshalerTest.java @@ -0,0 +1,30 @@ +package chapter14.args; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.Iterator; + +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 + void missingString() { + //given + Iterator argument = Collections.emptyIterator(); + + //when + Exception exception = catchException(() -> am.set(argument)); + + //then + assertThat(exception).isInstanceOf(ArgsException.class); + + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.MISSING_STRING); + } +} \ No newline at end of file From 7a2694070151c3b2e82985bf92ca440c7ac2c936 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 15:40:19 +0900 Subject: [PATCH 12/14] =?UTF-8?q?12.=20Args=20isValid=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 | 17 +++-------------- src/test/java/chapter14/args/ArgsTest.java | 12 +----------- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 15626b6..4de7656 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -4,7 +4,6 @@ public class Args { private String schema; - private boolean valid = true; private Map marshalers = new HashMap<>(); private Set argsFound = new HashSet<>(); private Iterator currentArgument; @@ -13,15 +12,12 @@ public class Args { public Args(String schema, String[] args) throws ArgsException { this.schema = schema; argsList = Arrays.asList(args); - valid = parse(); + parse(); } - private boolean parse() throws ArgsException { - if (schema.length() == 0 && argsList.size() == 0) - return true; + private void parse() throws ArgsException { parseSchema(); parseArguments(); - return valid; } private boolean parseSchema() throws ArgsException { @@ -60,12 +56,11 @@ private void validateSchemaElementId(char elementId) throws ArgsException { } } - private boolean parseArguments() throws ArgsException { + private void parseArguments() throws ArgsException { for (currentArgument = argsList.iterator(); currentArgument.hasNext(); ) { String arg = currentArgument.next(); parseArgument(arg); } - return true; } private void parseArgument(String arg) throws ArgsException { @@ -83,7 +78,6 @@ private void parseElement(char argChar) throws ArgsException { if (setArgument(argChar)) argsFound.add(argChar); else { - valid = false; throw new ArgsException(ArgsException.ErrorCode.UNEXPECTED_ARGUMENT, argChar, null); } } @@ -96,7 +90,6 @@ private boolean setArgument(char argChar) throws ArgsException { m.set(currentArgument); return true; } catch (ArgsException e) { - valid = false; e.setErrorArgumentId(argChar); throw e; } @@ -154,8 +147,4 @@ public double getDouble(char arg) { public boolean has(char arg) { return argsFound.contains(arg); } - - public boolean isValid() { - return valid; - } } diff --git a/src/test/java/chapter14/args/ArgsTest.java b/src/test/java/chapter14/args/ArgsTest.java index e9f43c9..5af41c9 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -19,13 +19,12 @@ void noSchemaAndArguments() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.isValid()).isTrue(); assertThat(args.cardinality()).isZero(); } @DisplayName("schema가 없고 argument가 1개 있는 경우") @Test - void noSchemaButWithOneArgument() throws Exception { + void noSchemaButWithOneArgument() { //given String schema = ""; String[] arguments = new String[]{"-x"}; @@ -52,7 +51,6 @@ void multipleSchemasButNoArguments() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.isValid()).isTrue(); assertThat(args.cardinality()).isZero(); assertThat(args.has('x')).isFalse(); assertThat(args.has('y')).isFalse(); @@ -105,7 +103,6 @@ void spacesInFormat() throws Exception { 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(); @@ -122,7 +119,6 @@ void simpleBooleanPresent() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.isValid()).isTrue(); assertThat(args.cardinality()).isOne(); assertThat(args.getBoolean('x')).isTrue(); } @@ -138,7 +134,6 @@ void simpleBooleanMultiplePresent() throws Exception { 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(); @@ -172,7 +167,6 @@ void simpleStringPresent() throws Exception { Args args = new Args(schema, arguments); //then - assertThat(args.isValid()).isTrue(); assertThat(args.cardinality()).isOne(); assertThat(args.has('x')).isTrue(); assertThat(args.getString('x')).isEqualTo("param"); @@ -189,7 +183,6 @@ void simpleStringMultiplePresent() throws Exception { 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(); @@ -223,7 +216,6 @@ void simpleIntPresent() throws Exception { 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); @@ -240,7 +232,6 @@ void simpleIntMultiplePresent() throws Exception { 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(); @@ -274,7 +265,6 @@ void simpleDoublePresent() throws Exception { 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); From 0094313e5022705d82ef81c37479477cee8dc358 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 16:01:41 +0900 Subject: [PATCH 13/14] =?UTF-8?q?13.=20INVALID=5FARGUMENT=5FNAME,=20FORMAT?= =?UTF-8?q?=20errorCode=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 | 9 ++--- .../java/chapter14/args/ArgsException.java | 9 ++++- .../chapter14/args/ArgsExceptionTest.java | 38 ++++++++++++++++--- src/test/java/chapter14/args/ArgsTest.java | 19 ++++++---- 4 files changed, 56 insertions(+), 19 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index 4de7656..dcc5d3a 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -43,16 +43,15 @@ private void parseSchemaElement(String element) throws ArgsException { } else if (elementTail.equals("##")) { marshalers.put(elementId, new DoubleArgumentMarshaler()); } else { - throw new ArgsException( - String.format("Argument: %c has invalid format: %s.", - elementId, elementTail)); + throw new ArgsException(ArgsException.ErrorCode.INVALID_ARGUMENT_FORMAT, + elementId, elementTail); } } private void validateSchemaElementId(char elementId) throws ArgsException { if (!Character.isLetter(elementId)) { - throw new ArgsException( - "Bad character: " + elementId + " in Args format: " + schema); + throw new ArgsException(ArgsException.ErrorCode.INVALID_ARGUMENT_NAME, + elementId, null); } } diff --git a/src/main/java/chapter14/args/ArgsException.java b/src/main/java/chapter14/args/ArgsException.java index 79e4017..4e9addb 100644 --- a/src/main/java/chapter14/args/ArgsException.java +++ b/src/main/java/chapter14/args/ArgsException.java @@ -72,12 +72,19 @@ public String errorMessage() throws Exception { case MISSING_DOUBLE: return String.format("Could not find double parameter for -%c.", errorArgumentId); + case INVALID_ARGUMENT_NAME: + return String.format("'%c' is not a valid argument name.", + errorArgumentId); + case INVALID_ARGUMENT_FORMAT: + return String.format("'%s' is not a valid argument format.", + errorParameter); } return ""; } public enum ErrorCode { - OK, UNEXPECTED_ARGUMENT, + OK, INVALID_ARGUMENT_FORMAT, UNEXPECTED_ARGUMENT, + INVALID_ARGUMENT_NAME, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER, MISSING_DOUBLE, INVALID_DOUBLE diff --git a/src/test/java/chapter14/args/ArgsExceptionTest.java b/src/test/java/chapter14/args/ArgsExceptionTest.java index 0786192..a01faaf 100644 --- a/src/test/java/chapter14/args/ArgsExceptionTest.java +++ b/src/test/java/chapter14/args/ArgsExceptionTest.java @@ -2,6 +2,8 @@ import org.junit.jupiter.api.Test; +import static chapter14.args.ArgsException.ErrorCode; +import static chapter14.args.ArgsException.ErrorCode.*; import static org.assertj.core.api.Assertions.assertThat; class ArgsExceptionTest { @@ -9,7 +11,7 @@ class ArgsExceptionTest { @Test void unexpectedMessage() throws Exception { //given - ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.UNEXPECTED_ARGUMENT; + ErrorCode errorCode = UNEXPECTED_ARGUMENT; //when ArgsException e = new ArgsException(errorCode, 'x', null); @@ -21,7 +23,7 @@ void unexpectedMessage() throws Exception { @Test void missingStringMessage() throws Exception { //given - ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.MISSING_STRING; + ErrorCode errorCode = MISSING_STRING; //when ArgsException e = new ArgsException(errorCode, 'x', null); @@ -33,7 +35,7 @@ void missingStringMessage() throws Exception { @Test void invalidIntegerMessage() throws Exception { //given - ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.INVALID_INTEGER; + ErrorCode errorCode = INVALID_INTEGER; //when ArgsException e = new ArgsException(errorCode, 'x', "Forty two"); @@ -45,7 +47,7 @@ void invalidIntegerMessage() throws Exception { @Test void missingIntegerMessage() throws Exception { //given - ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.MISSING_INTEGER; + ErrorCode errorCode = MISSING_INTEGER; //when ArgsException e = new ArgsException(errorCode, 'x', null); @@ -57,7 +59,7 @@ void missingIntegerMessage() throws Exception { @Test void invalidDoubleMessage() throws Exception { //given - ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.INVALID_DOUBLE; + ErrorCode errorCode = INVALID_DOUBLE; //when ArgsException e = new ArgsException(errorCode, 'x', "Forty two"); @@ -69,7 +71,7 @@ void invalidDoubleMessage() throws Exception { @Test void missingDoubleMessage() throws Exception { //given - ArgsException.ErrorCode errorCode = ArgsException.ErrorCode.MISSING_DOUBLE; + ErrorCode errorCode = MISSING_DOUBLE; //when ArgsException e = new ArgsException(errorCode, 'x', null); @@ -77,4 +79,28 @@ void missingDoubleMessage() throws Exception { //then assertThat(e.errorMessage()).isEqualTo("Could not find double parameter for -x."); } + + @Test + void invalidArgumentNameMessage() throws Exception { + //given + ErrorCode errorCode = INVALID_ARGUMENT_NAME; + + //when + ArgsException e = new ArgsException(errorCode, 'x', null); + + //then + assertThat(e.errorMessage()).isEqualTo("'x' is not a valid argument name."); + } + + @Test + void invalidArgumentFormatMessage() throws Exception { + //given + ErrorCode errorCode = INVALID_ARGUMENT_FORMAT; + + //when + ArgsException e = new ArgsException(errorCode, 'x', "f~"); + + //then + assertThat(e.errorMessage()).isEqualTo("'f~' is not a valid argument format."); + } } \ 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 5af41c9..b28ab04 100644 --- a/src/test/java/chapter14/args/ArgsTest.java +++ b/src/test/java/chapter14/args/ArgsTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static chapter14.args.ArgsException.ErrorCode.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchException; @@ -36,7 +37,7 @@ void noSchemaButWithOneArgument() { assertThat(exception).isInstanceOf(ArgsException.class); ArgsException e = (ArgsException) exception; - assertThat(e.getErrorCode()).isEqualTo(ArgsException.ErrorCode.UNEXPECTED_ARGUMENT); + assertThat(e.getErrorCode()).isEqualTo(UNEXPECTED_ARGUMENT); assertThat(e.getErrorArgumentId()).isEqualTo('x'); } @@ -71,9 +72,11 @@ void nonLetterSchema() { Exception exception = catchException(() -> new Args(nonLetterSchemaElementId, arguments)); //then - assertThat(exception) - .isInstanceOf(ArgsException.class) - .hasMessage("Bad character: * in Args format: *"); + assertThat(exception).isInstanceOf(ArgsException.class); + + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(INVALID_ARGUMENT_NAME); + assertThat(e.getErrorArgumentId()).isEqualTo('*'); } @DisplayName("schema format이 유효하지 않은 경우") @@ -87,9 +90,11 @@ void invalidArgumentFormat() { Exception exception = catchException(() -> new Args(invalidSchemeFormat, arguments)); //then - assertThat(exception) - .isInstanceOf(ArgsException.class) - .hasMessage("Argument: f has invalid format: ~."); + assertThat(exception).isInstanceOf(ArgsException.class); + + ArgsException e = (ArgsException) exception; + assertThat(e.getErrorCode()).isEqualTo(INVALID_ARGUMENT_FORMAT); + assertThat(e.getErrorArgumentId()).isEqualTo('f'); } @DisplayName("Schema format에 스페이스가 있는 경우") From c36cfed9fe9a984171a09a396e93f78589c76959 Mon Sep 17 00:00:00 2001 From: viiviii Date: Thu, 12 May 2022 16:03:58 +0900 Subject: [PATCH 14/14] =?UTF-8?q?14.=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD=20=EB=93=B1=20=EC=B1=85?= =?UTF-8?q?=EC=9D=B4=EB=9E=91=20=EB=A7=9E=EC=B6=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chapter14/args/Args.java | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/chapter14/args/Args.java b/src/main/java/chapter14/args/Args.java index dcc5d3a..d3dd8bc 100644 --- a/src/main/java/chapter14/args/Args.java +++ b/src/main/java/chapter14/args/Args.java @@ -23,8 +23,7 @@ private void parse() throws ArgsException { private boolean parseSchema() throws ArgsException { for (String element : schema.split(",")) { if (element.length() > 0) { - String trimmedElement = element.trim(); - parseSchemaElement(trimmedElement); + parseSchemaElement(element.trim()); } } return true; @@ -77,7 +76,8 @@ private void parseElement(char argChar) throws ArgsException { if (setArgument(argChar)) argsFound.add(argChar); else { - throw new ArgsException(ArgsException.ErrorCode.UNEXPECTED_ARGUMENT, argChar, null); + throw new ArgsException(ArgsException.ErrorCode.UNEXPECTED_ARGUMENT, + argChar, null); } } @@ -105,33 +105,33 @@ public String usage() { return ""; } - public String getString(char arg) { + public boolean getBoolean(char arg) { ArgumentMarshaler am = marshalers.get(arg); + boolean b = false; try { - return am == null ? "" : (String) am.get(); + b = am != null && (Boolean) am.get(); } catch (ClassCastException e) { - return ""; + b = false; } + return b; } - public int getInt(char arg) { + public String getString(char arg) { ArgumentMarshaler am = marshalers.get(arg); try { - return am == null ? 0 : (Integer) am.get(); + return am == null ? "" : (String) am.get(); } catch (ClassCastException e) { - return 0; + return ""; } } - public boolean getBoolean(char arg) { + public int getInt(char arg) { ArgumentMarshaler am = marshalers.get(arg); - boolean b = false; try { - b = am != null && (Boolean) am.get(); + return am == null ? 0 : (Integer) am.get(); } catch (ClassCastException e) { - b = false; + return 0; } - return b; } public double getDouble(char arg) {