From 1efa085c1f8c0b8b1894e0c09a7b177808fb7ec8 Mon Sep 17 00:00:00 2001 From: woomin Date: Tue, 16 Jun 2020 18:21:42 +0900 Subject: [PATCH 1/8] Add Calculator and StringReader with TDD --- .../controller/StringCalculatorApp.java | 7 ++++ .../java/calculator/model/Calculator.java | 20 ++++++++++ .../java/calculator/model/StringReader.java | 11 ++++++ src/main/java/empty.txt | 0 src/test/java/calculator/CalculatorTest.java | 38 +++++++++++++++++++ .../java/calculator/StringReaderTest.java | 24 ++++++++++++ src/test/java/empty.txt | 0 7 files changed, 100 insertions(+) create mode 100644 src/main/java/calculator/controller/StringCalculatorApp.java create mode 100644 src/main/java/calculator/model/Calculator.java create mode 100644 src/main/java/calculator/model/StringReader.java delete mode 100644 src/main/java/empty.txt create mode 100644 src/test/java/calculator/CalculatorTest.java create mode 100644 src/test/java/calculator/StringReaderTest.java delete mode 100644 src/test/java/empty.txt diff --git a/src/main/java/calculator/controller/StringCalculatorApp.java b/src/main/java/calculator/controller/StringCalculatorApp.java new file mode 100644 index 0000000..89e2851 --- /dev/null +++ b/src/main/java/calculator/controller/StringCalculatorApp.java @@ -0,0 +1,7 @@ +package calculator.controller; + +public class StringCalculatorApp { + public static void main(String[] args) { + System.out.println("hello"); + } +} diff --git a/src/main/java/calculator/model/Calculator.java b/src/main/java/calculator/model/Calculator.java new file mode 100644 index 0000000..4970bb8 --- /dev/null +++ b/src/main/java/calculator/model/Calculator.java @@ -0,0 +1,20 @@ +package calculator.model; + +import java.util.Arrays; + +public class Calculator { + private final int result; + + public Calculator(int[] numbers) { + int minusCount = Arrays.stream(numbers).filter(v -> v < 0).toArray().length; + if (minusCount > 0) { + throw new RuntimeException(); + } + + this.result = Arrays.stream(numbers).reduce(Integer::sum).orElse(0); + } + + public int executeAddition() { + return this.result; + } +} diff --git a/src/main/java/calculator/model/StringReader.java b/src/main/java/calculator/model/StringReader.java new file mode 100644 index 0000000..d145eab --- /dev/null +++ b/src/main/java/calculator/model/StringReader.java @@ -0,0 +1,11 @@ +package calculator.model; + +import java.util.Arrays; + +public class StringReader { + + public int[] read(String str) { + String[] arr = str.split("[:,]"); + return Arrays.stream(arr).mapToInt(Integer::parseInt).toArray(); + } +} diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/calculator/CalculatorTest.java b/src/test/java/calculator/CalculatorTest.java new file mode 100644 index 0000000..3817631 --- /dev/null +++ b/src/test/java/calculator/CalculatorTest.java @@ -0,0 +1,38 @@ +package calculator; + +import calculator.model.Calculator; +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 CalculatorTest { + + @Test + @DisplayName("with zero parameter") + public void nullParameter() { + Calculator calculator = new Calculator(new int[] { 0 }); + assertThat(calculator.executeAddition()).isEqualTo(0); + } + + @Test + @DisplayName("with only one number parameter") + public void oneParameter() { + Calculator calculator = new Calculator(new int[] { 3 }); + assertThat(calculator.executeAddition()).isEqualTo(3); + } + + @Test + @DisplayName("with array parameter") + public void arrayParameter() { + Calculator calculator = new Calculator(new int[] { 1, 2, 3, 4 }); + assertThat(calculator.executeAddition()).isEqualTo(10); + } + + @Test + @DisplayName("with minus parameter") + public void minusParameter() { + assertThatThrownBy(() -> new Calculator(new int[] { -5 })).isInstanceOf(RuntimeException.class); + } +} diff --git a/src/test/java/calculator/StringReaderTest.java b/src/test/java/calculator/StringReaderTest.java new file mode 100644 index 0000000..590c4d9 --- /dev/null +++ b/src/test/java/calculator/StringReaderTest.java @@ -0,0 +1,24 @@ +package calculator; + +import calculator.model.StringReader; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class StringReaderTest { + + @Test + @DisplayName("with multiple numbers parameter") + public void multipleNumbers() { + StringReader stringReader = new StringReader(); + assertThat(stringReader.read("1,2,3,4")).isEqualTo(new int[] { 1, 2, 3, 4 }); + } + + @Test + @DisplayName("with only one number parameter") + public void onlyOneNumber() { + StringReader stringReader = new StringReader(); + assertThat(stringReader.read("5")).isEqualTo(new int[] { 5 }); + } +} diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29..0000000 From 8bfa08fcede86bfd4c8195e23bd9392bc51101b4 Mon Sep 17 00:00:00 2001 From: woomin Date: Tue, 16 Jun 2020 18:24:17 +0900 Subject: [PATCH 2/8] Add view and make getUserInput() --- .../calculator/controller/StringCalculatorApp.java | 2 +- src/main/java/calculator/view/Input.java | 11 +++++++++++ src/main/java/calculator/view/Result.java | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/main/java/calculator/view/Input.java create mode 100644 src/main/java/calculator/view/Result.java diff --git a/src/main/java/calculator/controller/StringCalculatorApp.java b/src/main/java/calculator/controller/StringCalculatorApp.java index 89e2851..8cf2afc 100644 --- a/src/main/java/calculator/controller/StringCalculatorApp.java +++ b/src/main/java/calculator/controller/StringCalculatorApp.java @@ -2,6 +2,6 @@ public class StringCalculatorApp { public static void main(String[] args) { - System.out.println("hello"); + } } diff --git a/src/main/java/calculator/view/Input.java b/src/main/java/calculator/view/Input.java new file mode 100644 index 0000000..90622e3 --- /dev/null +++ b/src/main/java/calculator/view/Input.java @@ -0,0 +1,11 @@ +package calculator.view; + +import java.util.Scanner; + +public class Input { + + public static String getUserInput() { + Scanner scanner = new Scanner(System.in); + return scanner.nextLine(); + } +} diff --git a/src/main/java/calculator/view/Result.java b/src/main/java/calculator/view/Result.java new file mode 100644 index 0000000..aa35fd5 --- /dev/null +++ b/src/main/java/calculator/view/Result.java @@ -0,0 +1,4 @@ +package calculator.view; + +public class Result { +} From a28e91933d54040daf00ef07431d879f31a9efda Mon Sep 17 00:00:00 2001 From: woomin Date: Tue, 16 Jun 2020 18:30:37 +0900 Subject: [PATCH 3/8] Make StringCalculationApp.java --- .../calculator/controller/StringCalculatorApp.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/calculator/controller/StringCalculatorApp.java b/src/main/java/calculator/controller/StringCalculatorApp.java index 8cf2afc..60927e2 100644 --- a/src/main/java/calculator/controller/StringCalculatorApp.java +++ b/src/main/java/calculator/controller/StringCalculatorApp.java @@ -1,7 +1,18 @@ package calculator.controller; +import calculator.model.Calculator; +import calculator.model.StringReader; +import calculator.view.Input; + public class StringCalculatorApp { public static void main(String[] args) { + System.out.println("수식을 입력해주세요"); + String userInput = Input.getUserInput(); + + StringReader stringReader = new StringReader(); + int[] arr = stringReader.read(userInput); + Calculator calculator = new Calculator(arr); + System.out.println(calculator.executeAddition()); } } From 0811c66dd186a281af19ed748f76fffe0927cc17 Mon Sep 17 00:00:00 2001 From: woomin Date: Tue, 16 Jun 2020 18:34:39 +0900 Subject: [PATCH 4/8] Seperate view logic from controller --- .../java/calculator/controller/StringCalculatorApp.java | 5 +++-- src/main/java/calculator/view/Result.java | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/calculator/controller/StringCalculatorApp.java b/src/main/java/calculator/controller/StringCalculatorApp.java index 60927e2..7eb3637 100644 --- a/src/main/java/calculator/controller/StringCalculatorApp.java +++ b/src/main/java/calculator/controller/StringCalculatorApp.java @@ -3,16 +3,17 @@ import calculator.model.Calculator; import calculator.model.StringReader; import calculator.view.Input; +import calculator.view.Result; public class StringCalculatorApp { public static void main(String[] args) { - System.out.println("수식을 입력해주세요"); + Result.showStartMessage(); String userInput = Input.getUserInput(); StringReader stringReader = new StringReader(); int[] arr = stringReader.read(userInput); Calculator calculator = new Calculator(arr); - System.out.println(calculator.executeAddition()); + Result.showResult(calculator.executeAddition()); } } diff --git a/src/main/java/calculator/view/Result.java b/src/main/java/calculator/view/Result.java index aa35fd5..5c9a8dd 100644 --- a/src/main/java/calculator/view/Result.java +++ b/src/main/java/calculator/view/Result.java @@ -1,4 +1,12 @@ package calculator.view; public class Result { + + public static void showStartMessage() { + System.out.println("숫자들을 입력해주세요"); + } + + public static void showResult(int result) { + System.out.printf("합계: %d", result); + } } From 5d9321caa6f5dc4cc1cf932e0e9788c07fdea2c0 Mon Sep 17 00:00:00 2001 From: woomin Date: Tue, 16 Jun 2020 20:02:37 +0900 Subject: [PATCH 5/8] Add custom separator logic --- .../controller/StringCalculatorApp.java | 2 ++ src/main/java/calculator/model/StringReader.java | 15 +++++++++++++-- src/test/java/calculator/StringReaderTest.java | 16 ++++++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/java/calculator/controller/StringCalculatorApp.java b/src/main/java/calculator/controller/StringCalculatorApp.java index 7eb3637..4e60a94 100644 --- a/src/main/java/calculator/controller/StringCalculatorApp.java +++ b/src/main/java/calculator/controller/StringCalculatorApp.java @@ -10,6 +10,8 @@ public static void main(String[] args) { Result.showStartMessage(); String userInput = Input.getUserInput(); + System.out.println(userInput); + StringReader stringReader = new StringReader(); int[] arr = stringReader.read(userInput); diff --git a/src/main/java/calculator/model/StringReader.java b/src/main/java/calculator/model/StringReader.java index d145eab..7ebbe98 100644 --- a/src/main/java/calculator/model/StringReader.java +++ b/src/main/java/calculator/model/StringReader.java @@ -5,7 +5,18 @@ public class StringReader { public int[] read(String str) { - String[] arr = str.split("[:,]"); - return Arrays.stream(arr).mapToInt(Integer::parseInt).toArray(); + String[] arr = str.split("n"); + + if (arr.length == 1) { + String[] numbers = arr[0].split("[:,]"); + + return Arrays.stream(numbers).mapToInt(Integer::parseInt).toArray(); + } + + String customSeparator = Character.toString(arr[0].charAt(2)); + String regex = "[:," + customSeparator + "]"; + String[] numbers = arr[1].split(regex); + + return Arrays.stream(numbers).mapToInt(Integer::parseInt).toArray(); } } diff --git a/src/test/java/calculator/StringReaderTest.java b/src/test/java/calculator/StringReaderTest.java index 590c4d9..5e642fb 100644 --- a/src/test/java/calculator/StringReaderTest.java +++ b/src/test/java/calculator/StringReaderTest.java @@ -1,6 +1,7 @@ package calculator; import calculator.model.StringReader; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -8,17 +9,28 @@ public class StringReaderTest { + StringReader stringReader; + + @BeforeEach + void init() { + stringReader = new StringReader(); + } + @Test @DisplayName("with multiple numbers parameter") public void multipleNumbers() { - StringReader stringReader = new StringReader(); assertThat(stringReader.read("1,2,3,4")).isEqualTo(new int[] { 1, 2, 3, 4 }); } @Test @DisplayName("with only one number parameter") public void onlyOneNumber() { - StringReader stringReader = new StringReader(); assertThat(stringReader.read("5")).isEqualTo(new int[] { 5 }); } + + @Test + @DisplayName("with custom separator") + public void withSeparator() { + assertThat(stringReader.read("//;\\n1:2;3,4")).isEqualTo(new int[] { 1, 2, 3, 4 }); + } } From 145a4c47a6cdb0460977ee0cb749cf6a81d23495 Mon Sep 17 00:00:00 2001 From: woomin Date: Tue, 16 Jun 2020 20:10:39 +0900 Subject: [PATCH 6/8] Do refactoring to StringReader --- .../java/calculator/model/StringReader.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/calculator/model/StringReader.java b/src/main/java/calculator/model/StringReader.java index 7ebbe98..f2d1f98 100644 --- a/src/main/java/calculator/model/StringReader.java +++ b/src/main/java/calculator/model/StringReader.java @@ -7,15 +7,21 @@ public class StringReader { public int[] read(String str) { String[] arr = str.split("n"); - if (arr.length == 1) { - String[] numbers = arr[0].split("[:,]"); + return arr.length == 1 + ? withNoCustomSeparator(arr[0]) + : withCustomSeparator(arr[0], arr[1]); + } + + private int[] withNoCustomSeparator(String str) { + String[] numbers = str.split("[:,]"); - return Arrays.stream(numbers).mapToInt(Integer::parseInt).toArray(); - } + return Arrays.stream(numbers).mapToInt(Integer::parseInt).toArray(); + } - String customSeparator = Character.toString(arr[0].charAt(2)); + private int[] withCustomSeparator(String separatorPart, String numberPart) { + String customSeparator = Character.toString(separatorPart.charAt(2)); String regex = "[:," + customSeparator + "]"; - String[] numbers = arr[1].split(regex); + String[] numbers = numberPart.split(regex); return Arrays.stream(numbers).mapToInt(Integer::parseInt).toArray(); } From e7b9cf7bb3f28762ca2f0fb835a0b163c36f2141 Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 17 Jun 2020 17:56:34 +0900 Subject: [PATCH 7/8] Modify Constructor to FactoryMethod --- src/main/java/calculator/model/Calculator.java | 4 ++++ src/main/java/calculator/model/StringReader.java | 1 - src/test/java/calculator/CalculatorTest.java | 9 ++++----- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/calculator/model/Calculator.java b/src/main/java/calculator/model/Calculator.java index 4970bb8..f7fc0df 100644 --- a/src/main/java/calculator/model/Calculator.java +++ b/src/main/java/calculator/model/Calculator.java @@ -14,6 +14,10 @@ public Calculator(int[] numbers) { this.result = Arrays.stream(numbers).reduce(Integer::sum).orElse(0); } + public static Calculator newCalculator(int[] numbers) { + return new Calculator(numbers); + } + public int executeAddition() { return this.result; } diff --git a/src/main/java/calculator/model/StringReader.java b/src/main/java/calculator/model/StringReader.java index f2d1f98..d0fe7d6 100644 --- a/src/main/java/calculator/model/StringReader.java +++ b/src/main/java/calculator/model/StringReader.java @@ -3,7 +3,6 @@ import java.util.Arrays; public class StringReader { - public int[] read(String str) { String[] arr = str.split("n"); diff --git a/src/test/java/calculator/CalculatorTest.java b/src/test/java/calculator/CalculatorTest.java index 3817631..0584bf1 100644 --- a/src/test/java/calculator/CalculatorTest.java +++ b/src/test/java/calculator/CalculatorTest.java @@ -8,31 +8,30 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; public class CalculatorTest { - @Test @DisplayName("with zero parameter") public void nullParameter() { - Calculator calculator = new Calculator(new int[] { 0 }); + Calculator calculator = Calculator.newCalculator(new int[] { 0 }); assertThat(calculator.executeAddition()).isEqualTo(0); } @Test @DisplayName("with only one number parameter") public void oneParameter() { - Calculator calculator = new Calculator(new int[] { 3 }); + Calculator calculator = Calculator.newCalculator(new int[] { 3 }); assertThat(calculator.executeAddition()).isEqualTo(3); } @Test @DisplayName("with array parameter") public void arrayParameter() { - Calculator calculator = new Calculator(new int[] { 1, 2, 3, 4 }); + Calculator calculator = Calculator.newCalculator(new int[] { 1, 2, 3, 4 }); assertThat(calculator.executeAddition()).isEqualTo(10); } @Test @DisplayName("with minus parameter") public void minusParameter() { - assertThatThrownBy(() -> new Calculator(new int[] { -5 })).isInstanceOf(RuntimeException.class); + assertThatThrownBy(() -> Calculator.newCalculator(new int[] { -5 })).isInstanceOf(RuntimeException.class); } } From 6f42552ae09c706b4633654c9db07b1bfe91ec96 Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 17 Jun 2020 17:58:28 +0900 Subject: [PATCH 8/8] Do refactoring to test code. given-when-then --- src/test/java/calculator/CalculatorTest.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/test/java/calculator/CalculatorTest.java b/src/test/java/calculator/CalculatorTest.java index 0584bf1..d5f3278 100644 --- a/src/test/java/calculator/CalculatorTest.java +++ b/src/test/java/calculator/CalculatorTest.java @@ -12,21 +12,30 @@ public class CalculatorTest { @DisplayName("with zero parameter") public void nullParameter() { Calculator calculator = Calculator.newCalculator(new int[] { 0 }); - assertThat(calculator.executeAddition()).isEqualTo(0); + + int answer = calculator.executeAddition(); + + assertThat(answer).isEqualTo(0); } @Test @DisplayName("with only one number parameter") public void oneParameter() { Calculator calculator = Calculator.newCalculator(new int[] { 3 }); - assertThat(calculator.executeAddition()).isEqualTo(3); + + int answer = calculator.executeAddition(); + + assertThat(answer).isEqualTo(3); } @Test @DisplayName("with array parameter") public void arrayParameter() { Calculator calculator = Calculator.newCalculator(new int[] { 1, 2, 3, 4 }); - assertThat(calculator.executeAddition()).isEqualTo(10); + + int answer = calculator.executeAddition(); + + assertThat(answer).isEqualTo(10); } @Test