From bff0722c4e81fdd1c9a072a5fb1ca3548062b4fa Mon Sep 17 00:00:00 2001 From: Heesoo Date: Tue, 29 Oct 2024 19:11:03 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[docs]=20README.md=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-HS.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 README-HS.md diff --git a/README-HS.md b/README-HS.md new file mode 100644 index 0000000..b48f13e --- /dev/null +++ b/README-HS.md @@ -0,0 +1,18 @@ +## 구현해야할 기능 + +**1. 사용자 입력** + +**2. 입력값 검증** +- 빈값 입력 ("" 또는 null) : 0 반환 +- 숫자 하나 입력 : 해당 숫자 반환 +- 숫자 이외의 값 : RuntimeException throw +- 음수 : RuntimeException throw + +**3. 쉼표(,) 또는 콜론(;) 구분자 기준으로 문자열 분리** + +**4. // 와 \\n 위치한 문자 구분자로 사용해 문자열 분리** +- 예를 들면 //;\n1;2;3 + +**5. 덧셈 계산** + +**6. 계산 결과** \ No newline at end of file From 26e5d3b7fe4bc90ad62107e86371e6d7fc3bf943 Mon Sep 17 00:00:00 2001 From: Heesoo Date: Tue, 29 Oct 2024 22:11:07 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[docs]=20README.md=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-HS.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/README-HS.md b/README-HS.md index b48f13e..8be8bb2 100644 --- a/README-HS.md +++ b/README-HS.md @@ -1,18 +1,16 @@ ## 구현해야할 기능 -**1. 사용자 입력** - -**2. 입력값 검증** +**1. 입력값 검증** - 빈값 입력 ("" 또는 null) : 0 반환 - 숫자 하나 입력 : 해당 숫자 반환 + +**2. 쉼표(,) 또는 콜론(;) 구분자 기준으로 문자열 분리** - 숫자 이외의 값 : RuntimeException throw - 음수 : RuntimeException throw -**3. 쉼표(,) 또는 콜론(;) 구분자 기준으로 문자열 분리** - -**4. // 와 \\n 위치한 문자 구분자로 사용해 문자열 분리** +**3. // 와 \\n 위치한 문자 구분자로 사용해 문자열 분리** - 예를 들면 //;\n1;2;3 -**5. 덧셈 계산** +**4. 덧셈 계산** -**6. 계산 결과** \ No newline at end of file +**5. 계산 결과** \ No newline at end of file From d16640f3c5e3fa658b1ed2cfabb49b523c5b81d7 Mon Sep 17 00:00:00 2001 From: Heesoo Date: Thu, 31 Oct 2024 17:36:39 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[feat]=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EB=8D=A7=EC=85=88=20=EA=B3=84=EC=82=B0=EA=B8=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-HS.md | 4 +- src/main/java/calculator/AddCalculator.java | 24 +++ .../java/calculator/StringAddCalculator.java | 18 ++ src/main/java/calculator/StringSplitter.java | 45 +++++ src/main/java/calculator/ValidationUtils.java | 28 +++ .../calculator/message/ErrorMessages.java | 6 + .../java/calculator/AddCalculatorTest.java | 64 ++++++ .../calculator/StringAddCalculatorTest.java | 103 ++++++++++ .../java/calculator/StringSplitterTest.java | 189 ++++++++++++++++++ .../java/calculator/ValidationUtilsTest.java | 93 +++++++++ 10 files changed, 572 insertions(+), 2 deletions(-) create mode 100644 src/main/java/calculator/AddCalculator.java create mode 100644 src/main/java/calculator/StringAddCalculator.java create mode 100644 src/main/java/calculator/StringSplitter.java create mode 100644 src/main/java/calculator/ValidationUtils.java create mode 100644 src/main/java/calculator/message/ErrorMessages.java create mode 100644 src/test/java/calculator/AddCalculatorTest.java create mode 100644 src/test/java/calculator/StringAddCalculatorTest.java create mode 100644 src/test/java/calculator/StringSplitterTest.java create mode 100644 src/test/java/calculator/ValidationUtilsTest.java diff --git a/README-HS.md b/README-HS.md index 8be8bb2..4971fea 100644 --- a/README-HS.md +++ b/README-HS.md @@ -2,9 +2,9 @@ **1. 입력값 검증** - 빈값 입력 ("" 또는 null) : 0 반환 -- 숫자 하나 입력 : 해당 숫자 반환 -**2. 쉼표(,) 또는 콜론(;) 구분자 기준으로 문자열 분리** +**2. 쉼표(,) 또는 콜론(:) 구분자 기준으로 문자열 분리** +- 숫자 하나 입력 : 해당 숫자 반환 - 숫자 이외의 값 : RuntimeException throw - 음수 : RuntimeException throw diff --git a/src/main/java/calculator/AddCalculator.java b/src/main/java/calculator/AddCalculator.java new file mode 100644 index 0000000..79988e8 --- /dev/null +++ b/src/main/java/calculator/AddCalculator.java @@ -0,0 +1,24 @@ +package calculator; + +public class AddCalculator { + private final String[] numbers; + + public AddCalculator(String[] stringNumbers) { + this.numbers = stringNumbers; + } + + public int sum() { + int result = 0; + + for (String number : numbers) { + int num = ValidationUtils.stringToInt(number); + ValidationUtils.isPositiveNumber(num); + + result += num; + } + + return result; + } + + +} diff --git a/src/main/java/calculator/StringAddCalculator.java b/src/main/java/calculator/StringAddCalculator.java new file mode 100644 index 0000000..bf060bf --- /dev/null +++ b/src/main/java/calculator/StringAddCalculator.java @@ -0,0 +1,18 @@ +package calculator; + +public class StringAddCalculator { + + public static int splitAndSum(String input) { + if (ValidationUtils.isEmptyOrNull(input)){ + return 0; + } + + StringSplitter splitter = new StringSplitter(input); + String[] stringNumbers = splitter.split(); + + AddCalculator calculator = new AddCalculator(stringNumbers); + return calculator.sum(); + + } + +} diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/StringSplitter.java new file mode 100644 index 0000000..ee5decd --- /dev/null +++ b/src/main/java/calculator/StringSplitter.java @@ -0,0 +1,45 @@ +package calculator; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StringSplitter { + private final String input; + private Matcher m; + + public StringSplitter(String input) { + this.input = input; + } + + public String[] split() { + if (isContainsCustomDelimiter()){ + return splitCustomDelimiter(); + } + + if (isContainsDelimiter()){ + return splitDelimiter(); + } + + return new String[]{input}; + + } + + public boolean isContainsCustomDelimiter(){ + m = Pattern.compile("//(.)\n(.*)").matcher(input); + return m.find(); + } + + public String[] splitCustomDelimiter() { + String customDelimiter = m.group(1); + return m.group(2).split(customDelimiter); + } + + public String[] splitDelimiter() { + return input.split("[,:]"); + } + + public boolean isContainsDelimiter() { + return (input.contains(",") || input.contains(":")); + } + +} diff --git a/src/main/java/calculator/ValidationUtils.java b/src/main/java/calculator/ValidationUtils.java new file mode 100644 index 0000000..fa3c65e --- /dev/null +++ b/src/main/java/calculator/ValidationUtils.java @@ -0,0 +1,28 @@ +package calculator; + +import calculator.message.ErrorMessages; + +public class ValidationUtils { + + public static boolean isEmptyOrNull(String input) { + return input == null || input.isEmpty(); + } + + public static int stringToInt(String input) { + int value = 0; + + try { + value = Integer.parseInt(input); + } catch (NumberFormatException ex){ + throw new NumberFormatException(ErrorMessages.INVALID_INPUT); + } + + return value; + } + + public static void isPositiveNumber(int number){ + if (number < 0){ + throw new IllegalArgumentException(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); + } + } +} diff --git a/src/main/java/calculator/message/ErrorMessages.java b/src/main/java/calculator/message/ErrorMessages.java new file mode 100644 index 0000000..fb3d70e --- /dev/null +++ b/src/main/java/calculator/message/ErrorMessages.java @@ -0,0 +1,6 @@ +package calculator.message; + +public class ErrorMessages { + public static final String INVALID_INPUT = "구분자, 숫자 이외의 값은 입력 불가합니다."; + public static final String INVALID_NEGATIVE_NUMBER_INPUT = "음수는 입력 불가합니다."; +} diff --git a/src/test/java/calculator/AddCalculatorTest.java b/src/test/java/calculator/AddCalculatorTest.java new file mode 100644 index 0000000..d2e47a2 --- /dev/null +++ b/src/test/java/calculator/AddCalculatorTest.java @@ -0,0 +1,64 @@ +package calculator; + +import calculator.message.ErrorMessages; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class AddCalculatorTest { + + @Test + @DisplayName("덧셈 계산") + void sum(){ + // given, when + AddCalculator addCalculator = new AddCalculator(new String[]{"1", "2", "3"}); + + // when + int response = addCalculator.sum(); + + // then + assertThat(response).isEqualTo(6); + } + + @Test + @DisplayName("덧셈 계산 시 숫자 하나 입력한 경우") + void sum_singleNumber(){ + // given + AddCalculator addCalculator = new AddCalculator(new String[]{"1"}); + + // when + int response = addCalculator.sum(); + + // then + assertThat(response).isEqualTo(1); + } + + @Test + @DisplayName("덧셈 계산 시 음수가 포함된 경우") + void sum_inputNegativeNumber(){ + // given + AddCalculator addCalculator = new AddCalculator(new String[]{"1", "-2", "3"}); + + // when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, addCalculator::sum); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); + } + + @Test + @DisplayName("덧셈 계산 시 숫자 이외의 값이 입력된 경우") + void sum_inputInvalidDelimiter(){ + // given + AddCalculator addCalculator = new AddCalculator(new String[]{"1", "문", "3"}); + + // when + NumberFormatException fail = assertThrows(NumberFormatException.class, addCalculator::sum); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); + } + +} diff --git a/src/test/java/calculator/StringAddCalculatorTest.java b/src/test/java/calculator/StringAddCalculatorTest.java new file mode 100644 index 0000000..d3d8a24 --- /dev/null +++ b/src/test/java/calculator/StringAddCalculatorTest.java @@ -0,0 +1,103 @@ +package calculator; + +import calculator.message.ErrorMessages; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class StringAddCalculatorTest { + + @Test + @DisplayName("뮨자열 덧셈 계산기 빈값 입력") + void splitAndSum_inputEmpty(){ + // given, when + int response = StringAddCalculator.splitAndSum(""); + + // then + assertThat(response).isEqualTo(0); + } + + @Test + @DisplayName("뮨자열 덧셈 계산기 빈값 입력") + void splitAndSum_inputNull(){ + // given, when + int response = StringAddCalculator.splitAndSum(null); + + // then + assertThat(response).isEqualTo(0); + } + + @Test + @DisplayName("문자열 덧셈 계산기 콤마 입력") + void splitAndSum_comma(){ + // given, when + int response = StringAddCalculator.splitAndSum("1,2"); + + // then + assertThat(response).isEqualTo(3); + } + + @Test + @DisplayName("문자열 덧셈 계산기 콜론 입력") + void splitAndSum_colon(){ + // given, when + int response = StringAddCalculator.splitAndSum("1:2"); + + // then + assertThat(response).isEqualTo(3); + } + + @Test + @DisplayName("문자열 덧셈 계산기 사용자 지정 구분자 입력") + void splitAndSum_customDelimiter(){ + // given, when + int response = StringAddCalculator.splitAndSum("//;\n1;2;3"); + + // then + assertThat(response).isEqualTo(6); + } + + @Test + @DisplayName("문자열 덧셈 계산 숫자 하나 입력한 경우") + void splitAndSum_singleNumber(){ + // given, when + int response = StringAddCalculator.splitAndSum("13"); + + // then + assertThat(response).isEqualTo(13); + } + + @Test + @DisplayName("문자열 덧셈 계산기 숫자 이외의 값 입력") + void splitAndSum_inputNotNumber(){ + // given, when + NumberFormatException fail = assertThrows(NumberFormatException.class, () -> StringAddCalculator.splitAndSum("문자열")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); + } + + @Test + @DisplayName("문자열 덧셈 계산기 지정되어 있지 않은 구분자 입력") + void splitAndSum_inputInvalidDelimiter(){ + // given, when + NumberFormatException fail = assertThrows(NumberFormatException.class, () -> StringAddCalculator.splitAndSum("1;2;3;")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); + } + + @Test + @DisplayName("문자열 덧셈 계산기 음수 입력") + void splitAndSum_inputNegativeNumber(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, () -> StringAddCalculator.splitAndSum("1,-2,3")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); + } + + +} diff --git a/src/test/java/calculator/StringSplitterTest.java b/src/test/java/calculator/StringSplitterTest.java new file mode 100644 index 0000000..992d831 --- /dev/null +++ b/src/test/java/calculator/StringSplitterTest.java @@ -0,0 +1,189 @@ +package calculator; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +public class StringSplitterTest { + + @Test + @DisplayName("split 함수 콤마 포함된 경우") + void split_comma(){ + // when + StringSplitter splitter = new StringSplitter("1,2"); + String[] response = splitter.split(); + + assertArrayEquals(new String[]{"1", "2"}, response); + } + + @Test + @DisplayName("split 함수 콜론 포함된 경우") + void split_colon(){ + // when + StringSplitter splitter = new StringSplitter("1:2"); + String[] response = splitter.split(); + + + assertArrayEquals(new String[]{"1", "2"}, response); + } + + @Test + @DisplayName("split 함수 콤마, 콜론 포함된 경우") + void split_commaAndColon(){ + // when + StringSplitter splitter = new StringSplitter("1,2:3"); + String[] response = splitter.split(); + + assertArrayEquals(new String[]{"1", "2", "3"}, response); + } + + @Test + @DisplayName("split 함수 사용자 지정 구분자") + void split_customDelimiter1(){ + // when + StringSplitter splitter = new StringSplitter("//;\n1;2;3"); + String[] response = splitter.split(); + + // then + assertArrayEquals(new String[]{"1", "2", "3"}, response); + } + + @Test + @DisplayName("split 함수 사용자 지정 구분자") + void split_customDelimiter2(){ + // when + StringSplitter splitter = new StringSplitter("//,\n1,2,3"); + String[] response = splitter.split(); + + // then + assertArrayEquals(new String[]{"1", "2", "3"}, response); + } + + @Test + @DisplayName("split 함수 사용자 지정 구분자") + void split_customDelimiter3(){ + // when + StringSplitter splitter = new StringSplitter("//;\n1,2;3"); + String[] response = splitter.split(); + + for (String s : response) { + System.out.println(s); + } + + // then + assertArrayEquals(new String[]{"1,2", "3"}, response); + } + + @Test + @DisplayName("split 함수 구분자 없어 문자열 반환") + void split_notContainsDelimiter(){ + // when + StringSplitter splitter = new StringSplitter("1;2;3"); + String[] response = splitter.split(); + + // then + assertArrayEquals(new String[]{"1;2;3"}, response); + } + + @Test + @DisplayName("구분자 포함 여부 확인 true 반환") + void isContainsDelimiter_comma(){ + + StringSplitter splitter = new StringSplitter("1,2"); + boolean response = splitter.isContainsDelimiter(); + + assertThat(response).isTrue(); + } + + @Test + @DisplayName("구분자 포함 여부 확인 true 반환") + void isContainsDelimiter_colon(){ + + StringSplitter splitter = new StringSplitter("1:2"); + boolean response = splitter.isContainsDelimiter(); + + assertThat(response).isTrue(); + } + + @Test + @DisplayName("구분자 포함 여부 확인 true 반환") + void isContainsDelimiter_commaAndColon(){ + + StringSplitter splitter = new StringSplitter("1,2:3"); + boolean response = splitter.isContainsDelimiter(); + + assertThat(response).isTrue(); + } + + @Test + @DisplayName("구분자 포함 여부 확인 false 반환") + void isContainsDelimiter_false(){ + + StringSplitter splitter = new StringSplitter("12;3"); + boolean response = splitter.isContainsDelimiter(); + + assertThat(response).isFalse(); + } + + @Test + @DisplayName("사용자 지정 구분자 포함 여부 확인 true 반환") + void isContainsCustomDelimiter_true(){ + StringSplitter splitter = new StringSplitter("//;\n1;2;3"); + boolean response = splitter.isContainsCustomDelimiter(); + + assertThat(response).isTrue(); + } + + @Test + @DisplayName("사용자 지정 구분자 포함 여부 확인 false 반환") + void isContainsCustomDelimiter_false(){ + StringSplitter splitter = new StringSplitter("1;2;3"); + boolean response = splitter.isContainsCustomDelimiter(); + + assertThat(response).isFalse(); + } + + + + @Test + @DisplayName("콤마 구분자 분리") + void splitDelimiter_comma(){ + + // when + StringSplitter splitter = new StringSplitter("1,2"); + String[] response = splitter.splitDelimiter(); + + // then + assertArrayEquals(new String[]{"1", "2"}, response); + } + + @Test + @DisplayName("콜론 구분자 분리") + void splitDelimiter_colon(){ + + // when + StringSplitter splitter = new StringSplitter("1:2"); + String[] response = splitter.splitDelimiter(); + + // then + assertArrayEquals(new String[]{"1", "2"}, response); + } + + @Test + @DisplayName("콜론 구분자 분리") + void splitDelimiter_commaAndColon(){ + + // when + StringSplitter splitter = new StringSplitter("1,2:3"); + String[] response = splitter.splitDelimiter(); + + // then + assertArrayEquals(new String[]{"1", "2", "3"}, response); + } + +} diff --git a/src/test/java/calculator/ValidationUtilsTest.java b/src/test/java/calculator/ValidationUtilsTest.java new file mode 100644 index 0000000..9c03f13 --- /dev/null +++ b/src/test/java/calculator/ValidationUtilsTest.java @@ -0,0 +1,93 @@ +package calculator; + +import calculator.message.ErrorMessages; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +public class ValidationUtilsTest { + + @Test + @DisplayName("빈값 입력 시 true 반환") + void inputEmpty(){ + // given, when + boolean response = ValidationUtils.isEmptyOrNull(""); + + // then + assertTrue(response); + } + + @Test + @DisplayName("null 입력 시 true 반환") + void inputNull(){ + // given, when + boolean response = ValidationUtils.isEmptyOrNull(null); + + // then + assertThat(response).isTrue(); + } + + @Test + @DisplayName("빈값, null 아닌 정상 입력 시 false 반환 ") + void inputCorrect(){ + // given, when + boolean response = ValidationUtils.isEmptyOrNull("1,2"); + + // then + assertThat(response).isFalse(); + } + + @Test + @DisplayName("문자열 숫자를 숫자로 변경") + void stringToInt(){ + // given, when + int response = ValidationUtils.stringToInt("1"); + + // then + assertThat(response).isEqualTo(1); + } + + @Test + @DisplayName("문자열 숫자 변경 시 숫자 이외의 값 입력으로 예외 발생") + void stringToIntInputNotNumber1(){ + // given, when + NumberFormatException fail = assertThrows(NumberFormatException.class, + () -> ValidationUtils.stringToInt("문자열")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); + } + + @Test + @DisplayName("문자열 숫자 변경 시 숫자 이외의 값이 있어 예외 발생") + void stringToIntInputNotNumber2(){ + // given, when + NumberFormatException fail = assertThrows(NumberFormatException.class, + () -> ValidationUtils.stringToInt("1/2")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); + } + + @Test + @DisplayName("양수인지 확인") + void isPositiveNumber(){ + // given, when, then + assertDoesNotThrow(() -> ValidationUtils.isPositiveNumber(10)); + } + + @Test + @DisplayName("문자열 숫자 변경 시 음수로 예외 발생") + void stringToIntInputNegativeNumber(){ + // given, when + IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, + () -> ValidationUtils.isPositiveNumber(-2)); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); + } + + +} From eeb5e299ec5a0c487aaca8776fb85873ed5b201f Mon Sep 17 00:00:00 2001 From: Heesoo Date: Thu, 31 Oct 2024 17:44:58 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[update]=20=EC=98=88=EC=99=B8=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/calculator/ValidationUtils.java | 6 +++--- src/test/java/calculator/AddCalculatorTest.java | 4 ++-- .../java/calculator/StringAddCalculatorTest.java | 13 ++++++++++--- src/test/java/calculator/StringSplitterTest.java | 3 --- src/test/java/calculator/ValidationUtilsTest.java | 6 +++--- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/calculator/ValidationUtils.java b/src/main/java/calculator/ValidationUtils.java index fa3c65e..ff78780 100644 --- a/src/main/java/calculator/ValidationUtils.java +++ b/src/main/java/calculator/ValidationUtils.java @@ -13,8 +13,8 @@ public static int stringToInt(String input) { try { value = Integer.parseInt(input); - } catch (NumberFormatException ex){ - throw new NumberFormatException(ErrorMessages.INVALID_INPUT); + } catch (RuntimeException ex){ + throw new RuntimeException(ErrorMessages.INVALID_INPUT); } return value; @@ -22,7 +22,7 @@ public static int stringToInt(String input) { public static void isPositiveNumber(int number){ if (number < 0){ - throw new IllegalArgumentException(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); + throw new RuntimeException(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); } } } diff --git a/src/test/java/calculator/AddCalculatorTest.java b/src/test/java/calculator/AddCalculatorTest.java index d2e47a2..d05eb2a 100644 --- a/src/test/java/calculator/AddCalculatorTest.java +++ b/src/test/java/calculator/AddCalculatorTest.java @@ -42,7 +42,7 @@ void sum_inputNegativeNumber(){ AddCalculator addCalculator = new AddCalculator(new String[]{"1", "-2", "3"}); // when - IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, addCalculator::sum); + RuntimeException fail = assertThrows(RuntimeException.class, addCalculator::sum); // then assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); @@ -55,7 +55,7 @@ void sum_inputInvalidDelimiter(){ AddCalculator addCalculator = new AddCalculator(new String[]{"1", "문", "3"}); // when - NumberFormatException fail = assertThrows(NumberFormatException.class, addCalculator::sum); + RuntimeException fail = assertThrows(RuntimeException.class, addCalculator::sum); // then assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); diff --git a/src/test/java/calculator/StringAddCalculatorTest.java b/src/test/java/calculator/StringAddCalculatorTest.java index d3d8a24..58d8787 100644 --- a/src/test/java/calculator/StringAddCalculatorTest.java +++ b/src/test/java/calculator/StringAddCalculatorTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertThrows; public class StringAddCalculatorTest { @@ -73,7 +74,7 @@ void splitAndSum_singleNumber(){ @DisplayName("문자열 덧셈 계산기 숫자 이외의 값 입력") void splitAndSum_inputNotNumber(){ // given, when - NumberFormatException fail = assertThrows(NumberFormatException.class, () -> StringAddCalculator.splitAndSum("문자열")); + RuntimeException fail = assertThrows(RuntimeException.class, () -> StringAddCalculator.splitAndSum("문자열")); // then assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); @@ -83,7 +84,7 @@ void splitAndSum_inputNotNumber(){ @DisplayName("문자열 덧셈 계산기 지정되어 있지 않은 구분자 입력") void splitAndSum_inputInvalidDelimiter(){ // given, when - NumberFormatException fail = assertThrows(NumberFormatException.class, () -> StringAddCalculator.splitAndSum("1;2;3;")); + RuntimeException fail = assertThrows(RuntimeException.class, () -> StringAddCalculator.splitAndSum("1;2;3;")); // then assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); @@ -93,11 +94,17 @@ void splitAndSum_inputInvalidDelimiter(){ @DisplayName("문자열 덧셈 계산기 음수 입력") void splitAndSum_inputNegativeNumber(){ // given, when - IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, () -> StringAddCalculator.splitAndSum("1,-2,3")); + RuntimeException fail = assertThrows(RuntimeException.class, () -> StringAddCalculator.splitAndSum("1,-2,3")); // then assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); } + @Test + public void splitAndSum_negative() throws Exception { + assertThatThrownBy(() -> StringAddCalculator.splitAndSum("-1,2,3")) + .isInstanceOf(RuntimeException.class); + } + } diff --git a/src/test/java/calculator/StringSplitterTest.java b/src/test/java/calculator/StringSplitterTest.java index 992d831..ae2f142 100644 --- a/src/test/java/calculator/StringSplitterTest.java +++ b/src/test/java/calculator/StringSplitterTest.java @@ -148,12 +148,9 @@ void isContainsCustomDelimiter_false(){ assertThat(response).isFalse(); } - - @Test @DisplayName("콤마 구분자 분리") void splitDelimiter_comma(){ - // when StringSplitter splitter = new StringSplitter("1,2"); String[] response = splitter.splitDelimiter(); diff --git a/src/test/java/calculator/ValidationUtilsTest.java b/src/test/java/calculator/ValidationUtilsTest.java index 9c03f13..51a60a5 100644 --- a/src/test/java/calculator/ValidationUtilsTest.java +++ b/src/test/java/calculator/ValidationUtilsTest.java @@ -53,7 +53,7 @@ void stringToInt(){ @DisplayName("문자열 숫자 변경 시 숫자 이외의 값 입력으로 예외 발생") void stringToIntInputNotNumber1(){ // given, when - NumberFormatException fail = assertThrows(NumberFormatException.class, + RuntimeException fail = assertThrows(RuntimeException.class, () -> ValidationUtils.stringToInt("문자열")); // then @@ -64,7 +64,7 @@ void stringToIntInputNotNumber1(){ @DisplayName("문자열 숫자 변경 시 숫자 이외의 값이 있어 예외 발생") void stringToIntInputNotNumber2(){ // given, when - NumberFormatException fail = assertThrows(NumberFormatException.class, + RuntimeException fail = assertThrows(RuntimeException.class, () -> ValidationUtils.stringToInt("1/2")); // then @@ -82,7 +82,7 @@ void isPositiveNumber(){ @DisplayName("문자열 숫자 변경 시 음수로 예외 발생") void stringToIntInputNegativeNumber(){ // given, when - IllegalArgumentException fail = assertThrows(IllegalArgumentException.class, + RuntimeException fail = assertThrows(RuntimeException.class, () -> ValidationUtils.isPositiveNumber(-2)); // then From 4f2967cfbc1c6985188f90e932a15603384aae7f Mon Sep 17 00:00:00 2001 From: Heesoo Date: Fri, 1 Nov 2024 20:57:14 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[refactor]=20=ED=95=A8=EC=88=98=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=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/calculator/AddCalculator.java | 18 ++++-- .../java/calculator/StringAddCalculator.java | 20 ++++--- src/main/java/calculator/StringSplitter.java | 6 +- .../{ => utils}/ValidationUtils.java | 17 +++--- .../java/calculator/AddCalculatorTest.java | 56 ++++++++++++++++--- .../calculator/StringAddCalculatorTest.java | 1 + .../{ => utils}/ValidationUtilsTest.java | 33 ++++++++++- 7 files changed, 117 insertions(+), 34 deletions(-) rename src/main/java/calculator/{ => utils}/ValidationUtils.java (61%) rename src/test/java/calculator/{ => utils}/ValidationUtilsTest.java (75%) diff --git a/src/main/java/calculator/AddCalculator.java b/src/main/java/calculator/AddCalculator.java index 79988e8..dd8be1c 100644 --- a/src/main/java/calculator/AddCalculator.java +++ b/src/main/java/calculator/AddCalculator.java @@ -1,24 +1,30 @@ package calculator; +import calculator.utils.ValidationUtils; + public class AddCalculator { private final String[] numbers; - public AddCalculator(String[] stringNumbers) { - this.numbers = stringNumbers; + public AddCalculator(String[] numbers) { + this.numbers = numbers; } - public int sum() { + public int add() { int result = 0; for (String number : numbers) { - int num = ValidationUtils.stringToInt(number); - ValidationUtils.isPositiveNumber(num); - + int num = validateAndConvert(number); result += num; } return result; } + public int validateAndConvert(String number){ + int num = ValidationUtils.stringToInt(number); + ValidationUtils.isPositiveNumber(num); + + return num; + } } diff --git a/src/main/java/calculator/StringAddCalculator.java b/src/main/java/calculator/StringAddCalculator.java index bf060bf..98766d1 100644 --- a/src/main/java/calculator/StringAddCalculator.java +++ b/src/main/java/calculator/StringAddCalculator.java @@ -1,18 +1,22 @@ package calculator; -public class StringAddCalculator { +import calculator.utils.ValidationUtils; +public class StringAddCalculator { public static int splitAndSum(String input) { - if (ValidationUtils.isEmptyOrNull(input)){ - return 0; - } + if (ValidationUtils.isEmptyOrNull(input)) return 0; - StringSplitter splitter = new StringSplitter(input); - String[] stringNumbers = splitter.split(); + String[] numbers = inputSplit(input); - AddCalculator calculator = new AddCalculator(stringNumbers); - return calculator.sum(); + if (ValidationUtils.isSingleNumber(numbers)) { + return ValidationUtils.stringToInt(numbers[0]); + } + + return new AddCalculator(numbers).add(); + } + public static String[] inputSplit(String input){ + return new StringSplitter(input).split(); } } diff --git a/src/main/java/calculator/StringSplitter.java b/src/main/java/calculator/StringSplitter.java index ee5decd..1816a42 100644 --- a/src/main/java/calculator/StringSplitter.java +++ b/src/main/java/calculator/StringSplitter.java @@ -12,16 +12,14 @@ public StringSplitter(String input) { } public String[] split() { - if (isContainsCustomDelimiter()){ + if (isContainsCustomDelimiter()) { return splitCustomDelimiter(); } - - if (isContainsDelimiter()){ + if (isContainsDelimiter()) { return splitDelimiter(); } return new String[]{input}; - } public boolean isContainsCustomDelimiter(){ diff --git a/src/main/java/calculator/ValidationUtils.java b/src/main/java/calculator/utils/ValidationUtils.java similarity index 61% rename from src/main/java/calculator/ValidationUtils.java rename to src/main/java/calculator/utils/ValidationUtils.java index ff78780..fd232ff 100644 --- a/src/main/java/calculator/ValidationUtils.java +++ b/src/main/java/calculator/utils/ValidationUtils.java @@ -1,28 +1,31 @@ -package calculator; +package calculator.utils; import calculator.message.ErrorMessages; public class ValidationUtils { + private static final int NEGATIVE_LIMIT = 0; + private static final int SINGLE_NUMBER_LENGTH = 1; public static boolean isEmptyOrNull(String input) { return input == null || input.isEmpty(); } public static int stringToInt(String input) { - int value = 0; - try { - value = Integer.parseInt(input); + return Integer.parseInt(input); } catch (RuntimeException ex){ throw new RuntimeException(ErrorMessages.INVALID_INPUT); } - - return value; } public static void isPositiveNumber(int number){ - if (number < 0){ + if (number < NEGATIVE_LIMIT){ throw new RuntimeException(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); } } + + public static boolean isSingleNumber(String[] numbers){ + return numbers.length == SINGLE_NUMBER_LENGTH; + } + } diff --git a/src/test/java/calculator/AddCalculatorTest.java b/src/test/java/calculator/AddCalculatorTest.java index d05eb2a..8b45102 100644 --- a/src/test/java/calculator/AddCalculatorTest.java +++ b/src/test/java/calculator/AddCalculatorTest.java @@ -5,18 +5,19 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.in; import static org.junit.jupiter.api.Assertions.assertThrows; public class AddCalculatorTest { @Test @DisplayName("덧셈 계산") - void sum(){ + void add(){ // given, when AddCalculator addCalculator = new AddCalculator(new String[]{"1", "2", "3"}); // when - int response = addCalculator.sum(); + int response = addCalculator.add(); // then assertThat(response).isEqualTo(6); @@ -24,12 +25,12 @@ void sum(){ @Test @DisplayName("덧셈 계산 시 숫자 하나 입력한 경우") - void sum_singleNumber(){ + void add_singleNumber(){ // given AddCalculator addCalculator = new AddCalculator(new String[]{"1"}); // when - int response = addCalculator.sum(); + int response = addCalculator.add(); // then assertThat(response).isEqualTo(1); @@ -37,12 +38,12 @@ void sum_singleNumber(){ @Test @DisplayName("덧셈 계산 시 음수가 포함된 경우") - void sum_inputNegativeNumber(){ + void add_inputNegativeNumber(){ // given AddCalculator addCalculator = new AddCalculator(new String[]{"1", "-2", "3"}); // when - RuntimeException fail = assertThrows(RuntimeException.class, addCalculator::sum); + RuntimeException fail = assertThrows(RuntimeException.class, addCalculator::add); // then assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); @@ -50,15 +51,54 @@ void sum_inputNegativeNumber(){ @Test @DisplayName("덧셈 계산 시 숫자 이외의 값이 입력된 경우") - void sum_inputInvalidDelimiter(){ + void add_inputInvalidDelimiter(){ // given AddCalculator addCalculator = new AddCalculator(new String[]{"1", "문", "3"}); // when - RuntimeException fail = assertThrows(RuntimeException.class, addCalculator::sum); + RuntimeException fail = assertThrows(RuntimeException.class, addCalculator::add); // then assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); } + @Test + @DisplayName("문자열 검증 및 숫자로 변환") + void validateAndConvert(){ + // given + AddCalculator addCalculator = new AddCalculator(new String[]{}); + + // when + int response = addCalculator.validateAndConvert("122222"); + + // then + assertThat(response).isEqualTo(122222); + } + + @Test + @DisplayName("문자열 검증 및 숫자로 변환 시 숫자 이외의 문자열 포함되어 예외 발생") + void validateAndConvert_inputNotNumber(){ + // given + AddCalculator addCalculator = new AddCalculator(new String[]{}); + + // when + RuntimeException fail = assertThrows(RuntimeException.class, () -> addCalculator.validateAndConvert("1&2")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_INPUT); + } + + @Test + @DisplayName("문자열 검증 및 숫자로 변환 시 음수 입력으로 예외 발생") + void validateAndConvert_inputNegativeNumber(){ + // given + AddCalculator addCalculator = new AddCalculator(new String[]{}); + + // when + RuntimeException fail = assertThrows(RuntimeException.class, () -> addCalculator.validateAndConvert("-20")); + + // then + assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); + } + } diff --git a/src/test/java/calculator/StringAddCalculatorTest.java b/src/test/java/calculator/StringAddCalculatorTest.java index 58d8787..a8bef33 100644 --- a/src/test/java/calculator/StringAddCalculatorTest.java +++ b/src/test/java/calculator/StringAddCalculatorTest.java @@ -107,4 +107,5 @@ public void splitAndSum_negative() throws Exception { } + } diff --git a/src/test/java/calculator/ValidationUtilsTest.java b/src/test/java/calculator/utils/ValidationUtilsTest.java similarity index 75% rename from src/test/java/calculator/ValidationUtilsTest.java rename to src/test/java/calculator/utils/ValidationUtilsTest.java index 51a60a5..1c02c2e 100644 --- a/src/test/java/calculator/ValidationUtilsTest.java +++ b/src/test/java/calculator/utils/ValidationUtilsTest.java @@ -1,4 +1,4 @@ -package calculator; +package calculator.utils; import calculator.message.ErrorMessages; import org.junit.jupiter.api.DisplayName; @@ -89,5 +89,36 @@ void stringToIntInputNegativeNumber(){ assertThat(fail.getMessage()).isEqualTo(ErrorMessages.INVALID_NEGATIVE_NUMBER_INPUT); } + @Test + @DisplayName("단일 문자열인지 확인") + void isSingleNumber1(){ + // given, when + boolean response = ValidationUtils.isSingleNumber(new String[]{"12"}); + + // then + assertThat(response).isTrue(); + } + + @Test + @DisplayName("단일 문자열인지 확인") + void isSingleNumber2(){ + // given, when + boolean response = ValidationUtils.isSingleNumber(new String[]{"12"}); + + // then + assertThat(response).isTrue(); + } + + @Test + @DisplayName("단일 문자열이 아닌 경우 false 반환") + void isSingleNumber_false1(){ + // given, when + boolean response = ValidationUtils.isSingleNumber(new String[]{"12", "33", "54"}); + + // then + assertThat(response).isFalse(); + } + + } From 2ad38cb24d4de13f5a4924db0b984af201b3e49a Mon Sep 17 00:00:00 2001 From: Heesoo Date: Sat, 2 Nov 2024 17:34:53 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[refactor]=20add=20=ED=95=A8=EC=88=98=20str?= =?UTF-8?q?eam=20=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/AddCalculator.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/calculator/AddCalculator.java b/src/main/java/calculator/AddCalculator.java index dd8be1c..d061680 100644 --- a/src/main/java/calculator/AddCalculator.java +++ b/src/main/java/calculator/AddCalculator.java @@ -2,6 +2,8 @@ import calculator.utils.ValidationUtils; +import java.util.Arrays; + public class AddCalculator { private final String[] numbers; @@ -10,14 +12,9 @@ public AddCalculator(String[] numbers) { } public int add() { - int result = 0; - - for (String number : numbers) { - int num = validateAndConvert(number); - result += num; - } - - return result; + return Arrays.stream(numbers) + .mapToInt(this::validateAndConvert) + .sum(); } public int validateAndConvert(String number){