From 30862c797c643e733d2e8040e450d24020889ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A4=80=EC=84=9D=28YunJunSeok=29?= Date: Tue, 4 Feb 2025 20:57:38 +0900 Subject: [PATCH 1/8] =?UTF-8?q?1,2=EB=8B=A8=EA=B3=84=20=EB=AF=B8=EC=85=98?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C(=EC=9C=A4=EC=A4=80=EC=84=9D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Calculator.java | 20 +++++++++++ src/test/java/CalculatorTest.java | 56 +++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 src/main/java/Calculator.java create mode 100644 src/test/java/CalculatorTest.java diff --git a/src/main/java/Calculator.java b/src/main/java/Calculator.java new file mode 100644 index 0000000..625a37d --- /dev/null +++ b/src/main/java/Calculator.java @@ -0,0 +1,20 @@ +public class Calculator { + public int add(int a, int b) { + return a + b; + } + + public int subtract(int a, int b) { + return a - b; + } + + public int multiply(int a, int b) { + return a * b; + } + + public int divide(int a, int b) { + if (b == 0) { + throw new ArithmeticException("0으로 나눌 수 없음."); + } + return a / b; + } +} diff --git a/src/test/java/CalculatorTest.java b/src/test/java/CalculatorTest.java new file mode 100644 index 0000000..81885ae --- /dev/null +++ b/src/test/java/CalculatorTest.java @@ -0,0 +1,56 @@ +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +public class CalculatorTest { + private final Calculator calc = new Calculator(); + + @Nested + @DisplayName("더하기_테스트_코드") + class AddTest{ + @Test + @DisplayName("더하기_테스트_case1:1+2") + void add(){ + assertEquals(3, calc.add(1,2),"더하기(+)_테스트_통과!"); + } + } + + @Nested + @DisplayName("빼기_테스트_코드") + class SubtractTest{ + @Test + @DisplayName("빼기_테스트_case1:2-1") + void subtract(){ + assertEquals(1, calc.subtract(2,1),"빼기(-)_테스트_통과!"); + } + } + + @Nested + @DisplayName("곱하기_테스트_코드") + class MultiplyTest{ + @Test + @DisplayName("곱하기_테스트_case1:3*4") + void multiply(){ + assertEquals(12, calc.multiply(3,4),"곱하기(*)_테스트_통과!"); + } + } + + @Nested + @DisplayName("나누기_테스트_코드") + class DivideTest{ + @Test + @DisplayName("나누기_테스트_case1:2/1") + void divide(){ + assertEquals(2, calc.divide(2,1),"나누기(/)_테스트_통과!"); + } + + @Test + @DisplayName("나누기_테스트_case2:0을_이용한_나눗셈") + void divideWithZero(){ + assertThrows(ArithmeticException.class, () -> calc.divide(2,0),"나누기(/)_테스트(0을_이용한_나눗셈)통과!"); + } + } +} From 5ea3434fe8704bc6ddfeb7adf4f61c5a84cee4cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A4=80=EC=84=9D=28YunJunSeok=29?= Date: Tue, 4 Feb 2025 22:04:20 +0900 Subject: [PATCH 2/8] =?UTF-8?q?Fix:=20assertEquals,=20assertThrows?= =?UTF-8?q?=EC=9D=98=20=EC=84=B8=20=EB=B2=88=EC=A7=B8=20=EC=9D=B8=EC=9E=90?= =?UTF-8?q?=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?=EC=8B=9C=20=EC=B6=9C=EB=A0=A5=ED=95=A0=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=EC=9D=B4=EB=82=98,=20=EC=84=B1=EA=B3=B5=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9E=91=EC=84=B1=EB=90=9C=20=EB=AC=B8=EA=B5=AC?= =?UTF-8?q?=EB=A5=BC=20=EC=88=98=EC=A0=95=ED=95=98=EC=98=80=EC=8A=B5?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/CalculatorTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/CalculatorTest.java b/src/test/java/CalculatorTest.java index 81885ae..7fcd71e 100644 --- a/src/test/java/CalculatorTest.java +++ b/src/test/java/CalculatorTest.java @@ -14,7 +14,7 @@ class AddTest{ @Test @DisplayName("더하기_테스트_case1:1+2") void add(){ - assertEquals(3, calc.add(1,2),"더하기(+)_테스트_통과!"); + assertEquals(3, calc.add(1,2),"더하기(+)_테스트_실패."); } } @@ -24,7 +24,7 @@ class SubtractTest{ @Test @DisplayName("빼기_테스트_case1:2-1") void subtract(){ - assertEquals(1, calc.subtract(2,1),"빼기(-)_테스트_통과!"); + assertEquals(1, calc.subtract(2,1),"빼기(-)_테스트_실패."); } } @@ -34,7 +34,7 @@ class MultiplyTest{ @Test @DisplayName("곱하기_테스트_case1:3*4") void multiply(){ - assertEquals(12, calc.multiply(3,4),"곱하기(*)_테스트_통과!"); + assertEquals(12, calc.multiply(3,4),"곱하기(*)_테스트_실패."); } } @@ -44,13 +44,13 @@ class DivideTest{ @Test @DisplayName("나누기_테스트_case1:2/1") void divide(){ - assertEquals(2, calc.divide(2,1),"나누기(/)_테스트_통과!"); + assertEquals(2, calc.divide(2,1),"나누기(/)_테스트_실패."); } @Test @DisplayName("나누기_테스트_case2:0을_이용한_나눗셈") void divideWithZero(){ - assertThrows(ArithmeticException.class, () -> calc.divide(2,0),"나누기(/)_테스트(0을_이용한_나눗셈)통과!"); + assertThrows(ArithmeticException.class, () -> calc.divide(2,0),"나누기(/)_테스트(0을_이용한_나눗셈)실패."); } } } From cbba6ea9c09dd9f3a9bf6201c094ae26996f1a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A4=80=EC=84=9D=28YunJunSeok=29?= Date: Tue, 4 Feb 2025 22:09:10 +0900 Subject: [PATCH 3/8] =?UTF-8?q?Fix:=20=EA=B0=9C=ED=96=89=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=ED=95=98=EC=98=80=EC=8A=B5=EB=8B=88=EB=8B=A4?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/CalculatorTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/CalculatorTest.java b/src/test/java/CalculatorTest.java index 7fcd71e..32cd9d5 100644 --- a/src/test/java/CalculatorTest.java +++ b/src/test/java/CalculatorTest.java @@ -6,11 +6,13 @@ import org.junit.jupiter.api.Test; public class CalculatorTest { + private final Calculator calc = new Calculator(); @Nested @DisplayName("더하기_테스트_코드") class AddTest{ + @Test @DisplayName("더하기_테스트_case1:1+2") void add(){ @@ -21,6 +23,7 @@ void add(){ @Nested @DisplayName("빼기_테스트_코드") class SubtractTest{ + @Test @DisplayName("빼기_테스트_case1:2-1") void subtract(){ @@ -31,6 +34,7 @@ void subtract(){ @Nested @DisplayName("곱하기_테스트_코드") class MultiplyTest{ + @Test @DisplayName("곱하기_테스트_case1:3*4") void multiply(){ @@ -41,6 +45,7 @@ void multiply(){ @Nested @DisplayName("나누기_테스트_코드") class DivideTest{ + @Test @DisplayName("나누기_테스트_case1:2/1") void divide(){ From 0914fac809603662c44363980141de515e3cfc42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A4=80=EC=84=9D=28YunJunSeok=29?= Date: Sun, 9 Feb 2025 14:42:47 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=203,4=EB=8B=A8=EA=B3=84=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=20=EA=B3=84=EC=82=B0=EA=B8=B0=20=EB=B0=8F=20?= =?UTF-8?q?assertJ=EB=A5=BC=20=ED=99=9C=EC=9A=A9=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++ src/main/java/StringCalculator.java | 59 ++++++++++++++++++++++ src/test/java/StringCalculatorTest.java | 67 +++++++++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 src/main/java/StringCalculator.java create mode 100644 src/test/java/StringCalculatorTest.java diff --git a/build.gradle b/build.gradle index 87254a3..2c28650 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,9 @@ repositories { dependencies { testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation('org.junit.jupiter:junit-jupiter') + testImplementation platform('org.assertj:assertj-bom:3.25.1') + testImplementation('org.assertj:assertj-core') + } test { diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java new file mode 100644 index 0000000..4d42a86 --- /dev/null +++ b/src/main/java/StringCalculator.java @@ -0,0 +1,59 @@ +import java.util.regex.Pattern; + + +/** + * 문자열을 숫자로 변환하여 합산하는 계산기임.
+ * 쉼표 또는 콜론을 기본 구분자로 사용함.
+ * //<구분자>\n 해당 위치에 원하는 구분자를 넣으면,
+ * 단일 문자로 커스텀 구분자 지정이 가능함.
+ * //@\n1:2@3,4 같은 형식도 처리 가능
+ * 음수나 숫자가 아닌 값이 포함되면 예외를 발생시킴. + */ +public class StringCalculator { + + public static int add(String input) { + if (input.isEmpty()) { + return 0; + } + + String delimiter = "[,|:]"; // 기본 구분자 정의 + + if (input.startsWith("//")) { // 커스텀 구분자 처리 (여러 글자 지원) + int delimiterEnd = input.indexOf("\n"); + String customDelimiter = input.substring(2, delimiterEnd); + delimiter = "[,|:]|" + Pattern.quote(customDelimiter); + input = input.substring(delimiterEnd + 1); + } + + String[] numbers = input.split(Pattern.compile(delimiter).pattern()); + return sum(numbers); + } + + public static int sum(String[] numbers) { //문자열을 숫자로 변환하여 합을 계산 + int sum = 0; + StringBuilder negativeNumber = new StringBuilder(); // 음수가 포함될 경우 예외메시지 만드는데 사용 + + for (String num : numbers) { + int value; + + try { + value = Integer.parseInt(num); // parseInt 사용하여 문자열을 숫자로 변환 + } catch (NumberFormatException e) { + // 숫자가 아닌 값이 포함되면 런타임 에러 발생 + throw new RuntimeException("Invalid input: 숫자가 아닌 값이 포함되었습니다."); + } + // 음수값이 발견되면 negativeNumber에 추가 + if (value < 0) { + negativeNumber.append(value).append(" "); + } + + sum += value; + } + // 음수값이 있는 경우 예외처리 + if (!negativeNumber.isEmpty()) { + throw new RuntimeException("입력한 값 중 음수 값이 존재합니다.: " + negativeNumber.toString().trim()); + } + + return sum; + } +} diff --git a/src/test/java/StringCalculatorTest.java b/src/test/java/StringCalculatorTest.java new file mode 100644 index 0000000..301ac9a --- /dev/null +++ b/src/test/java/StringCalculatorTest.java @@ -0,0 +1,67 @@ +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class StringCalculatorTest { + + @Test + @DisplayName("입력값이 비어있는 경우 테스트") + void testEmptyStringReturnsZero() { + assertThat(StringCalculator.add("")) + .isEqualTo(0); + } + + @Test + @DisplayName("단일 숫자 출력 기능") + void testSingleNumber() { + assertThat(StringCalculator.add("1")).isEqualTo(1); + assertThat(StringCalculator.add("5")).isEqualTo(5); + } + + @Test + @DisplayName("콤마로 구분한 숫자 합산 기능") + void testTwoNumbersWithComma() { + assertThat(StringCalculator.add("1,2")).isEqualTo(3); + } + + @Test + @DisplayName("콤마와 콜론으로 구분한 숫자 합산 기능") + void testMultipleNumbersWithCommaAndColon() { + assertThat(StringCalculator.add("1,2:3")).isEqualTo(6); + } + + @Test + @DisplayName("커스텀 구분자를 사용한 숫자 합산 기능") + void testCustomDelimiter() { + assertThat(StringCalculator.add("//;\n1;2;3")).isEqualTo(6); + assertThat(StringCalculator.add("//|\n2|3|5")).isEqualTo(10); + assertThat(StringCalculator.add("//|\n2,3|50")).isEqualTo(55); + } + + @Test + @DisplayName("특수문자가 포함된 커스텀 구분자를 사용한 숫자 합산 기능") + void testCustomDelimiterWithSpecialCharacters() { + assertThat(StringCalculator.add("//.\n2.3.5")).isEqualTo(10); + assertThat(StringCalculator.add("//$\n1$2$3")).isEqualTo(6); + } + + @Test + @DisplayName("입력값 중 음수가 존재하는 경우를 식별하는 기능") + void testNegativeNumbersThrowException() { + assertThatThrownBy(() -> StringCalculator.add("1,-2,3")) + .isInstanceOf(RuntimeException.class) + .hasMessageContaining("입력한 값 중 음수 값이 존재합니다."); + } + + @Test + @DisplayName("입력값이 숫자가 아닌 값이 존재하는 경우를 식별하는 기능") + void testNonNumericValuesThrowException() { + assertThatThrownBy(() -> StringCalculator.add("1,a,3")) + .isInstanceOf(RuntimeException.class); + + assertThatThrownBy(() -> StringCalculator.add("//;\n1;B;3")) + .isInstanceOf(RuntimeException.class); + } +} From 11e3ccf228ca98e6eb4fc1c57cd1d4a91a74f72f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A4=80=EC=84=9D=28YunJunSeok=29?= <83647215+junseok0304@users.noreply.github.com> Date: Sun, 9 Feb 2025 15:27:13 +0900 Subject: [PATCH 5/8] Update build.gradle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 불필요한 개행 제거 --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2c28650..dc73cfb 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,6 @@ dependencies { testImplementation('org.junit.jupiter:junit-jupiter') testImplementation platform('org.assertj:assertj-bom:3.25.1') testImplementation('org.assertj:assertj-core') - } test { From a489324e115aa42fa7b9cb35bebade8f028aeb8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A4=80=EC=84=9D=28YunJunSeok=29?= <83647215+junseok0304@users.noreply.github.com> Date: Mon, 10 Feb 2025 17:43:04 +0900 Subject: [PATCH 6/8] Update src/main/java/StringCalculator.java Co-authored-by: Lee Hangil --- src/main/java/StringCalculator.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 4d42a86..f4d70e9 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -25,7 +25,8 @@ public static int add(String input) { input = input.substring(delimiterEnd + 1); } - String[] numbers = input.split(Pattern.compile(delimiter).pattern()); + Pattern pattern = Pattern.compile(delimiter); + String[] numbers = pattern.split(input); return sum(numbers); } From 27d5b9ec599daa61f0620dc9244fd7f284963d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A4=80=EC=84=9D=28YunJunSeok=29?= Date: Mon, 10 Feb 2025 17:58:00 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20=EB=A6=AC=EB=B7=B0=20=EB=B0=9B?= =?UTF-8?q?=EC=9D=80=20=EC=82=AC=ED=95=AD=EC=9D=84=20=EB=B0=98=EC=98=81?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=BD=94=EB=93=9C=EB=A5=BC=20=EC=B5=9C?= =?UTF-8?q?=EC=A0=81=ED=99=94=20=ED=96=88=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/StringCalculator.java | 69 +++++++++++++------------ src/test/java/StringCalculatorTest.java | 44 ++++++++++------ 2 files changed, 65 insertions(+), 48 deletions(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 4d42a86..9e66f56 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -1,59 +1,62 @@ import java.util.regex.Pattern; - -/** - * 문자열을 숫자로 변환하여 합산하는 계산기임.
- * 쉼표 또는 콜론을 기본 구분자로 사용함.
- * //<구분자>\n 해당 위치에 원하는 구분자를 넣으면,
- * 단일 문자로 커스텀 구분자 지정이 가능함.
- * //@\n1:2@3,4 같은 형식도 처리 가능
- * 음수나 숫자가 아닌 값이 포함되면 예외를 발생시킴. - */ public class StringCalculator { + // 기본 구분자 + private static final String DEFAULT_DELIMITER = "[,|:]"; + private static final String CUSTOM_DELIMITER_PREFIX = "//"; + private static final String NEW_LINE = "\n"; + private static final int CUSTOM_DELIMITER_PREFIX_LENGTH = 2; + public static int add(String input) { if (input.isEmpty()) { return 0; } - String delimiter = "[,|:]"; // 기본 구분자 정의 + String delimiter = DEFAULT_DELIMITER; // 기본 구분자 정의 - if (input.startsWith("//")) { // 커스텀 구분자 처리 (여러 글자 지원) - int delimiterEnd = input.indexOf("\n"); - String customDelimiter = input.substring(2, delimiterEnd); - delimiter = "[,|:]|" + Pattern.quote(customDelimiter); + if (input.startsWith(CUSTOM_DELIMITER_PREFIX)) { // 커스텀 구분자 처리 (여러 글자 지원) + int delimiterEnd = input.indexOf(NEW_LINE); + String customDelimiter = input.substring(CUSTOM_DELIMITER_PREFIX_LENGTH, delimiterEnd); + delimiter = DEFAULT_DELIMITER + "|" + Pattern.quote(customDelimiter); input = input.substring(delimiterEnd + 1); } - String[] numbers = input.split(Pattern.compile(delimiter).pattern()); + Pattern pattern = Pattern.compile(delimiter); + String[] numbers = pattern.split(input); return sum(numbers); } - public static int sum(String[] numbers) { //문자열을 숫자로 변환하여 합을 계산 + private static int sum(String[] numbers) { // 문자열을 숫자로 변환하여 합을 계산 int sum = 0; - StringBuilder negativeNumber = new StringBuilder(); // 음수가 포함될 경우 예외메시지 만드는데 사용 + StringBuilder negativeNumbers = new StringBuilder(); // 음수값을 저장 for (String num : numbers) { - int value; - - try { - value = Integer.parseInt(num); // parseInt 사용하여 문자열을 숫자로 변환 - } catch (NumberFormatException e) { - // 숫자가 아닌 값이 포함되면 런타임 에러 발생 - throw new RuntimeException("Invalid input: 숫자가 아닌 값이 포함되었습니다."); - } - // 음수값이 발견되면 negativeNumber에 추가 - if (value < 0) { - negativeNumber.append(value).append(" "); - } - + int value = parseAndValidateNumber(num, negativeNumbers); // 숫자 변환 및 검증 sum += value; } - // 음수값이 있는 경우 예외처리 - if (!negativeNumber.isEmpty()) { - throw new RuntimeException("입력한 값 중 음수 값이 존재합니다.: " + negativeNumber.toString().trim()); + + // 음수값이 존재하면 예외 발생 + if (!negativeNumbers.isEmpty()) { + throw new RuntimeException("입력한 값 중 음수 값이 존재합니다: " + negativeNumbers.toString().trim()); } return sum; } + + private static int parseAndValidateNumber(String num, StringBuilder negativeNumbers) { + int value; + + try { + value = Integer.parseInt(num); + } catch (NumberFormatException e) { + throw new RuntimeException("Invalid input: 숫자가 아닌 값이 포함되었습니다."); + } + + if (value < 0) { + negativeNumbers.append(value).append(" "); + } + + return value; + } } diff --git a/src/test/java/StringCalculatorTest.java b/src/test/java/StringCalculatorTest.java index 301ac9a..d825d71 100644 --- a/src/test/java/StringCalculatorTest.java +++ b/src/test/java/StringCalculatorTest.java @@ -1,5 +1,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -13,11 +15,15 @@ void testEmptyStringReturnsZero() { .isEqualTo(0); } - @Test - @DisplayName("단일 숫자 출력 기능") - void testSingleNumber() { - assertThat(StringCalculator.add("1")).isEqualTo(1); - assertThat(StringCalculator.add("5")).isEqualTo(5); + @ParameterizedTest + @DisplayName("단일 숫자 입력 테스트") + @CsvSource({ + "1, 1", + "5, 5", + "10, 10" + }) + void testSingleNumber(String input, int expected) { + assertThat(StringCalculator.add(input)).isEqualTo(expected); } @Test @@ -40,28 +46,36 @@ void testCustomDelimiter() { assertThat(StringCalculator.add("//|\n2,3|50")).isEqualTo(55); } - @Test + @ParameterizedTest @DisplayName("특수문자가 포함된 커스텀 구분자를 사용한 숫자 합산 기능") - void testCustomDelimiterWithSpecialCharacters() { - assertThat(StringCalculator.add("//.\n2.3.5")).isEqualTo(10); - assertThat(StringCalculator.add("//$\n1$2$3")).isEqualTo(6); + @CsvSource({ + "'//.\n2.3.5', 10", + "'//$\n1$2$3', 6" + }) + void testCustomDelimiterWithSpecialCharacters(String input, int expected) { + assertThat(StringCalculator.add(input)).isEqualTo(expected); } @Test - @DisplayName("입력값 중 음수가 존재하는 경우를 식별하는 기능") + @DisplayName("입력값 중 음수가 존재하는 경우 예외 발생") void testNegativeNumbersThrowException() { - assertThatThrownBy(() -> StringCalculator.add("1,-2,3")) + String input = "1,-2,3"; + String expectedMessage = "입력한 값 중 음수 값이 존재합니다: -2"; + + assertThatThrownBy(() -> StringCalculator.add(input)) .isInstanceOf(RuntimeException.class) - .hasMessageContaining("입력한 값 중 음수 값이 존재합니다."); + .hasMessage(expectedMessage); // 예외 메시지가 정확히 일치하는지 검증 } @Test - @DisplayName("입력값이 숫자가 아닌 값이 존재하는 경우를 식별하는 기능") + @DisplayName("입력값이 숫자가 아닌 값이 존재하는 경우 예외 발생") void testNonNumericValuesThrowException() { assertThatThrownBy(() -> StringCalculator.add("1,a,3")) - .isInstanceOf(RuntimeException.class); + .isInstanceOf(RuntimeException.class) + .hasMessage("Invalid input: 숫자가 아닌 값이 포함되었습니다."); assertThatThrownBy(() -> StringCalculator.add("//;\n1;B;3")) - .isInstanceOf(RuntimeException.class); + .isInstanceOf(RuntimeException.class) + .hasMessage("Invalid input: 숫자가 아닌 값이 포함되었습니다."); } } From cf683c9cd37953d9ae4361af6f91ec7b8682ef12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A4=80=EC=84=9D=28YunJunSeok=29?= Date: Tue, 11 Feb 2025 21:56:24 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20=EB=A6=AC=EB=B7=B0=20=EB=B0=9B?= =?UTF-8?q?=EC=9D=80=20=EC=82=AC=ED=95=AD=EC=9D=84=20=EB=B0=98=EC=98=81?= =?UTF-8?q?=ED=95=98=EC=98=80=EC=8A=B5=EB=8B=88=EB=8B=A4.=20(=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=ED=95=9C=20=EA=B0=92=20=EC=A4=91=20=EC=9D=8C=EC=88=98?= =?UTF-8?q?=20=EA=B0=92=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=EC=8B=9C=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=EB=AC=B8=EC=97=90=EC=84=9C=20=EB=B0=94=EB=A1=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC),=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=EC=97=90=EC=84=9C=20=20@Paramete?= =?UTF-8?q?rizedTest=20=ED=99=9C=EC=9A=A9=20=EA=B0=80=EB=8A=A5=ED=95=9C=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EC=B6=94=EA=B0=80=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/StringCalculator.java | 14 ++++---------- src/test/java/StringCalculatorTest.java | 16 +++++++++------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/main/java/StringCalculator.java b/src/main/java/StringCalculator.java index 9e66f56..f467945 100644 --- a/src/main/java/StringCalculator.java +++ b/src/main/java/StringCalculator.java @@ -29,32 +29,26 @@ public static int add(String input) { private static int sum(String[] numbers) { // 문자열을 숫자로 변환하여 합을 계산 int sum = 0; - StringBuilder negativeNumbers = new StringBuilder(); // 음수값을 저장 for (String num : numbers) { - int value = parseAndValidateNumber(num, negativeNumbers); // 숫자 변환 및 검증 + int value = parseAndValidateNumber(num); // 숫자 변환 및 검증 sum += value; } - // 음수값이 존재하면 예외 발생 - if (!negativeNumbers.isEmpty()) { - throw new RuntimeException("입력한 값 중 음수 값이 존재합니다: " + negativeNumbers.toString().trim()); - } - return sum; } - private static int parseAndValidateNumber(String num, StringBuilder negativeNumbers) { + private static int parseAndValidateNumber(String num) { int value; try { - value = Integer.parseInt(num); + value = Integer.parseInt(num.trim()); } catch (NumberFormatException e) { throw new RuntimeException("Invalid input: 숫자가 아닌 값이 포함되었습니다."); } if (value < 0) { - negativeNumbers.append(value).append(" "); + throw new RuntimeException("입력한 값 중 음수 값이 존재합니다: " + value); } return value; diff --git a/src/test/java/StringCalculatorTest.java b/src/test/java/StringCalculatorTest.java index d825d71..4af3f88 100644 --- a/src/test/java/StringCalculatorTest.java +++ b/src/test/java/StringCalculatorTest.java @@ -67,14 +67,16 @@ void testNegativeNumbersThrowException() { .hasMessage(expectedMessage); // 예외 메시지가 정확히 일치하는지 검증 } - @Test + @ParameterizedTest @DisplayName("입력값이 숫자가 아닌 값이 존재하는 경우 예외 발생") - void testNonNumericValuesThrowException() { - assertThatThrownBy(() -> StringCalculator.add("1,a,3")) - .isInstanceOf(RuntimeException.class) - .hasMessage("Invalid input: 숫자가 아닌 값이 포함되었습니다."); - - assertThatThrownBy(() -> StringCalculator.add("//;\n1;B;3")) + @CsvSource({ + "'1,a,3'", // 숫자가 아닌 값 'a' 포함 + "'//;\n1;B;3'", // 숫자가 아닌 값 'B' 포함 + "'2,X,5'", // 숫자가 아닌 값 'X' 포함 + "'//|\n2|@|5'", // 특수문자 '@' 포함 + }) + void testNonNumericValuesThrowException(String input) { + assertThatThrownBy(() -> StringCalculator.add(input)) .isInstanceOf(RuntimeException.class) .hasMessage("Invalid input: 숫자가 아닌 값이 포함되었습니다."); }