From 1efa085c1f8c0b8b1894e0c09a7b177808fb7ec8 Mon Sep 17 00:00:00 2001 From: woomin Date: Tue, 16 Jun 2020 18:21:42 +0900 Subject: [PATCH 01/44] 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 02/44] 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 03/44] 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 04/44] 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 05/44] 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 06/44] 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 07/44] 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 08/44] 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 From 02db90cdd0aad5c343689581739c0397e00f372e Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 13:23:43 +0900 Subject: [PATCH 09/44] Add getLottoNumbers() in LottoTicket by TDD --- src/main/java/lotto/domain/LottoTicket.java | 20 ++++++++++++++++++++ src/test/java/lotto/LottoTicketTest.java | 19 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/main/java/lotto/domain/LottoTicket.java create mode 100644 src/test/java/lotto/LottoTicketTest.java diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java new file mode 100644 index 0000000..3216437 --- /dev/null +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -0,0 +1,20 @@ +package lotto.domain; + +import java.util.List; + +public class LottoTicket { + + private final List lottoNumbers; + + public LottoTicket(List numbers) { + this.lottoNumbers = numbers; + } + + public static LottoTicket newLotto(List numbers) { + return new LottoTicket(numbers); + } + + public List getLottoNumbers() { + return this.lottoNumbers; + } +} diff --git a/src/test/java/lotto/LottoTicketTest.java b/src/test/java/lotto/LottoTicketTest.java new file mode 100644 index 0000000..f65648f --- /dev/null +++ b/src/test/java/lotto/LottoTicketTest.java @@ -0,0 +1,19 @@ +package lotto; + +import lotto.domain.LottoTicket; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoTicketTest { + @Test + void getLottoNumbers() { + List numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6)); + LottoTicket lottoTicket = LottoTicket.newLotto(numbers); + + assertThat(lottoTicket.getLottoNumbers()).isEqualTo(numbers); + } +} From 0f4a39af2a748b9b17698821b324124a561fd4e5 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 13:39:52 +0900 Subject: [PATCH 10/44] Add makeLottoTicket() in LottoMachine by TDD --- src/main/java/lotto/domain/LottoMachine.java | 26 ++++++++++++++++++++ src/test/java/lotto/LottoMachineTest.java | 23 +++++++++++++++++ src/test/java/lotto/LottoTicketTest.java | 1 + 3 files changed, 50 insertions(+) create mode 100644 src/main/java/lotto/domain/LottoMachine.java create mode 100644 src/test/java/lotto/LottoMachineTest.java diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java new file mode 100644 index 0000000..6780532 --- /dev/null +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -0,0 +1,26 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.List; + +public class LottoMachine { + + private final List lottoTickets; + + public LottoMachine() { + lottoTickets = new ArrayList<>(); + } + + public static LottoMachine newMachine() { + return new LottoMachine(); + } + + public List getLottoTickets() { + return this.lottoTickets; + } + + public void makeLottoTicket(List numbers) { + LottoTicket newTicket = LottoTicket.newLotto(numbers); + lottoTickets.add(newTicket); + } +} diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java new file mode 100644 index 0000000..128739b --- /dev/null +++ b/src/test/java/lotto/LottoMachineTest.java @@ -0,0 +1,23 @@ +package lotto; + +import lotto.domain.LottoMachine; +import lotto.domain.LottoTicket; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoMachineTest { + @Test + void makeLottoTicket() { + LottoMachine lottoMachine = LottoMachine.newMachine(); + List numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6)); + lottoMachine.makeLottoTicket(numbers); + + LottoTicket firstTicket = lottoMachine.getLottoTickets().get(0); + + assertThat(firstTicket.getLottoNumbers()).isEqualTo(numbers); + } +} diff --git a/src/test/java/lotto/LottoTicketTest.java b/src/test/java/lotto/LottoTicketTest.java index f65648f..90b1d14 100644 --- a/src/test/java/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/LottoTicketTest.java @@ -12,6 +12,7 @@ public class LottoTicketTest { @Test void getLottoNumbers() { List numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6)); + LottoTicket lottoTicket = LottoTicket.newLotto(numbers); assertThat(lottoTicket.getLottoNumbers()).isEqualTo(numbers); From 5394c14c6db7f1e0599cdf7718055d9f4b7b1eb5 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 13:44:00 +0900 Subject: [PATCH 11/44] Add test case to makeLottoTicket() --- src/test/java/lotto/LottoMachineTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index 128739b..2c7148e 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -13,11 +13,15 @@ public class LottoMachineTest { @Test void makeLottoTicket() { LottoMachine lottoMachine = LottoMachine.newMachine(); - List numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6)); - lottoMachine.makeLottoTicket(numbers); + List numbers1 = new ArrayList<>(List.of(1, 3, 5, 7, 9, 11)); + List numbers2 = new ArrayList<>(List.of(2, 4, 6, 8, 10, 12)); + lottoMachine.makeLottoTicket(numbers1); + lottoMachine.makeLottoTicket(numbers2); LottoTicket firstTicket = lottoMachine.getLottoTickets().get(0); + assertThat(firstTicket.getLottoNumbers()).isEqualTo(numbers1); - assertThat(firstTicket.getLottoNumbers()).isEqualTo(numbers); + LottoTicket secondTicket = lottoMachine.getLottoTickets().get(1); + assertThat(secondTicket.getLottoNumbers()).isEqualTo(numbers2); } } From ce252d018ab1d1b2042dccc7ec678a09087b2c2d Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 13:52:53 +0900 Subject: [PATCH 12/44] Add makeTicketsWithMoney() in LottoMachin by TDD --- src/main/java/lotto/domain/LottoMachine.java | 8 +++++++- src/test/java/lotto/LottoMachineTest.java | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 6780532..964907b 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -21,6 +21,12 @@ public List getLottoTickets() { public void makeLottoTicket(List numbers) { LottoTicket newTicket = LottoTicket.newLotto(numbers); - lottoTickets.add(newTicket); + this.lottoTickets.add(newTicket); + } + + public void makeTicketsWithMoney(int money) { + for (int i = 0; i < money / 1000; i += 1) { + this.makeLottoTicket(List.of(1, 2, 3, 4, 5, 6)); + } } } diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index 2c7148e..389f6c0 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -24,4 +24,13 @@ void makeLottoTicket() { LottoTicket secondTicket = lottoMachine.getLottoTickets().get(1); assertThat(secondTicket.getLottoNumbers()).isEqualTo(numbers2); } + + @Test + void makeLottoTicketsWithMoney() { + int money = 14_000; + LottoMachine lottoMachine = LottoMachine.newMachine(); + lottoMachine.makeTicketsWithMoney(money); + + assertThat(lottoMachine.getLottoTickets()).hasSize(14); + } } From 4351be97b9624a80e6d7be777e4fd260f4cf5317 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 13:53:40 +0900 Subject: [PATCH 13/44] Change the method name short --- src/main/java/lotto/domain/LottoMachine.java | 6 +++--- src/test/java/lotto/LottoMachineTest.java | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 964907b..5ab0b2f 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -15,18 +15,18 @@ public static LottoMachine newMachine() { return new LottoMachine(); } - public List getLottoTickets() { + public List getTickets() { return this.lottoTickets; } - public void makeLottoTicket(List numbers) { + public void makeTicket(List numbers) { LottoTicket newTicket = LottoTicket.newLotto(numbers); this.lottoTickets.add(newTicket); } public void makeTicketsWithMoney(int money) { for (int i = 0; i < money / 1000; i += 1) { - this.makeLottoTicket(List.of(1, 2, 3, 4, 5, 6)); + this.makeTicket(List.of(1, 2, 3, 4, 5, 6)); } } } diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index 389f6c0..3058b09 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -15,13 +15,13 @@ void makeLottoTicket() { LottoMachine lottoMachine = LottoMachine.newMachine(); List numbers1 = new ArrayList<>(List.of(1, 3, 5, 7, 9, 11)); List numbers2 = new ArrayList<>(List.of(2, 4, 6, 8, 10, 12)); - lottoMachine.makeLottoTicket(numbers1); - lottoMachine.makeLottoTicket(numbers2); + lottoMachine.makeTicket(numbers1); + lottoMachine.makeTicket(numbers2); - LottoTicket firstTicket = lottoMachine.getLottoTickets().get(0); + LottoTicket firstTicket = lottoMachine.getTickets().get(0); assertThat(firstTicket.getLottoNumbers()).isEqualTo(numbers1); - LottoTicket secondTicket = lottoMachine.getLottoTickets().get(1); + LottoTicket secondTicket = lottoMachine.getTickets().get(1); assertThat(secondTicket.getLottoNumbers()).isEqualTo(numbers2); } @@ -31,6 +31,6 @@ void makeLottoTicketsWithMoney() { LottoMachine lottoMachine = LottoMachine.newMachine(); lottoMachine.makeTicketsWithMoney(money); - assertThat(lottoMachine.getLottoTickets()).hasSize(14); + assertThat(lottoMachine.getTickets()).hasSize(14); } } From ec3449f83cb3f25ae1ce5a28ded9e03fc6d8a68c Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 14:19:39 +0900 Subject: [PATCH 14/44] Add getNumbers() in RandomGenerator by TDD --- src/main/java/lotto/domain/LottoTicket.java | 2 +- .../java/lotto/domain/RandomGenerator.java | 29 +++++++++++++++++++ src/test/java/lotto/RandomGeneratorTest.java | 19 ++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/domain/RandomGenerator.java create mode 100644 src/test/java/lotto/RandomGeneratorTest.java diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java index 3216437..65f598f 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -17,4 +17,4 @@ public static LottoTicket newLotto(List numbers) { public List getLottoNumbers() { return this.lottoNumbers; } -} +} \ No newline at end of file diff --git a/src/main/java/lotto/domain/RandomGenerator.java b/src/main/java/lotto/domain/RandomGenerator.java new file mode 100644 index 0000000..a70da35 --- /dev/null +++ b/src/main/java/lotto/domain/RandomGenerator.java @@ -0,0 +1,29 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class RandomGenerator { + + private final List numbers; + + public RandomGenerator() { + this.numbers = new ArrayList<>(); + for (int i = 1; i <= 45; i += 1) { + numbers.add(i); + } + } + + public static RandomGenerator newGenerator() { + return new RandomGenerator(); + } + + public List getNumbers() { + Collections.shuffle(numbers); + List sixNumbers = numbers.subList(0, 6); + Collections.sort(sixNumbers); + + return sixNumbers; + } +} diff --git a/src/test/java/lotto/RandomGeneratorTest.java b/src/test/java/lotto/RandomGeneratorTest.java new file mode 100644 index 0000000..c62805a --- /dev/null +++ b/src/test/java/lotto/RandomGeneratorTest.java @@ -0,0 +1,19 @@ +package lotto; + +import lotto.domain.RandomGenerator; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class RandomGeneratorTest { + @Test + void getNumbers() { + RandomGenerator randomGenerator = RandomGenerator.newGenerator(); + + List numbers = randomGenerator.getNumbers(); + + assertThat(numbers).hasSize(6); + } +} From 8ac2e1e552cda1960d69f9b62c9a57fd4fcd1efd Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 14:20:59 +0900 Subject: [PATCH 15/44] Fix makeTicketsWithMoney() => inject randomNumbers --- src/main/java/lotto/domain/LottoMachine.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 5ab0b2f..671f071 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -26,7 +26,8 @@ public void makeTicket(List numbers) { public void makeTicketsWithMoney(int money) { for (int i = 0; i < money / 1000; i += 1) { - this.makeTicket(List.of(1, 2, 3, 4, 5, 6)); + List randomNumbers = RandomGenerator.newGenerator().getNumbers(); + this.makeTicket(randomNumbers); } } } From a52d76445fc3c77879f7603327bad8f74c05bac2 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 14:30:06 +0900 Subject: [PATCH 16/44] Add getUserInputMoney() in Input --- .../java/lotto/controller/LottoApplication.java | 10 ++++++++++ src/main/java/lotto/view/Input.java | 15 +++++++++++++++ src/main/java/lotto/view/Output.java | 4 ++++ 3 files changed, 29 insertions(+) create mode 100644 src/main/java/lotto/controller/LottoApplication.java create mode 100644 src/main/java/lotto/view/Input.java create mode 100644 src/main/java/lotto/view/Output.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java new file mode 100644 index 0000000..ae57681 --- /dev/null +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -0,0 +1,10 @@ +package lotto.controller; + +import lotto.view.Input; + +public class LottoApplication { + public static void main(String[] args) { + int money = Input.getUserInputMoney(); + + } +} diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java new file mode 100644 index 0000000..b2e037a --- /dev/null +++ b/src/main/java/lotto/view/Input.java @@ -0,0 +1,15 @@ +package lotto.view; + +import java.util.Scanner; + +public class Input { + public static int getUserInputMoney() { + System.out.println("로또 구입 금액을 입력해주세요"); + Scanner scanner = new Scanner(System.in); + + int money = scanner.nextInt(); + System.out.printf("%d개를 구매하셨습니다.", money / 1000); + + return money; + } +} diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java new file mode 100644 index 0000000..df86694 --- /dev/null +++ b/src/main/java/lotto/view/Output.java @@ -0,0 +1,4 @@ +package lotto.view; + +public class Output { +} From 58d6ae1365d04931894e9316c7181b9cf39b5fe0 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 14:36:24 +0900 Subject: [PATCH 17/44] Add showLottoTickets() in Output --- src/main/java/lotto/controller/LottoApplication.java | 6 ++++++ src/main/java/lotto/view/Input.java | 2 +- src/main/java/lotto/view/Output.java | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index ae57681..c779fa4 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -1,10 +1,16 @@ package lotto.controller; +import lotto.domain.LottoMachine; import lotto.view.Input; +import lotto.view.Output; public class LottoApplication { public static void main(String[] args) { int money = Input.getUserInputMoney(); + LottoMachine lottoMachine = LottoMachine.newMachine(); + lottoMachine.makeTicketsWithMoney(money); + + Output.showLottoTickets(lottoMachine.getTickets()); } } diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java index b2e037a..ee51d59 100644 --- a/src/main/java/lotto/view/Input.java +++ b/src/main/java/lotto/view/Input.java @@ -8,7 +8,7 @@ public static int getUserInputMoney() { Scanner scanner = new Scanner(System.in); int money = scanner.nextInt(); - System.out.printf("%d개를 구매하셨습니다.", money / 1000); + System.out.printf("%d개를 구매하셨습니다.\n", money / 1000); return money; } diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index df86694..3d12b58 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -1,4 +1,12 @@ package lotto.view; +import lotto.domain.LottoTicket; + +import java.util.List; + public class Output { + public static void showLottoTickets(List tickets) { + System.out.println(""); + tickets.forEach(ticket -> System.out.println(ticket.getLottoNumbers())); + } } From 8e0bae198aed8baa1a0a970975cebfc08b597db2 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 14:38:15 +0900 Subject: [PATCH 18/44] Add getWinningNumbers() in Input --- src/main/java/lotto/controller/LottoApplication.java | 3 +++ src/main/java/lotto/view/Input.java | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index c779fa4..b71c3c9 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -12,5 +12,8 @@ public static void main(String[] args) { lottoMachine.makeTicketsWithMoney(money); Output.showLottoTickets(lottoMachine.getTickets()); + + String winning = Input.getWinningNumbers(); + } } diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java index ee51d59..3194430 100644 --- a/src/main/java/lotto/view/Input.java +++ b/src/main/java/lotto/view/Input.java @@ -4,7 +4,7 @@ public class Input { public static int getUserInputMoney() { - System.out.println("로또 구입 금액을 입력해주세요"); + System.out.println("로또 구입 금액을 입력해주세요."); Scanner scanner = new Scanner(System.in); int money = scanner.nextInt(); @@ -12,4 +12,11 @@ public static int getUserInputMoney() { return money; } + + public static String getWinningNumbers() { + System.out.println("당첨 번호를 입력해주세요."); + Scanner scanner = new Scanner(System.in); + + return scanner.nextLine(); + } } From d1a06e9277e4db15bad902d2bf48c5e3d0f37ce8 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 14:57:48 +0900 Subject: [PATCH 19/44] Add converToLottoNumber() in LottoChecker by TDD --- src/main/java/lotto/domain/LottoChecker.java | 19 +++++++++++++++++++ src/test/java/lotto/LottoCheckerTest.java | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/main/java/lotto/domain/LottoChecker.java create mode 100644 src/test/java/lotto/LottoCheckerTest.java diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java new file mode 100644 index 0000000..cab7e8e --- /dev/null +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -0,0 +1,19 @@ +package lotto.domain; + +import java.util.Arrays; +import java.util.List; + +public class LottoChecker { + public static LottoChecker newChecker() { + return new LottoChecker(); + } + + public List convertToLottoNumber(String input) { + return Arrays.asList( + Arrays.stream(input.split(",")) + .mapToInt(Integer::parseInt) + .boxed() + .toArray(Integer[]::new) + ); + } +} diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java new file mode 100644 index 0000000..7215eb0 --- /dev/null +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -0,0 +1,20 @@ +package lotto; + +import lotto.domain.LottoChecker; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LottoCheckerTest { + @Test + void convertToLottoNumber() { + LottoChecker lottoChecker = LottoChecker.newChecker(); + String input = "1,2,3,4,5,6"; + + List lottoNumbers = lottoChecker.convertToLottoNumber(input); + + assertThat(lottoNumbers).containsExactly(1, 2, 3, 4, 5, 6); + } +} From 94c6b1b877abe5e641766f8c2f428805e8fe4660 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 15:01:18 +0900 Subject: [PATCH 20/44] Modify convertToLottoNumbers() to constructor --- src/main/java/lotto/domain/LottoChecker.java | 19 ++++++++++++------- src/test/java/lotto/LottoCheckerTest.java | 8 -------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index cab7e8e..5b8e4cc 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -4,16 +4,21 @@ import java.util.List; public class LottoChecker { - public static LottoChecker newChecker() { - return new LottoChecker(); - } - public List convertToLottoNumber(String input) { - return Arrays.asList( - Arrays.stream(input.split(",")) + private final List winningNumbers; + + public LottoChecker(String winnings) { + this.winningNumbers = + Arrays.asList( + Arrays.stream(winnings.split(",")) .mapToInt(Integer::parseInt) .boxed() .toArray(Integer[]::new) - ); + ); } + + public static LottoChecker newChecker(String winnings) { + return new LottoChecker(winnings); + } + } diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index 7215eb0..05c5d1c 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -8,13 +8,5 @@ import static org.assertj.core.api.Assertions.assertThat; public class LottoCheckerTest { - @Test - void convertToLottoNumber() { - LottoChecker lottoChecker = LottoChecker.newChecker(); - String input = "1,2,3,4,5,6"; - List lottoNumbers = lottoChecker.convertToLottoNumber(input); - - assertThat(lottoNumbers).containsExactly(1, 2, 3, 4, 5, 6); - } } From 6ad8d9bb74e6e71766cb3021266c0eb77efc9bfb Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 15:11:13 +0900 Subject: [PATCH 21/44] Add checkTicket() in LottoChecker by TDD --- src/main/java/lotto/domain/LottoChecker.java | 19 +++++++++++++++++++ src/test/java/lotto/LottoCheckerTest.java | 10 ++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 5b8e4cc..67eb078 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -1,5 +1,6 @@ package lotto.domain; +import java.lang.reflect.WildcardType; import java.util.Arrays; import java.util.List; @@ -21,4 +22,22 @@ public static LottoChecker newChecker(String winnings) { return new LottoChecker(winnings); } + public int checkTicket(LottoTicket ticket) { + List ticketNumbers = ticket.getLottoNumbers(); + + int count = 0; + for (Integer number : winningNumbers) { + count = getCount(ticketNumbers, count, number); + } + + return count; + } + + private int getCount(List ticketNumbers, int count, Integer number) { + if (ticketNumbers.contains(number)) { + count += 1; + } + + return count; + } } diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index 05c5d1c..19cdd07 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -1,6 +1,7 @@ package lotto; import lotto.domain.LottoChecker; +import lotto.domain.LottoTicket; import org.junit.jupiter.api.Test; import java.util.List; @@ -8,5 +9,14 @@ import static org.assertj.core.api.Assertions.assertThat; public class LottoCheckerTest { + @Test + void checkTicket() { + String winningNumbers = "1,2,3,4,5,6"; + LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers); + LottoTicket ticket = LottoTicket.newLotto(List.of(1, 2, 3, 4, 11, 12)); + int count = lottoChecker.checkTicket(ticket); + + assertThat(count).isEqualTo(4); + } } From fc8691e6fc5c8c24fb8b4f482080862576ceb3ba Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 15:24:27 +0900 Subject: [PATCH 22/44] Add checkAllTickets() in LottoChecker by TDD --- src/main/java/lotto/domain/LottoChecker.java | 22 +++++++++++++++ src/test/java/lotto/LottoCheckerTest.java | 28 ++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 67eb078..702c0e2 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -3,12 +3,16 @@ import java.lang.reflect.WildcardType; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.TreeMap; public class LottoChecker { + private final Map checkCounter; private final List winningNumbers; public LottoChecker(String winnings) { + this.checkCounter = new TreeMap<>(); this.winningNumbers = Arrays.asList( Arrays.stream(winnings.split(",")) @@ -40,4 +44,22 @@ private int getCount(List ticketNumbers, int count, Integer number) { return count; } + + public Map checkAllTickets(List tickets) { + for (LottoTicket ticket : tickets) { + addCheckCounter(this.checkTicket(ticket)); + } + + return this.checkCounter; + } + + private void addCheckCounter(int count) { + if (this.checkCounter.containsKey(count)) { + this.checkCounter.put(count, this.checkCounter.get(count) + 1); + + return; + } + + this.checkCounter.put(count, 1); + } } diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index 19cdd07..71c193c 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -1,10 +1,14 @@ package lotto; import lotto.domain.LottoChecker; +import lotto.domain.LottoMachine; import lotto.domain.LottoTicket; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.util.List; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; @@ -19,4 +23,28 @@ void checkTicket() { assertThat(count).isEqualTo(4); } + + @ParameterizedTest + @CsvSource(value = { + "1,0", + "2,1", + "3,1", + "4,0", + "5,0", + "6,0", + }) + void checkAllTickets(Integer key, Integer value) { + LottoMachine lottoMachine = LottoMachine.newMachine(); + lottoMachine.makeTicket(List.of(1, 2, 3, 11, 12, 13)); + lottoMachine.makeTicket(List.of(1, 2, 11, 12, 13, 14)); + lottoMachine.makeTicket(List.of(11, 12, 13, 14, 15, 16)); + + List tickets = lottoMachine.getTickets(); + + String winningNumbers = "1,2,3,4,5,6"; + LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers); + Map checkCounter = lottoChecker.checkAllTickets(tickets); + + assertThat(checkCounter.getOrDefault(key, 0)).isEqualTo(value); + } } From bd9d719a67998adc81f8ab21fe2a71ef5574da73 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 15:33:06 +0900 Subject: [PATCH 23/44] Add result view --- .../java/lotto/controller/LottoApplication.java | 8 +++++++- src/main/java/lotto/view/Output.java | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index b71c3c9..6151623 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -1,9 +1,12 @@ package lotto.controller; +import lotto.domain.LottoChecker; import lotto.domain.LottoMachine; import lotto.view.Input; import lotto.view.Output; +import java.util.Map; + public class LottoApplication { public static void main(String[] args) { int money = Input.getUserInputMoney(); @@ -13,7 +16,10 @@ public static void main(String[] args) { Output.showLottoTickets(lottoMachine.getTickets()); - String winning = Input.getWinningNumbers(); + String winningNumbers = Input.getWinningNumbers(); + LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers); + Map counter = lottoChecker.checkAllTickets(lottoMachine.getTickets()); + Output.showResult(counter, money); } } diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 3d12b58..3fe130b 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -3,10 +3,24 @@ import lotto.domain.LottoTicket; import java.util.List; +import java.util.Map; public class Output { public static void showLottoTickets(List tickets) { System.out.println(""); tickets.forEach(ticket -> System.out.println(ticket.getLottoNumbers())); } + + public static void showResult(Map counter, int money) { + System.out.println(""); + System.out.println("당첨 통계"); + System.out.println("----------------------------"); + System.out.printf("3개 일치 (5,000원) - %d개\n", counter.getOrDefault(3, 0)); + System.out.printf("4개 일치 (50,000원) - %d개\n", counter.getOrDefault(4, 0)); + System.out.printf("5개 일치 (1,500,000원) - %d개\n", counter.getOrDefault(5, 0)); + System.out.printf("모두 일치 (2,000,000,000원) - %d개\n", counter.getOrDefault(6, 0)); + System.out.println(""); + + System.out.printf("총 수익률은 %.2f입니다.", ); + } } From 5f818e211900542866f3c7c599d762a1a3bb7484 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 15:48:33 +0900 Subject: [PATCH 24/44] Add getting totalWinning logic to checkAllTickets --- src/main/java/lotto/domain/LottoChecker.java | 11 +++++++++ src/main/java/lotto/view/Output.java | 3 ++- src/test/java/lotto/LottoCheckerTest.java | 24 +++++++++++++------- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 702c0e2..31df5cc 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -50,6 +50,8 @@ public Map checkAllTickets(List tickets) { addCheckCounter(this.checkTicket(ticket)); } + addTotalWinningMoney(); + return this.checkCounter; } @@ -62,4 +64,13 @@ private void addCheckCounter(int count) { this.checkCounter.put(count, 1); } + + private void addTotalWinningMoney() { + int totalWinningMoney = (5_000 * this.checkCounter.getOrDefault(3, 0)) + + (50_000 * this.checkCounter.getOrDefault(4, 0)) + + (1_500_000 * this.checkCounter.getOrDefault(5, 0)) + + (2_000_000_000 * this.checkCounter.getOrDefault(6, 0)); + + this.checkCounter.put(7, totalWinningMoney); + } } diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 3fe130b..c4fbff6 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -21,6 +21,7 @@ public static void showResult(Map counter, int money) { System.out.printf("모두 일치 (2,000,000,000원) - %d개\n", counter.getOrDefault(6, 0)); System.out.println(""); - System.out.printf("총 수익률은 %.2f입니다.", ); + + System.out.printf("총 수익률은 %.2f입니다."); } } diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index 71c193c..14f9b26 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -3,6 +3,7 @@ import lotto.domain.LottoChecker; import lotto.domain.LottoMachine; import lotto.domain.LottoTicket; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -24,6 +25,20 @@ void checkTicket() { assertThat(count).isEqualTo(4); } + LottoMachine lottoMachine; + LottoChecker lottoChecker; + + @BeforeEach + void init() { + lottoMachine = LottoMachine.newMachine(); + lottoMachine.makeTicket(List.of(1, 2, 3, 11, 12, 13)); + lottoMachine.makeTicket(List.of(1, 2, 11, 12, 13, 14)); + lottoMachine.makeTicket(List.of(11, 12, 13, 14, 15, 16)); + + String winningNumbers = "1,2,3,4,5,6"; + lottoChecker = LottoChecker.newChecker(winningNumbers); + } + @ParameterizedTest @CsvSource(value = { "1,0", @@ -32,17 +47,10 @@ void checkTicket() { "4,0", "5,0", "6,0", + "7,5000" }) void checkAllTickets(Integer key, Integer value) { - LottoMachine lottoMachine = LottoMachine.newMachine(); - lottoMachine.makeTicket(List.of(1, 2, 3, 11, 12, 13)); - lottoMachine.makeTicket(List.of(1, 2, 11, 12, 13, 14)); - lottoMachine.makeTicket(List.of(11, 12, 13, 14, 15, 16)); - List tickets = lottoMachine.getTickets(); - - String winningNumbers = "1,2,3,4,5,6"; - LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers); Map checkCounter = lottoChecker.checkAllTickets(tickets); assertThat(checkCounter.getOrDefault(key, 0)).isEqualTo(value); From 0d0cbf780f0fd050a35ebee375e7e79b2048f505 Mon Sep 17 00:00:00 2001 From: woomin Date: Fri, 19 Jun 2020 15:53:16 +0900 Subject: [PATCH 25/44] End --- src/main/java/lotto/domain/LottoChecker.java | 3 ++- src/main/java/lotto/view/Output.java | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 31df5cc..4700363 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -66,7 +66,8 @@ private void addCheckCounter(int count) { } private void addTotalWinningMoney() { - int totalWinningMoney = (5_000 * this.checkCounter.getOrDefault(3, 0)) + int totalWinningMoney = + (5_000 * this.checkCounter.getOrDefault(3, 0)) + (50_000 * this.checkCounter.getOrDefault(4, 0)) + (1_500_000 * this.checkCounter.getOrDefault(5, 0)) + (2_000_000_000 * this.checkCounter.getOrDefault(6, 0)); diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index c4fbff6..12a1a98 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -21,7 +21,6 @@ public static void showResult(Map counter, int money) { System.out.printf("모두 일치 (2,000,000,000원) - %d개\n", counter.getOrDefault(6, 0)); System.out.println(""); - - System.out.printf("총 수익률은 %.2f입니다."); + System.out.printf("총 수익률은 %.2f입니다.\n\n\n", (double) counter.get(7) / money); } } From a1f483fe1697adf06ba967f6983df5b6edc32759 Mon Sep 17 00:00:00 2001 From: woomin Date: Mon, 22 Jun 2020 13:37:57 +0900 Subject: [PATCH 26/44] remove unused package in LottoChecker Class --- src/main/java/lotto/domain/LottoChecker.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 4700363..2c3ad2f 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -1,6 +1,5 @@ package lotto.domain; -import java.lang.reflect.WildcardType; import java.util.Arrays; import java.util.List; import java.util.Map; From 50cc5709d00310e27ffb3e07b36419db70f87214 Mon Sep 17 00:00:00 2001 From: woomin Date: Mon, 22 Jun 2020 14:38:16 +0900 Subject: [PATCH 27/44] Extract Map<>checkCounter to FirstClassCollection --- .../lotto/controller/LottoApplication.java | 5 +- src/main/java/lotto/domain/CheckCounter.java | 36 ++++++++++++++ src/main/java/lotto/domain/LottoChecker.java | 28 +++-------- src/main/java/lotto/view/Output.java | 13 ++--- src/test/java/lotto/CheckCounterTest.java | 47 +++++++++++++++++++ src/test/java/lotto/LottoCheckerTest.java | 6 +-- 6 files changed, 101 insertions(+), 34 deletions(-) create mode 100644 src/main/java/lotto/domain/CheckCounter.java create mode 100644 src/test/java/lotto/CheckCounterTest.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 6151623..ae928c6 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -1,12 +1,11 @@ package lotto.controller; +import lotto.domain.CheckCounter; import lotto.domain.LottoChecker; import lotto.domain.LottoMachine; import lotto.view.Input; import lotto.view.Output; -import java.util.Map; - public class LottoApplication { public static void main(String[] args) { int money = Input.getUserInputMoney(); @@ -18,7 +17,7 @@ public static void main(String[] args) { String winningNumbers = Input.getWinningNumbers(); LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers); - Map counter = lottoChecker.checkAllTickets(lottoMachine.getTickets()); + CheckCounter counter = lottoChecker.checkAllTickets(lottoMachine.getTickets()); Output.showResult(counter, money); } diff --git a/src/main/java/lotto/domain/CheckCounter.java b/src/main/java/lotto/domain/CheckCounter.java new file mode 100644 index 0000000..6d2910d --- /dev/null +++ b/src/main/java/lotto/domain/CheckCounter.java @@ -0,0 +1,36 @@ +package lotto.domain; + +import java.util.Map; +import java.util.TreeMap; + +public class CheckCounter { + private final Map checkCounter; + + public CheckCounter() { + this.checkCounter = new TreeMap<>(); + } + + public void setInitial(int key) { + this.checkCounter.put(key, 1); + } + + public int get(int key) { + return this.checkCounter.getOrDefault(key, 0); + } + + public boolean has(int key) { + return this.checkCounter.containsKey(key); + } + + public void countUp(int key) { + int previousValue = this.checkCounter.get(key); + this.checkCounter.put(key, previousValue + 1); + } + + public int getTotalWinningMoney() { + return (5_000 * this.checkCounter.getOrDefault(3, 0)) + + (50_000 * this.checkCounter.getOrDefault(4, 0)) + + (1_500_000 * this.checkCounter.getOrDefault(5, 0)) + + (2_000_000_000 * this.checkCounter.getOrDefault(6, 0)); + } +} diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 2c3ad2f..96871e4 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -2,16 +2,13 @@ import java.util.Arrays; import java.util.List; -import java.util.Map; -import java.util.TreeMap; public class LottoChecker { - private final Map checkCounter; + private final CheckCounter checkCounter = new CheckCounter(); private final List winningNumbers; public LottoChecker(String winnings) { - this.checkCounter = new TreeMap<>(); this.winningNumbers = Arrays.asList( Arrays.stream(winnings.split(",")) @@ -44,33 +41,20 @@ private int getCount(List ticketNumbers, int count, Integer number) { return count; } - public Map checkAllTickets(List tickets) { + public CheckCounter checkAllTickets(List tickets) { for (LottoTicket ticket : tickets) { addCheckCounter(this.checkTicket(ticket)); } - addTotalWinningMoney(); - return this.checkCounter; } - private void addCheckCounter(int count) { - if (this.checkCounter.containsKey(count)) { - this.checkCounter.put(count, this.checkCounter.get(count) + 1); - + private void addCheckCounter(int matchCount) { + if (this.checkCounter.has(matchCount)) { + this.checkCounter.countUp(matchCount); return; } - this.checkCounter.put(count, 1); - } - - private void addTotalWinningMoney() { - int totalWinningMoney = - (5_000 * this.checkCounter.getOrDefault(3, 0)) - + (50_000 * this.checkCounter.getOrDefault(4, 0)) - + (1_500_000 * this.checkCounter.getOrDefault(5, 0)) - + (2_000_000_000 * this.checkCounter.getOrDefault(6, 0)); - - this.checkCounter.put(7, totalWinningMoney); + this.checkCounter.setInitial(matchCount); } } diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 12a1a98..603933f 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -1,5 +1,6 @@ package lotto.view; +import lotto.domain.CheckCounter; import lotto.domain.LottoTicket; import java.util.List; @@ -11,16 +12,16 @@ public static void showLottoTickets(List tickets) { tickets.forEach(ticket -> System.out.println(ticket.getLottoNumbers())); } - public static void showResult(Map counter, int money) { + public static void showResult(CheckCounter counter, int money) { System.out.println(""); System.out.println("당첨 통계"); System.out.println("----------------------------"); - System.out.printf("3개 일치 (5,000원) - %d개\n", counter.getOrDefault(3, 0)); - System.out.printf("4개 일치 (50,000원) - %d개\n", counter.getOrDefault(4, 0)); - System.out.printf("5개 일치 (1,500,000원) - %d개\n", counter.getOrDefault(5, 0)); - System.out.printf("모두 일치 (2,000,000,000원) - %d개\n", counter.getOrDefault(6, 0)); + System.out.printf("3개 일치 (5,000원) - %d개\n", counter.get(3)); + System.out.printf("4개 일치 (50,000원) - %d개\n", counter.get(4)); + System.out.printf("5개 일치 (1,500,000원) - %d개\n", counter.get(5)); + System.out.printf("모두 일치 (2,000,000,000원) - %d개\n", counter.get(6)); System.out.println(""); - System.out.printf("총 수익률은 %.2f입니다.\n\n\n", (double) counter.get(7) / money); + System.out.printf("총 수익률은 %.2f입니다.\n\n\n", (double) counter.getTotalWinningMoney() / money); } } diff --git a/src/test/java/lotto/CheckCounterTest.java b/src/test/java/lotto/CheckCounterTest.java new file mode 100644 index 0000000..d1e422d --- /dev/null +++ b/src/test/java/lotto/CheckCounterTest.java @@ -0,0 +1,47 @@ +package lotto; + +import lotto.domain.CheckCounter; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CheckCounterTest { + @Test + void put() { + CheckCounter checkCounter = new CheckCounter(); + + checkCounter.setInitial(1); + + assertThat(checkCounter.get(1)).isEqualTo(1); + } + + @Test + void has() { + CheckCounter checkCounter = new CheckCounter(); + + checkCounter.setInitial(1); + + assertThat(checkCounter.has(1)).isTrue(); + assertThat(checkCounter.has(2)).isFalse(); + } + + @Test + void countUp() { + CheckCounter checkCounter = new CheckCounter(); + + checkCounter.setInitial(1); + checkCounter.countUp(1); + + assertThat(checkCounter.get(1)).isEqualTo(2); + } + + @Test + void getTotalWinningMoney() { + CheckCounter checkCounter = new CheckCounter(); + + checkCounter.setInitial(3); + checkCounter.setInitial(4); + + assertThat(checkCounter.getTotalWinningMoney()).isEqualTo(55_000); + } +} diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index 14f9b26..ac3546d 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.domain.CheckCounter; import lotto.domain.LottoChecker; import lotto.domain.LottoMachine; import lotto.domain.LottoTicket; @@ -47,12 +48,11 @@ void init() { "4,0", "5,0", "6,0", - "7,5000" }) void checkAllTickets(Integer key, Integer value) { List tickets = lottoMachine.getTickets(); - Map checkCounter = lottoChecker.checkAllTickets(tickets); + CheckCounter checkCounter = lottoChecker.checkAllTickets(tickets); - assertThat(checkCounter.getOrDefault(key, 0)).isEqualTo(value); + assertThat(checkCounter.get(key)).isEqualTo(value); } } From 4eed6d9cb0879e31d0f9d3c00710a3938d328c3e Mon Sep 17 00:00:00 2001 From: woomin Date: Mon, 22 Jun 2020 14:47:45 +0900 Subject: [PATCH 28/44] Fix lints --- .../lotto/controller/LottoApplication.java | 4 ++-- src/main/java/lotto/domain/LottoChecker.java | 20 +++++++++++-------- src/main/java/lotto/domain/LottoMachine.java | 6 ++---- src/main/java/lotto/view/Output.java | 5 +++-- src/test/java/lotto/LottoCheckerTest.java | 3 +-- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index ae928c6..332923a 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -13,11 +13,11 @@ public static void main(String[] args) { LottoMachine lottoMachine = LottoMachine.newMachine(); lottoMachine.makeTicketsWithMoney(money); - Output.showLottoTickets(lottoMachine.getTickets()); + Output.showLottoTickets(lottoMachine); String winningNumbers = Input.getWinningNumbers(); LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers); - CheckCounter counter = lottoChecker.checkAllTickets(lottoMachine.getTickets()); + CheckCounter counter = lottoChecker.checkAllTickets(lottoMachine); Output.showResult(counter, money); } diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 96871e4..668f3bb 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -9,13 +9,7 @@ public class LottoChecker { private final List winningNumbers; public LottoChecker(String winnings) { - this.winningNumbers = - Arrays.asList( - Arrays.stream(winnings.split(",")) - .mapToInt(Integer::parseInt) - .boxed() - .toArray(Integer[]::new) - ); + this.winningNumbers = convertToList(winnings); } public static LottoChecker newChecker(String winnings) { @@ -41,7 +35,8 @@ private int getCount(List ticketNumbers, int count, Integer number) { return count; } - public CheckCounter checkAllTickets(List tickets) { + public CheckCounter checkAllTickets(LottoMachine lottoMachine) { + List tickets = lottoMachine.getTickets(); for (LottoTicket ticket : tickets) { addCheckCounter(this.checkTicket(ticket)); } @@ -57,4 +52,13 @@ private void addCheckCounter(int matchCount) { this.checkCounter.setInitial(matchCount); } + + private List convertToList(String string) { + return Arrays.asList( + Arrays.stream(string.split(",")) + .mapToInt(Integer::parseInt) + .boxed() + .toArray(Integer[]::new) + ); + } } diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 671f071..9a60b71 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -5,11 +5,9 @@ public class LottoMachine { - private final List lottoTickets; + private final List lottoTickets = new ArrayList<>(); - public LottoMachine() { - lottoTickets = new ArrayList<>(); - } + public LottoMachine() {} public static LottoMachine newMachine() { return new LottoMachine(); diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 603933f..bf335b3 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -1,14 +1,15 @@ package lotto.view; import lotto.domain.CheckCounter; +import lotto.domain.LottoMachine; import lotto.domain.LottoTicket; import java.util.List; -import java.util.Map; public class Output { - public static void showLottoTickets(List tickets) { + public static void showLottoTickets(LottoMachine lottoMachine) { System.out.println(""); + List tickets = lottoMachine.getTickets(); tickets.forEach(ticket -> System.out.println(ticket.getLottoNumbers())); } diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index ac3546d..8d0f1f0 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -50,8 +50,7 @@ void init() { "6,0", }) void checkAllTickets(Integer key, Integer value) { - List tickets = lottoMachine.getTickets(); - CheckCounter checkCounter = lottoChecker.checkAllTickets(tickets); + CheckCounter checkCounter = lottoChecker.checkAllTickets(lottoMachine); assertThat(checkCounter.get(key)).isEqualTo(value); } From 5a6317c1d27c14a9ced4798f322715434ec667b5 Mon Sep 17 00:00:00 2001 From: woomin Date: Mon, 22 Jun 2020 15:21:15 +0900 Subject: [PATCH 29/44] Modify method name getCount() to plusCount() --- src/main/java/lotto/domain/LottoChecker.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 668f3bb..af53007 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -20,14 +20,14 @@ public int checkTicket(LottoTicket ticket) { List ticketNumbers = ticket.getLottoNumbers(); int count = 0; - for (Integer number : winningNumbers) { - count = getCount(ticketNumbers, count, number); + for (Integer number : this.winningNumbers) { + count = plusCount(ticketNumbers, count, number); } return count; } - private int getCount(List ticketNumbers, int count, Integer number) { + private int plusCount(List ticketNumbers, int count, Integer number) { if (ticketNumbers.contains(number)) { count += 1; } From 4d0d33d523f939fd34727c0303c5701c4055c409 Mon Sep 17 00:00:00 2001 From: woomin Date: Mon, 22 Jun 2020 15:27:02 +0900 Subject: [PATCH 30/44] Rename the methodes in LottoChecker class --- src/main/java/lotto/domain/LottoChecker.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index af53007..9aaa077 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -16,7 +16,7 @@ public static LottoChecker newChecker(String winnings) { return new LottoChecker(winnings); } - public int checkTicket(LottoTicket ticket) { + public int countMatchedNumber(LottoTicket ticket) { List ticketNumbers = ticket.getLottoNumbers(); int count = 0; @@ -38,13 +38,13 @@ private int plusCount(List ticketNumbers, int count, Integer number) { public CheckCounter checkAllTickets(LottoMachine lottoMachine) { List tickets = lottoMachine.getTickets(); for (LottoTicket ticket : tickets) { - addCheckCounter(this.checkTicket(ticket)); + addToCheckCounter(this.countMatchedNumber(ticket)); } return this.checkCounter; } - private void addCheckCounter(int matchCount) { + private void addToCheckCounter(int matchCount) { if (this.checkCounter.has(matchCount)) { this.checkCounter.countUp(matchCount); return; From 22c93f81f7fcd835584f6724af291c4742796251 Mon Sep 17 00:00:00 2001 From: woomin Date: Mon, 22 Jun 2020 15:34:58 +0900 Subject: [PATCH 31/44] Add enum ShowWinner in Output class --- src/main/java/lotto/view/Output.java | 44 +++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index bf335b3..7e875ec 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -13,14 +13,50 @@ public static void showLottoTickets(LottoMachine lottoMachine) { tickets.forEach(ticket -> System.out.println(ticket.getLottoNumbers())); } + public enum ShowWinner { + FIRST { + @Override + public void showCount(CheckCounter counter) { + System.out.printf("모두 일치 (2,000,000,000원) - %d개\n", counter.get(6)); + } + }, + SECOND { + @Override + public void showCount(CheckCounter counter) { + System.out.printf("5개 일치, 보너스 볼 일치(30_000_000원) - 0개"); + } + }, + THIRD { + @Override + public void showCount(CheckCounter counter) { + System.out.printf("5개 일치 (1,500,000원) - %d개\n", counter.get(5)); + } + }, + FOURTH { + @Override + public void showCount(CheckCounter counter) { + System.out.printf("4개 일치 (50,000원) - %d개\n", counter.get(4)); + } + }, + FIFTH { + @Override + public void showCount(CheckCounter counter) { + System.out.printf("3개 일치 (5,000원) - %d개\n", counter.get(3)); + } + }; + + abstract public void showCount(CheckCounter counter); + } + public static void showResult(CheckCounter counter, int money) { System.out.println(""); System.out.println("당첨 통계"); System.out.println("----------------------------"); - System.out.printf("3개 일치 (5,000원) - %d개\n", counter.get(3)); - System.out.printf("4개 일치 (50,000원) - %d개\n", counter.get(4)); - System.out.printf("5개 일치 (1,500,000원) - %d개\n", counter.get(5)); - System.out.printf("모두 일치 (2,000,000,000원) - %d개\n", counter.get(6)); + ShowWinner.FIFTH.showCount(counter); + ShowWinner.FOURTH.showCount(counter); + ShowWinner.THIRD.showCount(counter); + ShowWinner.SECOND.showCount(counter); + ShowWinner.FIRST.showCount(counter); System.out.println(""); System.out.printf("총 수익률은 %.2f입니다.\n\n\n", (double) counter.getTotalWinningMoney() / money); From 7c19908cd9fe3b5ef65fee1b39422cf54bc66dc8 Mon Sep 17 00:00:00 2001 From: woomin Date: Mon, 22 Jun 2020 16:09:07 +0900 Subject: [PATCH 32/44] Add bonusBall logic to LottoChecker class --- .../lotto/controller/LottoApplication.java | 4 ++- src/main/java/lotto/domain/LottoChecker.java | 27 ++++++++++++++++--- .../java/lotto/domain/RandomGenerator.java | 6 ++--- src/main/java/lotto/view/Input.java | 7 +++++ src/main/java/lotto/view/Output.java | 2 +- src/test/java/lotto/LottoCheckerTest.java | 16 ++++++----- src/test/java/lotto/LottoMachineTest.java | 4 +-- src/test/java/lotto/LottoTicketTest.java | 2 +- src/test/java/lotto/RandomGeneratorTest.java | 2 +- 9 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 332923a..7ea04ec 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -16,7 +16,9 @@ public static void main(String[] args) { Output.showLottoTickets(lottoMachine); String winningNumbers = Input.getWinningNumbers(); - LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers); + int bonusBallNumber = Input.getBonusBallNumber(); + + LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, bonusBallNumber); CheckCounter counter = lottoChecker.checkAllTickets(lottoMachine); Output.showResult(counter, money); diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 9aaa077..be8f45b 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -7,13 +7,15 @@ public class LottoChecker { private final CheckCounter checkCounter = new CheckCounter(); private final List winningNumbers; + private final int bonusBall; - public LottoChecker(String winnings) { + public LottoChecker(String winnings, int bonusBall) { this.winningNumbers = convertToList(winnings); + this.bonusBall = bonusBall; } - public static LottoChecker newChecker(String winnings) { - return new LottoChecker(winnings); + public static LottoChecker newChecker(String winnings, int bonusBall) { + return new LottoChecker(winnings, bonusBall); } public int countMatchedNumber(LottoTicket ticket) { @@ -38,12 +40,25 @@ private int plusCount(List ticketNumbers, int count, Integer number) { public CheckCounter checkAllTickets(LottoMachine lottoMachine) { List tickets = lottoMachine.getTickets(); for (LottoTicket ticket : tickets) { - addToCheckCounter(this.countMatchedNumber(ticket)); + int matchCount = this.countMatchedNumber(ticket); + boolean bonusBallMatch = isContainingBonusBall(ticket); + + executeCheckCounter(matchCount, bonusBallMatch); } return this.checkCounter; } + private void executeCheckCounter(int matchCount, boolean bonusBallMatch) { + if (matchCount == 5 && bonusBallMatch) { + int secondWinner = 7; + addToCheckCounter(secondWinner); + return; + } + + addToCheckCounter(matchCount); + } + private void addToCheckCounter(int matchCount) { if (this.checkCounter.has(matchCount)) { this.checkCounter.countUp(matchCount); @@ -61,4 +76,8 @@ private List convertToList(String string) { .toArray(Integer[]::new) ); } + + private boolean isContainingBonusBall(LottoTicket ticket) { + return ticket.getLottoNumbers().contains(this.bonusBall); + } } diff --git a/src/main/java/lotto/domain/RandomGenerator.java b/src/main/java/lotto/domain/RandomGenerator.java index a70da35..9844784 100644 --- a/src/main/java/lotto/domain/RandomGenerator.java +++ b/src/main/java/lotto/domain/RandomGenerator.java @@ -21,9 +21,9 @@ public static RandomGenerator newGenerator() { public List getNumbers() { Collections.shuffle(numbers); - List sixNumbers = numbers.subList(0, 6); - Collections.sort(sixNumbers); + List sevenNumbers = numbers.subList(0, 7); + Collections.sort(sevenNumbers); - return sixNumbers; + return sevenNumbers; } } diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java index 3194430..db85ffc 100644 --- a/src/main/java/lotto/view/Input.java +++ b/src/main/java/lotto/view/Input.java @@ -19,4 +19,11 @@ public static String getWinningNumbers() { return scanner.nextLine(); } + + public static int getBonusBallNumber() { + System.out.println("보너스 볼을 입력해주세요."); + Scanner scanner = new Scanner(System.in); + + return scanner.nextInt(); + } } diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 7e875ec..7046212 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -23,7 +23,7 @@ public void showCount(CheckCounter counter) { SECOND { @Override public void showCount(CheckCounter counter) { - System.out.printf("5개 일치, 보너스 볼 일치(30_000_000원) - 0개"); + System.out.printf("5개 일치, 보너스 볼 일치(30_000_000원) - %d개\n", counter.get(7)); } }, THIRD { diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index 8d0f1f0..c6bb1de 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -18,10 +18,11 @@ public class LottoCheckerTest { @Test void checkTicket() { String winningNumbers = "1,2,3,4,5,6"; - LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers); + int bonusBall = 7; + LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, bonusBall); LottoTicket ticket = LottoTicket.newLotto(List.of(1, 2, 3, 4, 11, 12)); - int count = lottoChecker.checkTicket(ticket); + int count = lottoChecker.countMatchedNumber(ticket); assertThat(count).isEqualTo(4); } @@ -32,12 +33,14 @@ void checkTicket() { @BeforeEach void init() { lottoMachine = LottoMachine.newMachine(); - lottoMachine.makeTicket(List.of(1, 2, 3, 11, 12, 13)); - lottoMachine.makeTicket(List.of(1, 2, 11, 12, 13, 14)); - lottoMachine.makeTicket(List.of(11, 12, 13, 14, 15, 16)); + lottoMachine.makeTicket(List.of(1, 2, 3, 11, 12, 13, 14)); + lottoMachine.makeTicket(List.of(1, 2, 11, 12, 13, 14, 15)); + lottoMachine.makeTicket(List.of(11, 12, 13, 14, 15, 16, 17)); + lottoMachine.makeTicket(List.of(1, 2, 3, 4, 5, 7, 16)); String winningNumbers = "1,2,3,4,5,6"; - lottoChecker = LottoChecker.newChecker(winningNumbers); + int bonusBall = 7; + lottoChecker = LottoChecker.newChecker(winningNumbers, bonusBall); } @ParameterizedTest @@ -48,6 +51,7 @@ void init() { "4,0", "5,0", "6,0", + "7,1", }) void checkAllTickets(Integer key, Integer value) { CheckCounter checkCounter = lottoChecker.checkAllTickets(lottoMachine); diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index 3058b09..4c3b141 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -13,8 +13,8 @@ public class LottoMachineTest { @Test void makeLottoTicket() { LottoMachine lottoMachine = LottoMachine.newMachine(); - List numbers1 = new ArrayList<>(List.of(1, 3, 5, 7, 9, 11)); - List numbers2 = new ArrayList<>(List.of(2, 4, 6, 8, 10, 12)); + List numbers1 = new ArrayList<>(List.of(1, 3, 5, 7, 9, 11, 13)); + List numbers2 = new ArrayList<>(List.of(2, 4, 6, 8, 10, 12, 14)); lottoMachine.makeTicket(numbers1); lottoMachine.makeTicket(numbers2); diff --git a/src/test/java/lotto/LottoTicketTest.java b/src/test/java/lotto/LottoTicketTest.java index 90b1d14..c32d213 100644 --- a/src/test/java/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/LottoTicketTest.java @@ -11,7 +11,7 @@ public class LottoTicketTest { @Test void getLottoNumbers() { - List numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6)); + List numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7)); LottoTicket lottoTicket = LottoTicket.newLotto(numbers); diff --git a/src/test/java/lotto/RandomGeneratorTest.java b/src/test/java/lotto/RandomGeneratorTest.java index c62805a..6286b8a 100644 --- a/src/test/java/lotto/RandomGeneratorTest.java +++ b/src/test/java/lotto/RandomGeneratorTest.java @@ -14,6 +14,6 @@ void getNumbers() { List numbers = randomGenerator.getNumbers(); - assertThat(numbers).hasSize(6); + assertThat(numbers).hasSize(7); } } From 32c7105f568d384a17fda49e44fc39c477aba0b4 Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 12:29:53 +0900 Subject: [PATCH 33/44] Wrap int money to Money Class --- .../lotto/controller/LottoApplication.java | 3 ++- src/main/java/lotto/domain/LottoMachine.java | 4 +-- src/main/java/lotto/domain/Money.java | 25 ++++++++++++++++++ src/main/java/lotto/view/Output.java | 5 ++-- src/test/java/lotto/LottoMachineTest.java | 3 ++- src/test/java/lotto/MoneyTest.java | 26 +++++++++++++++++++ 6 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 src/main/java/lotto/domain/Money.java create mode 100644 src/test/java/lotto/MoneyTest.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 7ea04ec..409bce3 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -3,12 +3,13 @@ import lotto.domain.CheckCounter; import lotto.domain.LottoChecker; import lotto.domain.LottoMachine; +import lotto.domain.Money; import lotto.view.Input; import lotto.view.Output; public class LottoApplication { public static void main(String[] args) { - int money = Input.getUserInputMoney(); + Money money = Money.newMoney(Input.getUserInputMoney()); LottoMachine lottoMachine = LottoMachine.newMachine(); lottoMachine.makeTicketsWithMoney(money); diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 9a60b71..e1831d8 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -22,8 +22,8 @@ public void makeTicket(List numbers) { this.lottoTickets.add(newTicket); } - public void makeTicketsWithMoney(int money) { - for (int i = 0; i < money / 1000; i += 1) { + public void makeTicketsWithMoney(Money money) { + for (int i = 0; i < money.get() / 1000; i += 1) { List randomNumbers = RandomGenerator.newGenerator().getNumbers(); this.makeTicket(randomNumbers); } diff --git a/src/main/java/lotto/domain/Money.java b/src/main/java/lotto/domain/Money.java new file mode 100644 index 0000000..0f6e2bb --- /dev/null +++ b/src/main/java/lotto/domain/Money.java @@ -0,0 +1,25 @@ +package lotto.domain; + +public class Money { + + private final int money; + + public Money(int money) { + this.validate(money); + this.money = money; + } + + public static Money newMoney(int money) { + return new Money(money); + } + + public int get() { + return this.money; + } + + private void validate(int money) { + if (money < 1000) { + throw new IllegalArgumentException("1000원 이상 구매하셔야 합니다."); + } + } +} diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 7046212..70b6d1a 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -3,6 +3,7 @@ import lotto.domain.CheckCounter; import lotto.domain.LottoMachine; import lotto.domain.LottoTicket; +import lotto.domain.Money; import java.util.List; @@ -48,7 +49,7 @@ public void showCount(CheckCounter counter) { abstract public void showCount(CheckCounter counter); } - public static void showResult(CheckCounter counter, int money) { + public static void showResult(CheckCounter counter, Money money) { System.out.println(""); System.out.println("당첨 통계"); System.out.println("----------------------------"); @@ -59,6 +60,6 @@ public static void showResult(CheckCounter counter, int money) { ShowWinner.FIRST.showCount(counter); System.out.println(""); - System.out.printf("총 수익률은 %.2f입니다.\n\n\n", (double) counter.getTotalWinningMoney() / money); + System.out.printf("총 수익률은 %.2f입니다.\n\n\n", (double) counter.getTotalWinningMoney() / money.get()); } } diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index 4c3b141..8ba2d26 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -2,6 +2,7 @@ import lotto.domain.LottoMachine; import lotto.domain.LottoTicket; +import lotto.domain.Money; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -27,7 +28,7 @@ void makeLottoTicket() { @Test void makeLottoTicketsWithMoney() { - int money = 14_000; + Money money = Money.newMoney(14_000); LottoMachine lottoMachine = LottoMachine.newMachine(); lottoMachine.makeTicketsWithMoney(money); diff --git a/src/test/java/lotto/MoneyTest.java b/src/test/java/lotto/MoneyTest.java new file mode 100644 index 0000000..f135b96 --- /dev/null +++ b/src/test/java/lotto/MoneyTest.java @@ -0,0 +1,26 @@ +package lotto; + +import lotto.domain.Money; +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 MoneyTest { + @Test + @DisplayName("with valid money") + void validMoney() { + Money money = Money.newMoney(14_000); + + assertThat(money.get()).isEqualTo(14_000); + } + + @Test + @DisplayName("with invalid money") + void invalidMoney() { + assertThatThrownBy(() -> { + Money money = Money.newMoney(900); + }).isInstanceOf(IllegalArgumentException.class); + } +} From 0b10061c79a5c8f95320a8bd7e9f847dda74341e Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 12:42:35 +0900 Subject: [PATCH 34/44] Wrap int bonusBall to LottoBall Class --- .../lotto/controller/LottoApplication.java | 9 ++---- src/main/java/lotto/domain/LottoBall.java | 25 ++++++++++++++++ src/main/java/lotto/domain/LottoChecker.java | 12 ++++---- src/test/java/lotto/LottoBallTest.java | 29 +++++++++++++++++++ src/test/java/lotto/LottoCheckerTest.java | 14 ++++----- 5 files changed, 68 insertions(+), 21 deletions(-) create mode 100644 src/main/java/lotto/domain/LottoBall.java create mode 100644 src/test/java/lotto/LottoBallTest.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 409bce3..d8bf601 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -1,9 +1,6 @@ package lotto.controller; -import lotto.domain.CheckCounter; -import lotto.domain.LottoChecker; -import lotto.domain.LottoMachine; -import lotto.domain.Money; +import lotto.domain.*; import lotto.view.Input; import lotto.view.Output; @@ -17,9 +14,9 @@ public static void main(String[] args) { Output.showLottoTickets(lottoMachine); String winningNumbers = Input.getWinningNumbers(); - int bonusBallNumber = Input.getBonusBallNumber(); + LottoBall lottoBallNumber = LottoBall.newLottoBall(Input.getBonusBallNumber()); - LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, bonusBallNumber); + LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, lottoBallNumber); CheckCounter counter = lottoChecker.checkAllTickets(lottoMachine); Output.showResult(counter, money); diff --git a/src/main/java/lotto/domain/LottoBall.java b/src/main/java/lotto/domain/LottoBall.java new file mode 100644 index 0000000..28080b1 --- /dev/null +++ b/src/main/java/lotto/domain/LottoBall.java @@ -0,0 +1,25 @@ +package lotto.domain; + +public class LottoBall { + + private final int ballNumber; + + public LottoBall(int number) { + this.validate(number); + this.ballNumber = number; + } + + public static LottoBall newLottoBall(int number) { + return new LottoBall(number); + } + + public int get() { + return this.ballNumber; + } + + private void validate(int number) { + if (number < 1 || number > 45) { + throw new IllegalArgumentException("보너스 볼로 가능한 숫자는 1 ~ 45 입니다."); + } + } +} diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index be8f45b..84e7e76 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -7,15 +7,15 @@ public class LottoChecker { private final CheckCounter checkCounter = new CheckCounter(); private final List winningNumbers; - private final int bonusBall; + private final LottoBall lottoBall; - public LottoChecker(String winnings, int bonusBall) { + public LottoChecker(String winnings, LottoBall lottoBall) { this.winningNumbers = convertToList(winnings); - this.bonusBall = bonusBall; + this.lottoBall = lottoBall; } - public static LottoChecker newChecker(String winnings, int bonusBall) { - return new LottoChecker(winnings, bonusBall); + public static LottoChecker newChecker(String winnings, LottoBall lottoBall) { + return new LottoChecker(winnings, lottoBall); } public int countMatchedNumber(LottoTicket ticket) { @@ -78,6 +78,6 @@ private List convertToList(String string) { } private boolean isContainingBonusBall(LottoTicket ticket) { - return ticket.getLottoNumbers().contains(this.bonusBall); + return ticket.getLottoNumbers().contains(this.lottoBall.get()); } } diff --git a/src/test/java/lotto/LottoBallTest.java b/src/test/java/lotto/LottoBallTest.java new file mode 100644 index 0000000..7966e07 --- /dev/null +++ b/src/test/java/lotto/LottoBallTest.java @@ -0,0 +1,29 @@ +package lotto; + +import lotto.domain.LottoBall; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class LottoBallTest { + @Test + @DisplayName("with valid bonusBall") + void validBonusBall() { + LottoBall lottoBall = LottoBall.newLottoBall(21); + + assertThat(lottoBall.get()).isEqualTo(21); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 46}) + @DisplayName("with invalid bonusBall") + void invalidBonusBall(int number) { + assertThatThrownBy(() -> { + LottoBall lottoBall = LottoBall.newLottoBall(number); + }).isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index c6bb1de..bbdbed3 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -1,16 +1,12 @@ package lotto; -import lotto.domain.CheckCounter; -import lotto.domain.LottoChecker; -import lotto.domain.LottoMachine; -import lotto.domain.LottoTicket; +import lotto.domain.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import java.util.List; -import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; @@ -18,8 +14,8 @@ public class LottoCheckerTest { @Test void checkTicket() { String winningNumbers = "1,2,3,4,5,6"; - int bonusBall = 7; - LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, bonusBall); + LottoBall lottoBall = LottoBall.newLottoBall(7); + LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, lottoBall); LottoTicket ticket = LottoTicket.newLotto(List.of(1, 2, 3, 4, 11, 12)); int count = lottoChecker.countMatchedNumber(ticket); @@ -39,8 +35,8 @@ void init() { lottoMachine.makeTicket(List.of(1, 2, 3, 4, 5, 7, 16)); String winningNumbers = "1,2,3,4,5,6"; - int bonusBall = 7; - lottoChecker = LottoChecker.newChecker(winningNumbers, bonusBall); + LottoBall lottoBall = LottoBall.newLottoBall(7); + lottoChecker = LottoChecker.newChecker(winningNumbers, lottoBall); } @ParameterizedTest From 906e4ce8542156b355989d463b346f21c48c2931 Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 13:34:51 +0900 Subject: [PATCH 35/44] Modify int ball to LottoBall Class --- src/main/java/lotto/domain/LottoBall.java | 8 ++- src/main/java/lotto/domain/LottoChecker.java | 12 ++--- src/main/java/lotto/domain/LottoMachine.java | 4 +- src/main/java/lotto/domain/LottoTicket.java | 13 +++-- .../java/lotto/domain/RandomGenerator.java | 8 +-- src/test/java/lotto/LottoCheckerTest.java | 49 +++++++++++++++++-- src/test/java/lotto/LottoMachineTest.java | 25 ++++++++-- src/test/java/lotto/LottoTicketTest.java | 13 ++++- src/test/java/lotto/RandomGeneratorTest.java | 3 +- 9 files changed, 106 insertions(+), 29 deletions(-) diff --git a/src/main/java/lotto/domain/LottoBall.java b/src/main/java/lotto/domain/LottoBall.java index 28080b1..880cb89 100644 --- a/src/main/java/lotto/domain/LottoBall.java +++ b/src/main/java/lotto/domain/LottoBall.java @@ -1,6 +1,6 @@ package lotto.domain; -public class LottoBall { +public class LottoBall implements Comparable{ private final int ballNumber; @@ -22,4 +22,10 @@ private void validate(int number) { throw new IllegalArgumentException("보너스 볼로 가능한 숫자는 1 ~ 45 입니다."); } } + + @Override + public int compareTo(Object o) { + LottoBall next = (LottoBall) o; + return this.ballNumber - next.ballNumber; + } } diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 84e7e76..be7e977 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -7,15 +7,15 @@ public class LottoChecker { private final CheckCounter checkCounter = new CheckCounter(); private final List winningNumbers; - private final LottoBall lottoBall; + private final LottoBall bonusBall; - public LottoChecker(String winnings, LottoBall lottoBall) { + public LottoChecker(String winnings, LottoBall bonusBall) { this.winningNumbers = convertToList(winnings); - this.lottoBall = lottoBall; + this.bonusBall = bonusBall; } - public static LottoChecker newChecker(String winnings, LottoBall lottoBall) { - return new LottoChecker(winnings, lottoBall); + public static LottoChecker newChecker(String winnings, LottoBall bonusBall) { + return new LottoChecker(winnings, bonusBall); } public int countMatchedNumber(LottoTicket ticket) { @@ -78,6 +78,6 @@ private List convertToList(String string) { } private boolean isContainingBonusBall(LottoTicket ticket) { - return ticket.getLottoNumbers().contains(this.lottoBall.get()); + return ticket.getLottoNumbers().contains(this.bonusBall.get()); } } diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index e1831d8..bc32d78 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -17,14 +17,14 @@ public List getTickets() { return this.lottoTickets; } - public void makeTicket(List numbers) { + public void makeTicket(List numbers) { LottoTicket newTicket = LottoTicket.newLotto(numbers); this.lottoTickets.add(newTicket); } public void makeTicketsWithMoney(Money money) { for (int i = 0; i < money.get() / 1000; i += 1) { - List randomNumbers = RandomGenerator.newGenerator().getNumbers(); + List randomNumbers = RandomGenerator.newGenerator().getNumbers(); this.makeTicket(randomNumbers); } } diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java index 65f598f..377da67 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -1,20 +1,25 @@ package lotto.domain; +import java.util.ArrayList; import java.util.List; public class LottoTicket { - private final List lottoNumbers; + private final List lottoNumbers; - public LottoTicket(List numbers) { + public LottoTicket(List numbers) { this.lottoNumbers = numbers; } - public static LottoTicket newLotto(List numbers) { + public static LottoTicket newLotto(List numbers) { return new LottoTicket(numbers); } public List getLottoNumbers() { - return this.lottoNumbers; + List numbers = new ArrayList<>(); + for (LottoBall ball : this.lottoNumbers) { + numbers.add(ball.get()); + } + return numbers; } } \ No newline at end of file diff --git a/src/main/java/lotto/domain/RandomGenerator.java b/src/main/java/lotto/domain/RandomGenerator.java index 9844784..22c1f5a 100644 --- a/src/main/java/lotto/domain/RandomGenerator.java +++ b/src/main/java/lotto/domain/RandomGenerator.java @@ -6,12 +6,12 @@ public class RandomGenerator { - private final List numbers; + private final List numbers; public RandomGenerator() { this.numbers = new ArrayList<>(); for (int i = 1; i <= 45; i += 1) { - numbers.add(i); + numbers.add(LottoBall.newLottoBall(i)); } } @@ -19,9 +19,9 @@ public static RandomGenerator newGenerator() { return new RandomGenerator(); } - public List getNumbers() { + public List getNumbers() { Collections.shuffle(numbers); - List sevenNumbers = numbers.subList(0, 7); + List sevenNumbers = numbers.subList(0, 7); Collections.sort(sevenNumbers); return sevenNumbers; diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index bbdbed3..8c8a8cc 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -16,7 +16,14 @@ void checkTicket() { String winningNumbers = "1,2,3,4,5,6"; LottoBall lottoBall = LottoBall.newLottoBall(7); LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, lottoBall); - LottoTicket ticket = LottoTicket.newLotto(List.of(1, 2, 3, 4, 11, 12)); + LottoTicket ticket = LottoTicket.newLotto(List.of( + LottoBall.newLottoBall(1), + LottoBall.newLottoBall(2), + LottoBall.newLottoBall(3), + LottoBall.newLottoBall(4), + LottoBall.newLottoBall(11), + LottoBall.newLottoBall(12) + )); int count = lottoChecker.countMatchedNumber(ticket); @@ -29,10 +36,42 @@ void checkTicket() { @BeforeEach void init() { lottoMachine = LottoMachine.newMachine(); - lottoMachine.makeTicket(List.of(1, 2, 3, 11, 12, 13, 14)); - lottoMachine.makeTicket(List.of(1, 2, 11, 12, 13, 14, 15)); - lottoMachine.makeTicket(List.of(11, 12, 13, 14, 15, 16, 17)); - lottoMachine.makeTicket(List.of(1, 2, 3, 4, 5, 7, 16)); + lottoMachine.makeTicket(List.of( + LottoBall.newLottoBall(1), + LottoBall.newLottoBall(2), + LottoBall.newLottoBall(3), + LottoBall.newLottoBall(11), + LottoBall.newLottoBall(12), + LottoBall.newLottoBall(13), + LottoBall.newLottoBall(14) + )); + lottoMachine.makeTicket(List.of( + LottoBall.newLottoBall(1), + LottoBall.newLottoBall(2), + LottoBall.newLottoBall(11), + LottoBall.newLottoBall(12), + LottoBall.newLottoBall(13), + LottoBall.newLottoBall(14), + LottoBall.newLottoBall(15) + )); + lottoMachine.makeTicket(List.of( + LottoBall.newLottoBall(11), + LottoBall.newLottoBall(12), + LottoBall.newLottoBall(13), + LottoBall.newLottoBall(14), + LottoBall.newLottoBall(15), + LottoBall.newLottoBall(16), + LottoBall.newLottoBall(17) + )); + lottoMachine.makeTicket(List.of( + LottoBall.newLottoBall(1), + LottoBall.newLottoBall(2), + LottoBall.newLottoBall(3), + LottoBall.newLottoBall(4), + LottoBall.newLottoBall(5), + LottoBall.newLottoBall(7), + LottoBall.newLottoBall(16) + )); String winningNumbers = "1,2,3,4,5,6"; LottoBall lottoBall = LottoBall.newLottoBall(7); diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index 8ba2d26..19549c6 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.domain.LottoBall; import lotto.domain.LottoMachine; import lotto.domain.LottoTicket; import lotto.domain.Money; @@ -14,16 +15,32 @@ public class LottoMachineTest { @Test void makeLottoTicket() { LottoMachine lottoMachine = LottoMachine.newMachine(); - List numbers1 = new ArrayList<>(List.of(1, 3, 5, 7, 9, 11, 13)); - List numbers2 = new ArrayList<>(List.of(2, 4, 6, 8, 10, 12, 14)); + List numbers1 = new ArrayList<>(List.of( + LottoBall.newLottoBall(1), + LottoBall.newLottoBall(3), + LottoBall.newLottoBall(5), + LottoBall.newLottoBall(7), + LottoBall.newLottoBall(9), + LottoBall.newLottoBall(11), + LottoBall.newLottoBall(13) + )); + List numbers2 = new ArrayList<>(List.of( + LottoBall.newLottoBall(2), + LottoBall.newLottoBall(4), + LottoBall.newLottoBall(6), + LottoBall.newLottoBall(8), + LottoBall.newLottoBall(10), + LottoBall.newLottoBall(12), + LottoBall.newLottoBall(14) + )); lottoMachine.makeTicket(numbers1); lottoMachine.makeTicket(numbers2); LottoTicket firstTicket = lottoMachine.getTickets().get(0); - assertThat(firstTicket.getLottoNumbers()).isEqualTo(numbers1); + assertThat(firstTicket.getLottoNumbers()).isEqualTo(new ArrayList<>(List.of(1, 3, 5, 7, 9, 11, 13))); LottoTicket secondTicket = lottoMachine.getTickets().get(1); - assertThat(secondTicket.getLottoNumbers()).isEqualTo(numbers2); + assertThat(secondTicket.getLottoNumbers()).isEqualTo(new ArrayList<>(List.of(2, 4, 6, 8, 10, 12, 14))); } @Test diff --git a/src/test/java/lotto/LottoTicketTest.java b/src/test/java/lotto/LottoTicketTest.java index c32d213..be28c34 100644 --- a/src/test/java/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/LottoTicketTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.domain.LottoBall; import lotto.domain.LottoTicket; import org.junit.jupiter.api.Test; @@ -11,10 +12,18 @@ public class LottoTicketTest { @Test void getLottoNumbers() { - List numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7)); + List numbers = new ArrayList<>(List.of( + LottoBall.newLottoBall(1), + LottoBall.newLottoBall(2), + LottoBall.newLottoBall(3), + LottoBall.newLottoBall(4), + LottoBall.newLottoBall(5), + LottoBall.newLottoBall(6), + LottoBall.newLottoBall(7) + )); LottoTicket lottoTicket = LottoTicket.newLotto(numbers); - assertThat(lottoTicket.getLottoNumbers()).isEqualTo(numbers); + assertThat(lottoTicket.getLottoNumbers()).isEqualTo(new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7))); } } diff --git a/src/test/java/lotto/RandomGeneratorTest.java b/src/test/java/lotto/RandomGeneratorTest.java index 6286b8a..977c13e 100644 --- a/src/test/java/lotto/RandomGeneratorTest.java +++ b/src/test/java/lotto/RandomGeneratorTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.domain.LottoBall; import lotto.domain.RandomGenerator; import org.junit.jupiter.api.Test; @@ -12,7 +13,7 @@ public class RandomGeneratorTest { void getNumbers() { RandomGenerator randomGenerator = RandomGenerator.newGenerator(); - List numbers = randomGenerator.getNumbers(); + List numbers = randomGenerator.getNumbers(); assertThat(numbers).hasSize(7); } From fca1d9f7f2c41ec2a74b922eea3a652fce504844 Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 15:31:37 +0900 Subject: [PATCH 36/44] Modify factory method name --- .../lotto/controller/LottoApplication.java | 2 +- src/main/java/lotto/domain/LottoBall.java | 2 +- src/main/java/lotto/domain/LottoMachine.java | 2 +- src/main/java/lotto/domain/LottoTicket.java | 2 +- .../java/lotto/domain/RandomGenerator.java | 2 +- src/test/java/lotto/LottoBallTest.java | 4 +- src/test/java/lotto/LottoCheckerTest.java | 75 ++++++++++--------- src/test/java/lotto/LottoMachineTest.java | 28 +++---- src/test/java/lotto/LottoTicketTest.java | 16 ++-- 9 files changed, 67 insertions(+), 66 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index d8bf601..3ed8664 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -14,7 +14,7 @@ public static void main(String[] args) { Output.showLottoTickets(lottoMachine); String winningNumbers = Input.getWinningNumbers(); - LottoBall lottoBallNumber = LottoBall.newLottoBall(Input.getBonusBallNumber()); + LottoBall lottoBallNumber = LottoBall.newBall(Input.getBonusBallNumber()); LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, lottoBallNumber); CheckCounter counter = lottoChecker.checkAllTickets(lottoMachine); diff --git a/src/main/java/lotto/domain/LottoBall.java b/src/main/java/lotto/domain/LottoBall.java index 880cb89..3aabf9c 100644 --- a/src/main/java/lotto/domain/LottoBall.java +++ b/src/main/java/lotto/domain/LottoBall.java @@ -9,7 +9,7 @@ public LottoBall(int number) { this.ballNumber = number; } - public static LottoBall newLottoBall(int number) { + public static LottoBall newBall(int number) { return new LottoBall(number); } diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index bc32d78..5aef058 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -18,7 +18,7 @@ public List getTickets() { } public void makeTicket(List numbers) { - LottoTicket newTicket = LottoTicket.newLotto(numbers); + LottoTicket newTicket = LottoTicket.newTicket(numbers); this.lottoTickets.add(newTicket); } diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java index 377da67..4ece6bb 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -11,7 +11,7 @@ public LottoTicket(List numbers) { this.lottoNumbers = numbers; } - public static LottoTicket newLotto(List numbers) { + public static LottoTicket newTicket(List numbers) { return new LottoTicket(numbers); } diff --git a/src/main/java/lotto/domain/RandomGenerator.java b/src/main/java/lotto/domain/RandomGenerator.java index 22c1f5a..c64d604 100644 --- a/src/main/java/lotto/domain/RandomGenerator.java +++ b/src/main/java/lotto/domain/RandomGenerator.java @@ -11,7 +11,7 @@ public class RandomGenerator { public RandomGenerator() { this.numbers = new ArrayList<>(); for (int i = 1; i <= 45; i += 1) { - numbers.add(LottoBall.newLottoBall(i)); + numbers.add(LottoBall.newBall(i)); } } diff --git a/src/test/java/lotto/LottoBallTest.java b/src/test/java/lotto/LottoBallTest.java index 7966e07..9191788 100644 --- a/src/test/java/lotto/LottoBallTest.java +++ b/src/test/java/lotto/LottoBallTest.java @@ -13,7 +13,7 @@ public class LottoBallTest { @Test @DisplayName("with valid bonusBall") void validBonusBall() { - LottoBall lottoBall = LottoBall.newLottoBall(21); + LottoBall lottoBall = LottoBall.newBall(21); assertThat(lottoBall.get()).isEqualTo(21); } @@ -23,7 +23,7 @@ void validBonusBall() { @DisplayName("with invalid bonusBall") void invalidBonusBall(int number) { assertThatThrownBy(() -> { - LottoBall lottoBall = LottoBall.newLottoBall(number); + LottoBall lottoBall = LottoBall.newBall(number); }).isInstanceOf(IllegalArgumentException.class); } } diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index 8c8a8cc..a9746e9 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -14,15 +14,15 @@ public class LottoCheckerTest { @Test void checkTicket() { String winningNumbers = "1,2,3,4,5,6"; - LottoBall lottoBall = LottoBall.newLottoBall(7); + LottoBall lottoBall = LottoBall.newBall(7); LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, lottoBall); - LottoTicket ticket = LottoTicket.newLotto(List.of( - LottoBall.newLottoBall(1), - LottoBall.newLottoBall(2), - LottoBall.newLottoBall(3), - LottoBall.newLottoBall(4), - LottoBall.newLottoBall(11), - LottoBall.newLottoBall(12) + LottoTicket ticket = LottoTicket.newTicket(List.of( + LottoBall.newBall(1), + LottoBall.newBall(2), + LottoBall.newBall(3), + LottoBall.newBall(4), + LottoBall.newBall(11), + LottoBall.newBall(12) )); int count = lottoChecker.countMatchedNumber(ticket); @@ -36,45 +36,46 @@ void checkTicket() { @BeforeEach void init() { lottoMachine = LottoMachine.newMachine(); + lottoMachine.makeTicket(List.of( - LottoBall.newLottoBall(1), - LottoBall.newLottoBall(2), - LottoBall.newLottoBall(3), - LottoBall.newLottoBall(11), - LottoBall.newLottoBall(12), - LottoBall.newLottoBall(13), - LottoBall.newLottoBall(14) + LottoBall.newBall(1), + LottoBall.newBall(2), + LottoBall.newBall(3), + LottoBall.newBall(11), + LottoBall.newBall(12), + LottoBall.newBall(13), + LottoBall.newBall(14) )); lottoMachine.makeTicket(List.of( - LottoBall.newLottoBall(1), - LottoBall.newLottoBall(2), - LottoBall.newLottoBall(11), - LottoBall.newLottoBall(12), - LottoBall.newLottoBall(13), - LottoBall.newLottoBall(14), - LottoBall.newLottoBall(15) + LottoBall.newBall(1), + LottoBall.newBall(2), + LottoBall.newBall(11), + LottoBall.newBall(12), + LottoBall.newBall(13), + LottoBall.newBall(14), + LottoBall.newBall(15) )); lottoMachine.makeTicket(List.of( - LottoBall.newLottoBall(11), - LottoBall.newLottoBall(12), - LottoBall.newLottoBall(13), - LottoBall.newLottoBall(14), - LottoBall.newLottoBall(15), - LottoBall.newLottoBall(16), - LottoBall.newLottoBall(17) + LottoBall.newBall(11), + LottoBall.newBall(12), + LottoBall.newBall(13), + LottoBall.newBall(14), + LottoBall.newBall(15), + LottoBall.newBall(16), + LottoBall.newBall(17) )); lottoMachine.makeTicket(List.of( - LottoBall.newLottoBall(1), - LottoBall.newLottoBall(2), - LottoBall.newLottoBall(3), - LottoBall.newLottoBall(4), - LottoBall.newLottoBall(5), - LottoBall.newLottoBall(7), - LottoBall.newLottoBall(16) + LottoBall.newBall(1), + LottoBall.newBall(2), + LottoBall.newBall(3), + LottoBall.newBall(4), + LottoBall.newBall(5), + LottoBall.newBall(7), + LottoBall.newBall(16) )); String winningNumbers = "1,2,3,4,5,6"; - LottoBall lottoBall = LottoBall.newLottoBall(7); + LottoBall lottoBall = LottoBall.newBall(7); lottoChecker = LottoChecker.newChecker(winningNumbers, lottoBall); } diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index 19549c6..04f9f4c 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -16,22 +16,22 @@ public class LottoMachineTest { void makeLottoTicket() { LottoMachine lottoMachine = LottoMachine.newMachine(); List numbers1 = new ArrayList<>(List.of( - LottoBall.newLottoBall(1), - LottoBall.newLottoBall(3), - LottoBall.newLottoBall(5), - LottoBall.newLottoBall(7), - LottoBall.newLottoBall(9), - LottoBall.newLottoBall(11), - LottoBall.newLottoBall(13) + LottoBall.newBall(1), + LottoBall.newBall(3), + LottoBall.newBall(5), + LottoBall.newBall(7), + LottoBall.newBall(9), + LottoBall.newBall(11), + LottoBall.newBall(13) )); List numbers2 = new ArrayList<>(List.of( - LottoBall.newLottoBall(2), - LottoBall.newLottoBall(4), - LottoBall.newLottoBall(6), - LottoBall.newLottoBall(8), - LottoBall.newLottoBall(10), - LottoBall.newLottoBall(12), - LottoBall.newLottoBall(14) + LottoBall.newBall(2), + LottoBall.newBall(4), + LottoBall.newBall(6), + LottoBall.newBall(8), + LottoBall.newBall(10), + LottoBall.newBall(12), + LottoBall.newBall(14) )); lottoMachine.makeTicket(numbers1); lottoMachine.makeTicket(numbers2); diff --git a/src/test/java/lotto/LottoTicketTest.java b/src/test/java/lotto/LottoTicketTest.java index be28c34..b9ba960 100644 --- a/src/test/java/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/LottoTicketTest.java @@ -13,16 +13,16 @@ public class LottoTicketTest { @Test void getLottoNumbers() { List numbers = new ArrayList<>(List.of( - LottoBall.newLottoBall(1), - LottoBall.newLottoBall(2), - LottoBall.newLottoBall(3), - LottoBall.newLottoBall(4), - LottoBall.newLottoBall(5), - LottoBall.newLottoBall(6), - LottoBall.newLottoBall(7) + LottoBall.newBall(1), + LottoBall.newBall(2), + LottoBall.newBall(3), + LottoBall.newBall(4), + LottoBall.newBall(5), + LottoBall.newBall(6), + LottoBall.newBall(7) )); - LottoTicket lottoTicket = LottoTicket.newLotto(numbers); + LottoTicket lottoTicket = LottoTicket.newTicket(numbers); assertThat(lottoTicket.getLottoNumbers()).isEqualTo(new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7))); } From a8997b17240413f5a7b1a6b535258973b3492528 Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 16:08:06 +0900 Subject: [PATCH 37/44] Add Exception handler by using try-catch --- .../java/lotto/controller/LottoApplication.java | 16 ++++++++++++++-- src/main/java/lotto/view/Output.java | 5 +++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 3ed8664..97c69c9 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -6,7 +6,13 @@ public class LottoApplication { public static void main(String[] args) { - Money money = Money.newMoney(Input.getUserInputMoney()); + Money money; + try { + money = Money.newMoney(Input.getUserInputMoney()); + } catch (IllegalArgumentException e) { + Output.showErrorMessage(e); + money = Money.newMoney(1000); + } LottoMachine lottoMachine = LottoMachine.newMachine(); lottoMachine.makeTicketsWithMoney(money); @@ -14,7 +20,13 @@ public static void main(String[] args) { Output.showLottoTickets(lottoMachine); String winningNumbers = Input.getWinningNumbers(); - LottoBall lottoBallNumber = LottoBall.newBall(Input.getBonusBallNumber()); + LottoBall lottoBallNumber; + try { + lottoBallNumber = LottoBall.newBall(Input.getBonusBallNumber()); + } catch (IllegalArgumentException e) { + Output.showErrorMessage(e); + lottoBallNumber = LottoBall.newBall(45); + } LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, lottoBallNumber); CheckCounter counter = lottoChecker.checkAllTickets(lottoMachine); diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 70b6d1a..3e60016 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -62,4 +62,9 @@ public static void showResult(CheckCounter counter, Money money) { System.out.printf("총 수익률은 %.2f입니다.\n\n\n", (double) counter.getTotalWinningMoney() / money.get()); } + + public static void showErrorMessage(IllegalArgumentException e) { + System.out.println(""); + System.out.println(e.getMessage()); + } } From bd32c1b19b29eede3aba819c3923780560c8f57c Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 16:35:11 +0900 Subject: [PATCH 38/44] Add makeManualLotto() in LottoMachine Class --- .../lotto/controller/LottoApplication.java | 3 +- src/main/java/lotto/domain/LottoMachine.java | 37 +++++++++++++++++-- src/main/java/lotto/view/Input.java | 14 +++++++ src/test/java/lotto/LottoCheckerTest.java | 2 +- src/test/java/lotto/LottoMachineTest.java | 4 +- 5 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 97c69c9..2cd6f1a 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -14,12 +14,13 @@ public static void main(String[] args) { money = Money.newMoney(1000); } - LottoMachine lottoMachine = LottoMachine.newMachine(); + LottoMachine lottoMachine = LottoMachine.newMachine(Input.getUserInputManualCount()); lottoMachine.makeTicketsWithMoney(money); Output.showLottoTickets(lottoMachine); String winningNumbers = Input.getWinningNumbers(); + LottoBall lottoBallNumber; try { lottoBallNumber = LottoBall.newBall(Input.getBonusBallNumber()); diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 5aef058..d008c1c 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -1,16 +1,22 @@ package lotto.domain; +import lotto.view.Input; + import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class LottoMachine { private final List lottoTickets = new ArrayList<>(); + private final int manualLottoCount; - public LottoMachine() {} + public LottoMachine(int number) { + this.manualLottoCount = number; + } - public static LottoMachine newMachine() { - return new LottoMachine(); + public static LottoMachine newMachine(int number) { + return new LottoMachine(number); } public List getTickets() { @@ -23,9 +29,32 @@ public void makeTicket(List numbers) { } public void makeTicketsWithMoney(Money money) { - for (int i = 0; i < money.get() / 1000; i += 1) { + makeAutoLottos(money); + makeManualLottos(); + } + + private void makeAutoLottos(Money money) { + int autoLottoCount = (money.get() / 1000) - this.manualLottoCount; + for (int i = 0; i < autoLottoCount; i += 1) { List randomNumbers = RandomGenerator.newGenerator().getNumbers(); this.makeTicket(randomNumbers); } } + + private void makeManualLottos() { + for (int i = 0; i < this.manualLottoCount; i += 1) { + String numbers = Input.getManualLottoNumber(); + List lottoNumbers = convertToList(numbers); + this.makeTicket(lottoNumbers); + } + } + + private List convertToList(String string) { + return Arrays.asList( + Arrays.stream(string.split(",")) + .map(Integer::parseInt) + .map(LottoBall::newBall) + .toArray(LottoBall[]::new) + ); + } } diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java index db85ffc..cd45bb1 100644 --- a/src/main/java/lotto/view/Input.java +++ b/src/main/java/lotto/view/Input.java @@ -13,6 +13,20 @@ public static int getUserInputMoney() { return money; } + public static int getUserInputManualCount() { + System.out.println("수동으로 구매할 로또의 수를 입력해주세요"); + Scanner scanner = new Scanner(System.in); + + return scanner.nextInt(); + } + + public static String getManualLottoNumber() { + System.out.println("수동으로 구매할 로또의 번호를 입력해주세요"); + Scanner scanner = new Scanner(System.in); + + return scanner.nextLine(); + } + public static String getWinningNumbers() { System.out.println("당첨 번호를 입력해주세요."); Scanner scanner = new Scanner(System.in); diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index a9746e9..c84a6cd 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -35,7 +35,7 @@ void checkTicket() { @BeforeEach void init() { - lottoMachine = LottoMachine.newMachine(); + lottoMachine = LottoMachine.newMachine(0); lottoMachine.makeTicket(List.of( LottoBall.newBall(1), diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index 04f9f4c..157c357 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -14,7 +14,7 @@ public class LottoMachineTest { @Test void makeLottoTicket() { - LottoMachine lottoMachine = LottoMachine.newMachine(); + LottoMachine lottoMachine = LottoMachine.newMachine(0); List numbers1 = new ArrayList<>(List.of( LottoBall.newBall(1), LottoBall.newBall(3), @@ -46,7 +46,7 @@ void makeLottoTicket() { @Test void makeLottoTicketsWithMoney() { Money money = Money.newMoney(14_000); - LottoMachine lottoMachine = LottoMachine.newMachine(); + LottoMachine lottoMachine = LottoMachine.newMachine(0); lottoMachine.makeTicketsWithMoney(money); assertThat(lottoMachine.getTickets()).hasSize(14); From b735f8205d043de33b728661007f818e955ae64e Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 16:43:20 +0900 Subject: [PATCH 39/44] Fix makeTicketsWithMoney() to makeTickets() --- .../lotto/controller/LottoApplication.java | 4 ++-- src/main/java/lotto/domain/LottoMachine.java | 24 +++++++++---------- src/test/java/lotto/LottoCheckerTest.java | 2 +- src/test/java/lotto/LottoMachineTest.java | 6 ++--- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 2cd6f1a..6337a38 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -14,8 +14,8 @@ public static void main(String[] args) { money = Money.newMoney(1000); } - LottoMachine lottoMachine = LottoMachine.newMachine(Input.getUserInputManualCount()); - lottoMachine.makeTicketsWithMoney(money); + LottoMachine lottoMachine = LottoMachine.newMachine(); + lottoMachine.makeTickets(money, Input.getUserInputManualCount()); Output.showLottoTickets(lottoMachine); diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index d008c1c..7b06afc 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -9,14 +9,11 @@ public class LottoMachine { private final List lottoTickets = new ArrayList<>(); - private final int manualLottoCount; - public LottoMachine(int number) { - this.manualLottoCount = number; - } + public LottoMachine() {} - public static LottoMachine newMachine(int number) { - return new LottoMachine(number); + public static LottoMachine newMachine() { + return new LottoMachine(); } public List getTickets() { @@ -28,21 +25,22 @@ public void makeTicket(List numbers) { this.lottoTickets.add(newTicket); } - public void makeTicketsWithMoney(Money money) { - makeAutoLottos(money); - makeManualLottos(); + public void makeTickets(Money money, int manualLottoCount) { + int autoLottoCount = (money.get() / 1000) - manualLottoCount; + + makeAutoLottos(autoLottoCount); + makeManualLottos(manualLottoCount); } - private void makeAutoLottos(Money money) { - int autoLottoCount = (money.get() / 1000) - this.manualLottoCount; + private void makeAutoLottos(int autoLottoCount) { for (int i = 0; i < autoLottoCount; i += 1) { List randomNumbers = RandomGenerator.newGenerator().getNumbers(); this.makeTicket(randomNumbers); } } - private void makeManualLottos() { - for (int i = 0; i < this.manualLottoCount; i += 1) { + private void makeManualLottos(int manualLottoCount) { + for (int i = 0; i < manualLottoCount; i += 1) { String numbers = Input.getManualLottoNumber(); List lottoNumbers = convertToList(numbers); this.makeTicket(lottoNumbers); diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index c84a6cd..a9746e9 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -35,7 +35,7 @@ void checkTicket() { @BeforeEach void init() { - lottoMachine = LottoMachine.newMachine(0); + lottoMachine = LottoMachine.newMachine(); lottoMachine.makeTicket(List.of( LottoBall.newBall(1), diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index 157c357..e5e99ca 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -14,7 +14,7 @@ public class LottoMachineTest { @Test void makeLottoTicket() { - LottoMachine lottoMachine = LottoMachine.newMachine(0); + LottoMachine lottoMachine = LottoMachine.newMachine(); List numbers1 = new ArrayList<>(List.of( LottoBall.newBall(1), LottoBall.newBall(3), @@ -46,8 +46,8 @@ void makeLottoTicket() { @Test void makeLottoTicketsWithMoney() { Money money = Money.newMoney(14_000); - LottoMachine lottoMachine = LottoMachine.newMachine(0); - lottoMachine.makeTicketsWithMoney(money); + LottoMachine lottoMachine = LottoMachine.newMachine(); + lottoMachine.makeTickets(money, 0); assertThat(lottoMachine.getTickets()).hasSize(14); } From dc90ae6a7dd3637a8a08893332049c84f103c1f9 Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 18:10:53 +0900 Subject: [PATCH 40/44] Make ManualLottoTicketWriter class to controller --- .../lotto/controller/LottoApplication.java | 7 +++- .../controller/ManualLottoTicketWriter.java | 39 +++++++++++++++++++ src/main/java/lotto/domain/LottoMachine.java | 25 +++--------- src/test/java/lotto/LottoMachineTest.java | 5 ++- 4 files changed, 53 insertions(+), 23 deletions(-) create mode 100644 src/main/java/lotto/controller/ManualLottoTicketWriter.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 6337a38..54d893d 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -4,6 +4,8 @@ import lotto.view.Input; import lotto.view.Output; +import java.util.List; + public class LottoApplication { public static void main(String[] args) { Money money; @@ -14,8 +16,11 @@ public static void main(String[] args) { money = Money.newMoney(1000); } + ManualLottoTicketWriter manualWriter = ManualLottoTicketWriter.newWriter(); + List manualTickets = manualWriter.write(Input.getUserInputManualCount()); + LottoMachine lottoMachine = LottoMachine.newMachine(); - lottoMachine.makeTickets(money, Input.getUserInputManualCount()); + lottoMachine.makeTickets(money, manualTickets); Output.showLottoTickets(lottoMachine); diff --git a/src/main/java/lotto/controller/ManualLottoTicketWriter.java b/src/main/java/lotto/controller/ManualLottoTicketWriter.java new file mode 100644 index 0000000..e8b1c0a --- /dev/null +++ b/src/main/java/lotto/controller/ManualLottoTicketWriter.java @@ -0,0 +1,39 @@ +package lotto.controller; + +import lotto.domain.LottoBall; +import lotto.domain.LottoTicket; +import lotto.view.Input; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class ManualLottoTicketWriter { + + public ManualLottoTicketWriter() {} + + public static ManualLottoTicketWriter newWriter() { + return new ManualLottoTicketWriter(); + } + + public List write(int manualLottoCount) { + ArrayList manualTickets = new ArrayList<>(); + + for (int i = 0; i < manualLottoCount; i += 1) { + String numberString = Input.getManualLottoNumber(); + LottoTicket ticket = convertToLottoTickets(numberString); + + manualTickets.add(ticket); + } + + return manualTickets; + } + + private LottoTicket convertToLottoTickets(String numberString) { + int[] numbers = Arrays.stream(numberString.split(",")).mapToInt(Integer::parseInt).toArray(); + List lottoNumbers = Arrays.stream(numbers).mapToObj(LottoBall::newBall).collect(Collectors.toList()); + + return LottoTicket.newTicket(lottoNumbers); + } +} diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 7b06afc..44c9a15 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -1,9 +1,6 @@ package lotto.domain; -import lotto.view.Input; - import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class LottoMachine { @@ -25,11 +22,12 @@ public void makeTicket(List numbers) { this.lottoTickets.add(newTicket); } - public void makeTickets(Money money, int manualLottoCount) { + public void makeTickets(Money money, List manualTickets) { + int manualLottoCount = manualTickets.size(); int autoLottoCount = (money.get() / 1000) - manualLottoCount; makeAutoLottos(autoLottoCount); - makeManualLottos(manualLottoCount); + makeManualLottos(manualTickets); } private void makeAutoLottos(int autoLottoCount) { @@ -39,20 +37,7 @@ private void makeAutoLottos(int autoLottoCount) { } } - private void makeManualLottos(int manualLottoCount) { - for (int i = 0; i < manualLottoCount; i += 1) { - String numbers = Input.getManualLottoNumber(); - List lottoNumbers = convertToList(numbers); - this.makeTicket(lottoNumbers); - } - } - - private List convertToList(String string) { - return Arrays.asList( - Arrays.stream(string.split(",")) - .map(Integer::parseInt) - .map(LottoBall::newBall) - .toArray(LottoBall[]::new) - ); + private void makeManualLottos(List manualTickets) { + this.lottoTickets.addAll(manualTickets); } } diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index e5e99ca..cea0f7a 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -44,10 +44,11 @@ void makeLottoTicket() { } @Test - void makeLottoTicketsWithMoney() { + void makeTickets() { Money money = Money.newMoney(14_000); LottoMachine lottoMachine = LottoMachine.newMachine(); - lottoMachine.makeTickets(money, 0); + List empty = new ArrayList<>(); + lottoMachine.makeTickets(money, empty); assertThat(lottoMachine.getTickets()).hasSize(14); } From b536e073acaf4e15e62a97441fee46bdb1b8d33b Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 19:35:00 +0900 Subject: [PATCH 41/44] Remove Money Class getter --- src/main/java/lotto/domain/LottoMachine.java | 2 +- src/main/java/lotto/domain/Money.java | 12 ++++++---- src/main/java/lotto/view/Output.java | 2 +- src/test/java/lotto/MoneyTest.java | 25 +++++++++++++------- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 44c9a15..38e2e29 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -24,7 +24,7 @@ public void makeTicket(List numbers) { public void makeTickets(Money money, List manualTickets) { int manualLottoCount = manualTickets.size(); - int autoLottoCount = (money.get() / 1000) - manualLottoCount; + int autoLottoCount = money.getAutoLottoCount(manualLottoCount); makeAutoLottos(autoLottoCount); makeManualLottos(manualTickets); diff --git a/src/main/java/lotto/domain/Money.java b/src/main/java/lotto/domain/Money.java index 0f6e2bb..2d2deb6 100644 --- a/src/main/java/lotto/domain/Money.java +++ b/src/main/java/lotto/domain/Money.java @@ -13,13 +13,17 @@ public static Money newMoney(int money) { return new Money(money); } - public int get() { - return this.money; - } - private void validate(int money) { if (money < 1000) { throw new IllegalArgumentException("1000원 이상 구매하셔야 합니다."); } } + + public int getAutoLottoCount(int manualLottoCount) { + return (this.money / 1000) - manualLottoCount; + } + + public double getRevenueRate(int totalWinningMoney) { + return (double) totalWinningMoney / this.money; + } } diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 3e60016..9cdd0ab 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -60,7 +60,7 @@ public static void showResult(CheckCounter counter, Money money) { ShowWinner.FIRST.showCount(counter); System.out.println(""); - System.out.printf("총 수익률은 %.2f입니다.\n\n\n", (double) counter.getTotalWinningMoney() / money.get()); + System.out.printf("총 수익률은 %.2f입니다.\n\n\n", money.getRevenueRate(counter.getTotalWinningMoney())); } public static void showErrorMessage(IllegalArgumentException e) { diff --git a/src/test/java/lotto/MoneyTest.java b/src/test/java/lotto/MoneyTest.java index f135b96..e0de736 100644 --- a/src/test/java/lotto/MoneyTest.java +++ b/src/test/java/lotto/MoneyTest.java @@ -9,18 +9,27 @@ public class MoneyTest { @Test - @DisplayName("with valid money") - void validMoney() { + void withInvalidMoney() { + assertThatThrownBy(() -> { + Money money = Money.newMoney(900); + }).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void getAutoLottoCount() { Money money = Money.newMoney(14_000); - assertThat(money.get()).isEqualTo(14_000); + int manualLottoCount = 3; + + assertThat(money.getAutoLottoCount(manualLottoCount)).isEqualTo(11); } @Test - @DisplayName("with invalid money") - void invalidMoney() { - assertThatThrownBy(() -> { - Money money = Money.newMoney(900); - }).isInstanceOf(IllegalArgumentException.class); + void getRevenueRate() { + Money money = Money.newMoney(14_000); + + int totalWinningMoney = 7_000; + + assertThat(money.getRevenueRate(totalWinningMoney)).isEqualTo(0.5); } } From 2286fefbd4ecb579b5813735be93321f941430dc Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 19:44:30 +0900 Subject: [PATCH 42/44] Remove LottoBall Class getter --- src/main/java/lotto/domain/LottoBall.java | 14 +++++++--- src/main/java/lotto/domain/LottoChecker.java | 2 +- src/main/java/lotto/domain/LottoTicket.java | 3 +- src/test/java/lotto/LottoBallTest.java | 29 ++++++++++++++------ 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/main/java/lotto/domain/LottoBall.java b/src/main/java/lotto/domain/LottoBall.java index 3aabf9c..1eacb61 100644 --- a/src/main/java/lotto/domain/LottoBall.java +++ b/src/main/java/lotto/domain/LottoBall.java @@ -1,5 +1,7 @@ package lotto.domain; +import java.util.List; + public class LottoBall implements Comparable{ private final int ballNumber; @@ -13,10 +15,6 @@ public static LottoBall newBall(int number) { return new LottoBall(number); } - public int get() { - return this.ballNumber; - } - private void validate(int number) { if (number < 1 || number > 45) { throw new IllegalArgumentException("보너스 볼로 가능한 숫자는 1 ~ 45 입니다."); @@ -28,4 +26,12 @@ public int compareTo(Object o) { LottoBall next = (LottoBall) o; return this.ballNumber - next.ballNumber; } + + public boolean isElementOf(List numbers) { + return numbers.contains(this.ballNumber); + } + + public void beElementOf(List numbers) { + numbers.add(this.ballNumber); + } } diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index be7e977..a6f996c 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -78,6 +78,6 @@ private List convertToList(String string) { } private boolean isContainingBonusBall(LottoTicket ticket) { - return ticket.getLottoNumbers().contains(this.bonusBall.get()); + return this.bonusBall.isElementOf(ticket.getLottoNumbers()); } } diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java index 4ece6bb..ce54875 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -18,8 +18,9 @@ public static LottoTicket newTicket(List numbers) { public List getLottoNumbers() { List numbers = new ArrayList<>(); for (LottoBall ball : this.lottoNumbers) { - numbers.add(ball.get()); + ball.beElementOf(numbers); } + return numbers; } } \ No newline at end of file diff --git a/src/test/java/lotto/LottoBallTest.java b/src/test/java/lotto/LottoBallTest.java index 9191788..5ebf62b 100644 --- a/src/test/java/lotto/LottoBallTest.java +++ b/src/test/java/lotto/LottoBallTest.java @@ -6,18 +6,13 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import java.util.ArrayList; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; public class LottoBallTest { - @Test - @DisplayName("with valid bonusBall") - void validBonusBall() { - LottoBall lottoBall = LottoBall.newBall(21); - - assertThat(lottoBall.get()).isEqualTo(21); - } - @ParameterizedTest @ValueSource(ints = {-1, 46}) @DisplayName("with invalid bonusBall") @@ -26,4 +21,22 @@ void invalidBonusBall(int number) { LottoBall lottoBall = LottoBall.newBall(number); }).isInstanceOf(IllegalArgumentException.class); } + + @Test + void isElementOf() { + LottoBall lottoBall = LottoBall.newBall(2); + List numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7)); + + assertThat(lottoBall.isElementOf(numbers)).isTrue(); + } + + @Test + void beElementOf() { + LottoBall lottoBall = LottoBall.newBall(3); + List numbers = new ArrayList<>(List.of(1, 2)); + + lottoBall.beElementOf(numbers); + + assertThat(numbers).contains(3); + } } From 43a5c2808d4b2feefa8a3c0edb5d2a74cdb6f556 Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 20:27:43 +0900 Subject: [PATCH 43/44] Remove LottoTicket Class getter --- src/main/java/lotto/domain/LottoBall.java | 14 ++++++++++-- src/main/java/lotto/domain/LottoChecker.java | 23 ++------------------ src/main/java/lotto/domain/LottoTicket.java | 23 ++++++++++++++++++++ src/test/java/lotto/LottoCheckerTest.java | 19 ---------------- src/test/java/lotto/LottoTicketTest.java | 18 +++++++++++++++ 5 files changed, 55 insertions(+), 42 deletions(-) diff --git a/src/main/java/lotto/domain/LottoBall.java b/src/main/java/lotto/domain/LottoBall.java index 1eacb61..92a56be 100644 --- a/src/main/java/lotto/domain/LottoBall.java +++ b/src/main/java/lotto/domain/LottoBall.java @@ -22,11 +22,17 @@ private void validate(int number) { } @Override - public int compareTo(Object o) { - LottoBall next = (LottoBall) o; + public int compareTo(Object obj) { + LottoBall next = (LottoBall) obj; return this.ballNumber - next.ballNumber; } + @Override + public boolean equals(Object obj) { + LottoBall next = (LottoBall) obj; + return this.ballNumber == next.ballNumber; + } + public boolean isElementOf(List numbers) { return numbers.contains(this.ballNumber); } @@ -34,4 +40,8 @@ public boolean isElementOf(List numbers) { public void beElementOf(List numbers) { numbers.add(this.ballNumber); } + + public boolean isSameWith(int number) { + return number == this.ballNumber; + } } diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index a6f996c..9084bab 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -18,29 +18,10 @@ public static LottoChecker newChecker(String winnings, LottoBall bonusBall) { return new LottoChecker(winnings, bonusBall); } - public int countMatchedNumber(LottoTicket ticket) { - List ticketNumbers = ticket.getLottoNumbers(); - - int count = 0; - for (Integer number : this.winningNumbers) { - count = plusCount(ticketNumbers, count, number); - } - - return count; - } - - private int plusCount(List ticketNumbers, int count, Integer number) { - if (ticketNumbers.contains(number)) { - count += 1; - } - - return count; - } - public CheckCounter checkAllTickets(LottoMachine lottoMachine) { List tickets = lottoMachine.getTickets(); for (LottoTicket ticket : tickets) { - int matchCount = this.countMatchedNumber(ticket); + int matchCount = ticket.countMatchedNumber(this.winningNumbers); boolean bonusBallMatch = isContainingBonusBall(ticket); executeCheckCounter(matchCount, bonusBallMatch); @@ -78,6 +59,6 @@ private List convertToList(String string) { } private boolean isContainingBonusBall(LottoTicket ticket) { - return this.bonusBall.isElementOf(ticket.getLottoNumbers()); + return ticket.isContaining(this.bonusBall); } } diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java index ce54875..3a36384 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -23,4 +23,27 @@ public List getLottoNumbers() { return numbers; } + + public int countMatchedNumber(List winningNumbers) { + int count = 0; + for (Integer number : winningNumbers) { + count = plusCount(this.lottoNumbers, count, number); + } + + return count; + } + + private int plusCount(List ticketNumbers, int count, Integer number) { + for (LottoBall ball : ticketNumbers) { + if (ball.isSameWith(number)) { + count += 1; + } + } + + return count; + } + + public boolean isContaining(LottoBall ball) { + return this.lottoNumbers.contains(ball); + } } \ No newline at end of file diff --git a/src/test/java/lotto/LottoCheckerTest.java b/src/test/java/lotto/LottoCheckerTest.java index a9746e9..a706257 100644 --- a/src/test/java/lotto/LottoCheckerTest.java +++ b/src/test/java/lotto/LottoCheckerTest.java @@ -11,25 +11,6 @@ import static org.assertj.core.api.Assertions.assertThat; public class LottoCheckerTest { - @Test - void checkTicket() { - String winningNumbers = "1,2,3,4,5,6"; - LottoBall lottoBall = LottoBall.newBall(7); - LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers, lottoBall); - LottoTicket ticket = LottoTicket.newTicket(List.of( - LottoBall.newBall(1), - LottoBall.newBall(2), - LottoBall.newBall(3), - LottoBall.newBall(4), - LottoBall.newBall(11), - LottoBall.newBall(12) - )); - - int count = lottoChecker.countMatchedNumber(ticket); - - assertThat(count).isEqualTo(4); - } - LottoMachine lottoMachine; LottoChecker lottoChecker; diff --git a/src/test/java/lotto/LottoTicketTest.java b/src/test/java/lotto/LottoTicketTest.java index b9ba960..160012e 100644 --- a/src/test/java/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/LottoTicketTest.java @@ -26,4 +26,22 @@ void getLottoNumbers() { assertThat(lottoTicket.getLottoNumbers()).isEqualTo(new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7))); } + + @Test + void countMatchedNumber() { + List numbers = new ArrayList<>(List.of( + LottoBall.newBall(1), + LottoBall.newBall(2), + LottoBall.newBall(3), + LottoBall.newBall(4), + LottoBall.newBall(5), + LottoBall.newBall(6), + LottoBall.newBall(7) + )); + + LottoTicket lottoTicket = LottoTicket.newTicket(numbers); + List winningNumbers = new ArrayList<>(List.of(1, 2, 3, 14, 15, 16, 17)); + + assertThat(lottoTicket.countMatchedNumber(winningNumbers)).isEqualTo(3); + } } From f78e0597530a5c3169ead876a739050da33ae9bb Mon Sep 17 00:00:00 2001 From: woomin Date: Wed, 24 Jun 2020 22:36:39 +0900 Subject: [PATCH 44/44] Override toString() to LottoBall and LottoTicket --- src/main/java/lotto/domain/LottoBall.java | 9 ++--- src/main/java/lotto/domain/LottoTicket.java | 32 ++++++++++------- src/main/java/lotto/view/Output.java | 2 +- src/test/java/lotto/LottoBallTest.java | 10 ------ src/test/java/lotto/LottoMachineTest.java | 38 +++++++++++---------- src/test/java/lotto/LottoTicketTest.java | 16 --------- 6 files changed, 45 insertions(+), 62 deletions(-) diff --git a/src/main/java/lotto/domain/LottoBall.java b/src/main/java/lotto/domain/LottoBall.java index 92a56be..95e1423 100644 --- a/src/main/java/lotto/domain/LottoBall.java +++ b/src/main/java/lotto/domain/LottoBall.java @@ -37,11 +37,12 @@ public boolean isElementOf(List numbers) { return numbers.contains(this.ballNumber); } - public void beElementOf(List numbers) { - numbers.add(this.ballNumber); - } - public boolean isSameWith(int number) { return number == this.ballNumber; } + + @Override + public String toString() { + return this.ballNumber + ""; + } } diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java index 3a36384..f43776f 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -1,6 +1,5 @@ package lotto.domain; -import java.util.ArrayList; import java.util.List; public class LottoTicket { @@ -15,15 +14,6 @@ public static LottoTicket newTicket(List numbers) { return new LottoTicket(numbers); } - public List getLottoNumbers() { - List numbers = new ArrayList<>(); - for (LottoBall ball : this.lottoNumbers) { - ball.beElementOf(numbers); - } - - return numbers; - } - public int countMatchedNumber(List winningNumbers) { int count = 0; for (Integer number : winningNumbers) { @@ -35,9 +25,15 @@ public int countMatchedNumber(List winningNumbers) { private int plusCount(List ticketNumbers, int count, Integer number) { for (LottoBall ball : ticketNumbers) { - if (ball.isSameWith(number)) { - count += 1; - } + count = addCount(count, number, ball); + } + + return count; + } + + private int addCount(int count, Integer number, LottoBall ball) { + if (ball.isSameWith(number)) { + count += 1; } return count; @@ -46,4 +42,14 @@ private int plusCount(List ticketNumbers, int count, Integer number) public boolean isContaining(LottoBall ball) { return this.lottoNumbers.contains(ball); } + + @Override + public String toString() { + String result = ""; + for (LottoBall ball : this.lottoNumbers) { + result += ball.toString() + " "; + } + + return "[ " + result + "]"; + } } \ No newline at end of file diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 9cdd0ab..59a36ed 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -11,7 +11,7 @@ public class Output { public static void showLottoTickets(LottoMachine lottoMachine) { System.out.println(""); List tickets = lottoMachine.getTickets(); - tickets.forEach(ticket -> System.out.println(ticket.getLottoNumbers())); + tickets.forEach(ticket -> System.out.println(ticket.toString())); } public enum ShowWinner { diff --git a/src/test/java/lotto/LottoBallTest.java b/src/test/java/lotto/LottoBallTest.java index 5ebf62b..edd9d7f 100644 --- a/src/test/java/lotto/LottoBallTest.java +++ b/src/test/java/lotto/LottoBallTest.java @@ -29,14 +29,4 @@ void isElementOf() { assertThat(lottoBall.isElementOf(numbers)).isTrue(); } - - @Test - void beElementOf() { - LottoBall lottoBall = LottoBall.newBall(3); - List numbers = new ArrayList<>(List.of(1, 2)); - - lottoBall.beElementOf(numbers); - - assertThat(numbers).contains(3); - } } diff --git a/src/test/java/lotto/LottoMachineTest.java b/src/test/java/lotto/LottoMachineTest.java index cea0f7a..ec7554c 100644 --- a/src/test/java/lotto/LottoMachineTest.java +++ b/src/test/java/lotto/LottoMachineTest.java @@ -5,6 +5,8 @@ import lotto.domain.LottoTicket; import lotto.domain.Money; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.util.ArrayList; import java.util.List; @@ -12,10 +14,21 @@ import static org.assertj.core.api.Assertions.assertThat; public class LottoMachineTest { - @Test - void makeLottoTicket() { + @ParameterizedTest + @CsvSource(value = { + "1,true", + "3,true", + "5,true", + "7,true", + "9,true", + "11,true", + "13,true", + "14,false", + "15,false", + }) + void makeLottoTicket(int number, boolean bool) { LottoMachine lottoMachine = LottoMachine.newMachine(); - List numbers1 = new ArrayList<>(List.of( + List numbers = new ArrayList<>(List.of( LottoBall.newBall(1), LottoBall.newBall(3), LottoBall.newBall(5), @@ -24,23 +37,12 @@ void makeLottoTicket() { LottoBall.newBall(11), LottoBall.newBall(13) )); - List numbers2 = new ArrayList<>(List.of( - LottoBall.newBall(2), - LottoBall.newBall(4), - LottoBall.newBall(6), - LottoBall.newBall(8), - LottoBall.newBall(10), - LottoBall.newBall(12), - LottoBall.newBall(14) - )); - lottoMachine.makeTicket(numbers1); - lottoMachine.makeTicket(numbers2); - LottoTicket firstTicket = lottoMachine.getTickets().get(0); - assertThat(firstTicket.getLottoNumbers()).isEqualTo(new ArrayList<>(List.of(1, 3, 5, 7, 9, 11, 13))); + lottoMachine.makeTicket(numbers); - LottoTicket secondTicket = lottoMachine.getTickets().get(1); - assertThat(secondTicket.getLottoNumbers()).isEqualTo(new ArrayList<>(List.of(2, 4, 6, 8, 10, 12, 14))); + LottoTicket ticket = lottoMachine.getTickets().get(0); + LottoBall ball = LottoBall.newBall(number); + assertThat(ticket.isContaining(ball)).isEqualTo(bool); } @Test diff --git a/src/test/java/lotto/LottoTicketTest.java b/src/test/java/lotto/LottoTicketTest.java index 160012e..b1dd5d5 100644 --- a/src/test/java/lotto/LottoTicketTest.java +++ b/src/test/java/lotto/LottoTicketTest.java @@ -10,22 +10,6 @@ import static org.assertj.core.api.Assertions.assertThat; public class LottoTicketTest { - @Test - void getLottoNumbers() { - List numbers = new ArrayList<>(List.of( - LottoBall.newBall(1), - LottoBall.newBall(2), - LottoBall.newBall(3), - LottoBall.newBall(4), - LottoBall.newBall(5), - LottoBall.newBall(6), - LottoBall.newBall(7) - )); - - LottoTicket lottoTicket = LottoTicket.newTicket(numbers); - - assertThat(lottoTicket.getLottoNumbers()).isEqualTo(new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7))); - } @Test void countMatchedNumber() {