Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
1efa085
Add Calculator and StringReader with TDD
Woomin-Jeon Jun 16, 2020
8bfa08f
Add view and make getUserInput()
Woomin-Jeon Jun 16, 2020
a28e919
Make StringCalculationApp.java
Woomin-Jeon Jun 16, 2020
0811c66
Seperate view logic from controller
Woomin-Jeon Jun 16, 2020
5d9321c
Add custom separator logic
Woomin-Jeon Jun 16, 2020
145a4c4
Do refactoring to StringReader
Woomin-Jeon Jun 16, 2020
e7b9cf7
Modify Constructor to FactoryMethod
Woomin-Jeon Jun 17, 2020
6f42552
Do refactoring to test code. given-when-then
Woomin-Jeon Jun 17, 2020
02db90c
Add getLottoNumbers() in LottoTicket by TDD
Woomin-Jeon Jun 19, 2020
0f4a39a
Add makeLottoTicket() in LottoMachine by TDD
Woomin-Jeon Jun 19, 2020
5394c14
Add test case to makeLottoTicket()
Woomin-Jeon Jun 19, 2020
ce252d0
Add makeTicketsWithMoney() in LottoMachin by TDD
Woomin-Jeon Jun 19, 2020
4351be9
Change the method name short
Woomin-Jeon Jun 19, 2020
ec3449f
Add getNumbers() in RandomGenerator by TDD
Woomin-Jeon Jun 19, 2020
8ac2e1e
Fix makeTicketsWithMoney() => inject randomNumbers
Woomin-Jeon Jun 19, 2020
a52d764
Add getUserInputMoney() in Input
Woomin-Jeon Jun 19, 2020
58d6ae1
Add showLottoTickets() in Output
Woomin-Jeon Jun 19, 2020
8e0bae1
Add getWinningNumbers() in Input
Woomin-Jeon Jun 19, 2020
d1a06e9
Add converToLottoNumber() in LottoChecker by TDD
Woomin-Jeon Jun 19, 2020
94c6b1b
Modify convertToLottoNumbers() to constructor
Woomin-Jeon Jun 19, 2020
6ad8d9b
Add checkTicket() in LottoChecker by TDD
Woomin-Jeon Jun 19, 2020
fc8691e
Add checkAllTickets() in LottoChecker by TDD
Woomin-Jeon Jun 19, 2020
bd9d719
Add result view
Woomin-Jeon Jun 19, 2020
5f818e2
Add getting totalWinning logic to checkAllTickets
Woomin-Jeon Jun 19, 2020
0d0cbf7
End
Woomin-Jeon Jun 19, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/main/java/calculator/controller/StringCalculatorApp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package calculator.controller;

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) {
Result.showStartMessage();
String userInput = Input.getUserInput();

System.out.println(userInput);

StringReader stringReader = new StringReader();
int[] arr = stringReader.read(userInput);

Calculator calculator = new Calculator(arr);
Result.showResult(calculator.executeAddition());
}
}
24 changes: 24 additions & 0 deletions src/main/java/calculator/model/Calculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
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 static Calculator newCalculator(int[] numbers) {
return new Calculator(numbers);
}

public int executeAddition() {
return this.result;
}
}
27 changes: 27 additions & 0 deletions src/main/java/calculator/model/StringReader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package calculator.model;

import java.util.Arrays;

public class StringReader {
public int[] read(String str) {
String[] arr = str.split("n");

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();
}

private int[] withCustomSeparator(String separatorPart, String numberPart) {
String customSeparator = Character.toString(separatorPart.charAt(2));
String regex = "[:," + customSeparator + "]";
String[] numbers = numberPart.split(regex);

return Arrays.stream(numbers).mapToInt(Integer::parseInt).toArray();
}
}
11 changes: 11 additions & 0 deletions src/main/java/calculator/view/Input.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
12 changes: 12 additions & 0 deletions src/main/java/calculator/view/Result.java
Original file line number Diff line number Diff line change
@@ -0,0 +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);
}
}
Empty file removed src/main/java/empty.txt
Empty file.
25 changes: 25 additions & 0 deletions src/main/java/lotto/controller/LottoApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
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();

LottoMachine lottoMachine = LottoMachine.newMachine();
lottoMachine.makeTicketsWithMoney(money);

Output.showLottoTickets(lottoMachine.getTickets());

String winningNumbers = Input.getWinningNumbers();
LottoChecker lottoChecker = LottoChecker.newChecker(winningNumbers);
Map<Integer, Integer> counter = lottoChecker.checkAllTickets(lottoMachine.getTickets());

Output.showResult(counter, money);
}
}
77 changes: 77 additions & 0 deletions src/main/java/lotto/domain/LottoChecker.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package lotto.domain;

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<Integer, Integer> checkCounter;
private final List<Integer> winningNumbers;

public LottoChecker(String winnings) {
this.checkCounter = new TreeMap<>();
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);
}

public int checkTicket(LottoTicket ticket) {
List<Integer> ticketNumbers = ticket.getLottoNumbers();

int count = 0;
for (Integer number : winningNumbers) {
count = getCount(ticketNumbers, count, number);
}

return count;
}

private int getCount(List<Integer> ticketNumbers, int count, Integer number) {
if (ticketNumbers.contains(number)) {
count += 1;
}

return count;
}

public Map<Integer, Integer> checkAllTickets(List<LottoTicket> 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);

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);
}
}
33 changes: 33 additions & 0 deletions src/main/java/lotto/domain/LottoMachine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package lotto.domain;

import java.util.ArrayList;
import java.util.List;

public class LottoMachine {

private final List<LottoTicket> lottoTickets;

public LottoMachine() {
lottoTickets = new ArrayList<>();
}

public static LottoMachine newMachine() {
return new LottoMachine();
}

public List<LottoTicket> getTickets() {
return this.lottoTickets;
}

public void makeTicket(List<Integer> numbers) {
LottoTicket newTicket = LottoTicket.newLotto(numbers);
this.lottoTickets.add(newTicket);
}

public void makeTicketsWithMoney(int money) {
for (int i = 0; i < money / 1000; i += 1) {
List<Integer> randomNumbers = RandomGenerator.newGenerator().getNumbers();
this.makeTicket(randomNumbers);
}
}
}
20 changes: 20 additions & 0 deletions src/main/java/lotto/domain/LottoTicket.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package lotto.domain;

import java.util.List;

public class LottoTicket {

private final List<Integer> lottoNumbers;

public LottoTicket(List<Integer> numbers) {
this.lottoNumbers = numbers;
}

public static LottoTicket newLotto(List<Integer> numbers) {
return new LottoTicket(numbers);
}

public List<Integer> getLottoNumbers() {
return this.lottoNumbers;
}
}
29 changes: 29 additions & 0 deletions src/main/java/lotto/domain/RandomGenerator.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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<Integer> getNumbers() {
Collections.shuffle(numbers);
List<Integer> sixNumbers = numbers.subList(0, 6);
Collections.sort(sixNumbers);

return sixNumbers;
}
}
22 changes: 22 additions & 0 deletions src/main/java/lotto/view/Input.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
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개를 구매하셨습니다.\n", money / 1000);

return money;
}

public static String getWinningNumbers() {
System.out.println("당첨 번호를 입력해주세요.");
Scanner scanner = new Scanner(System.in);

return scanner.nextLine();
}
}
26 changes: 26 additions & 0 deletions src/main/java/lotto/view/Output.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package lotto.view;

import lotto.domain.LottoTicket;

import java.util.List;
import java.util.Map;

public class Output {
public static void showLottoTickets(List<LottoTicket> tickets) {
System.out.println("");
tickets.forEach(ticket -> System.out.println(ticket.getLottoNumbers()));
}

public static void showResult(Map<Integer, Integer> 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입니다.\n\n\n", (double) counter.get(7) / money);
}
}
46 changes: 46 additions & 0 deletions src/test/java/calculator/CalculatorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
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 = Calculator.newCalculator(new int[] { 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 });

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 });

int answer = calculator.executeAddition();

assertThat(answer).isEqualTo(10);
}

@Test
@DisplayName("with minus parameter")
public void minusParameter() {
assertThatThrownBy(() -> Calculator.newCalculator(new int[] { -5 })).isInstanceOf(RuntimeException.class);
}
}
Loading