From c7c6effcb9a759d1e56c70658f4a16652fc74600 Mon Sep 17 00:00:00 2001 From: Malibin Date: Wed, 20 May 2020 16:22:07 +0900 Subject: [PATCH 01/13] =?UTF-8?q?[add]=20=ED=8B=B0=EC=BC=93=20=EB=B0=9C?= =?UTF-8?q?=EA=B8=89=20=EB=B6=80=EB=B6=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 9 ++++ .../lotto/domain/ticket/LottoNumber.java | 23 ++++++++++ .../domain/ticket/LottoNumberGenerator.java | 9 ++++ .../lotto/domain/ticket/LottoTicket.java | 28 ++++++++++++ .../domain/ticket/LottoTicketDispenser.java | 20 +++++++++ .../lotto/domain/ticket/LottoTickets.java | 17 ++++++++ .../ticket/RandomLottoNumberGenerator.java | 21 +++++++++ .../domain/ticket/SortedLottoNumbers.java | 23 ++++++++++ .../com/javabom/lotto/view/InputView.java | 16 +++++++ .../com/javabom/lotto/view/OutputView.java | 43 +++++++++++++++++++ 10 files changed, 209 insertions(+) create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoNumberGenerator.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbers.java create mode 100644 src/main/java/com/javabom/lotto/view/InputView.java create mode 100644 src/main/java/com/javabom/lotto/view/OutputView.java diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 13f852e..614c9de 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -1,7 +1,16 @@ package com.javabom.lotto; +import com.javabom.lotto.domain.ticket.LottoTicketDispenser; +import com.javabom.lotto.domain.ticket.RandomLottoNumberGenerator; +import com.javabom.lotto.view.InputView; +import com.javabom.lotto.view.OutputView; + public class LottoApplication { public static void main(String[] args) { + int ticketQuantity = InputView.getBuyTicketQuantity(); + + LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new RandomLottoNumberGenerator()); + OutputView.printLottoTickets(lottoTicketDispenser.getAutoTickets(ticketQuantity)); } } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java new file mode 100644 index 0000000..aceddd7 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java @@ -0,0 +1,23 @@ +package com.javabom.lotto.domain.ticket; + +public class LottoNumber { + public static final int MIN_LOTTO_NUM = 1; + public static final int MAX_LOTTO_NUM = 45; + + private final int number; + + public LottoNumber(int number) { + validateNumber(number); + this.number = number; + } + + private void validateNumber(int number) { + if (number < MIN_LOTTO_NUM || number > MAX_LOTTO_NUM) { + throw new IllegalArgumentException("로또 번호는 1~45 입니다."); + } + } + + public int get() { + return number; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumberGenerator.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumberGenerator.java new file mode 100644 index 0000000..f9b58be --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumberGenerator.java @@ -0,0 +1,9 @@ +package com.javabom.lotto.domain.ticket; + +import java.util.List; + +public interface LottoNumberGenerator { + + List getLottoNumbers(); + +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java new file mode 100644 index 0000000..d5d8723 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java @@ -0,0 +1,28 @@ +package com.javabom.lotto.domain.ticket; + +import java.util.List; +import java.util.stream.Collectors; + +public class LottoTicket { + + private static final int LOTTO_NUM_PICK_SIZE = 6; + + private final List numbers; + + public LottoTicket(List numbers) { + validateListSize(numbers); + this.numbers = numbers; + } + + void validateListSize(List numbers) { + if (numbers.size() != LOTTO_NUM_PICK_SIZE) { + throw new IllegalArgumentException("로또 티켓에 6개 숫자를 넣어야 합니다."); + } + } + + public List getNumbers() { + return numbers.stream() + .map(LottoNumber::get) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java new file mode 100644 index 0000000..972b5a4 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java @@ -0,0 +1,20 @@ +package com.javabom.lotto.domain.ticket; + +import java.util.ArrayList; + +public class LottoTicketDispenser { + + private final LottoNumberGenerator lottoNumberGenerator; + + public LottoTicketDispenser(LottoNumberGenerator lottoNumberGenerator) { + this.lottoNumberGenerator = lottoNumberGenerator; + } + + public LottoTickets getAutoTickets(int quantity) { + ArrayList tickets = new ArrayList<>(); + for (int i = 0; i < quantity; i++) { + tickets.add(new LottoTicket(lottoNumberGenerator.getLottoNumbers())); + } + return new LottoTickets(tickets); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java new file mode 100644 index 0000000..44412b1 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java @@ -0,0 +1,17 @@ +package com.javabom.lotto.domain.ticket; + +import java.util.Collections; +import java.util.List; + +public class LottoTickets { + + private final List tickets; + + public LottoTickets(List tickets) { + this.tickets = tickets; + } + + public List get() { + return Collections.unmodifiableList(tickets); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java b/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java new file mode 100644 index 0000000..4a0bd36 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java @@ -0,0 +1,21 @@ +package com.javabom.lotto.domain.ticket; + +import java.util.Collections; +import java.util.List; + +public class RandomLottoNumberGenerator implements LottoNumberGenerator { + + // 여기서 LottoTickets.LOTTO_NUM_PICK_SIZE 변수를 가져와서 사용하려했으나, + // 의존성문제가 걸려서 다시 선언하여 사용하였습니다. + // 제 생각에는 숫자 선택 개수가 만약 바뀐다면, 여기서 꺼내쓰는게 맞다고 생각하지만 + // 로또의 경우에는 그럴 일이 없다고 판단하여 의존성때문에 재선언하여 사용하였습니다. + // 이부분 리뷰 바랍니다. + private static final int LOTTO_NUM_PICK_SIZE = 6; + + @Override + public List getLottoNumbers() { + List numbers = SortedLottoNumbers.create(); + Collections.shuffle(numbers); + return numbers.subList(0, LOTTO_NUM_PICK_SIZE); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbers.java b/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbers.java new file mode 100644 index 0000000..dc5b1c8 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbers.java @@ -0,0 +1,23 @@ +package com.javabom.lotto.domain.ticket; + +import java.util.ArrayList; +import java.util.List; + +public class SortedLottoNumbers { + + public static List create() { + ArrayList numbers = new ArrayList<>(); + for (int number = LottoNumber.MIN_LOTTO_NUM; number <= LottoNumber.MAX_LOTTO_NUM; number++) { + numbers.add(new LottoNumber(number)); + } + return numbers; + } +} + +// 처음엔 static 하나도 없는 일급 컬렉션으로 설계. +// 생성자로 1~45 들어가있는 List를 한 번 생성한 뒤 필요할때마다 복사본을 넘기게 설계. +// 한 번만 만들어내고 그다음부턴 복사본을 넘긴다. + +// 지금은 부를 때 마다 새로 만들어준다. + +// 무엇이 더 좋은지 모르겠습니다. diff --git a/src/main/java/com/javabom/lotto/view/InputView.java b/src/main/java/com/javabom/lotto/view/InputView.java new file mode 100644 index 0000000..bd9bc01 --- /dev/null +++ b/src/main/java/com/javabom/lotto/view/InputView.java @@ -0,0 +1,16 @@ +package com.javabom.lotto.view; + +import java.util.Scanner; + +public class InputView { + + private static final String NOTICE_INPUT_MONEY = "구입 금액을 입력해 주세요. 잔돈은 없습니다 ^^"; + + private static final Scanner scanner = new Scanner(System.in); + + public static int getBuyTicketQuantity() { + System.out.println(NOTICE_INPUT_MONEY); + int input = scanner.nextInt(); + return input / 1000; + } +} diff --git a/src/main/java/com/javabom/lotto/view/OutputView.java b/src/main/java/com/javabom/lotto/view/OutputView.java new file mode 100644 index 0000000..5698a71 --- /dev/null +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -0,0 +1,43 @@ +package com.javabom.lotto.view; + +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.ticket.LottoTickets; + +import java.util.stream.Collectors; + +public class OutputView { + + public static final String NOTICE_BUY_COMPLETE = "개를 구매했습니다."; + + public static void printLottoTickets(LottoTickets lottoTickets) { + printLineOf(lottoTickets.get().size() + NOTICE_BUY_COMPLETE); + for (LottoTicket lottoTicket : lottoTickets.get()) { + printLineOf(stringOf(lottoTicket)); + } + } + + private static String stringOf(LottoTicket lottoTicket) { + String lottoNumbers = lottoTicket.getNumbers().stream() + .map(String::valueOf) + .collect(Collectors.joining(", ")); + + return new StringBuilder() + .append("[") + .append(lottoNumbers) + .append("]") + .toString(); + } + + + private static void printChangeLine() { + System.out.println(); + } + + private static void printLineOf(String string) { + System.out.println(string); + } + + private static void printStringOf(String string) { + System.out.print(string); + } +} From f61cab6831fda8d1e49db8d65c21b52468cdeaba Mon Sep 17 00:00:00 2001 From: Malibin Date: Wed, 20 May 2020 21:44:02 +0900 Subject: [PATCH 02/13] =?UTF-8?q?[add]=20=ED=8B=B0=EC=BC=93=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=20=EB=B6=80=EB=B6=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 16 +++++- .../compare/LottoBasicLuckyNumbers.java | 19 +++++++ .../domain/compare/LottoLuckyNumbers.java | 29 ++++++++++ .../lotto/domain/compare/LottoResult.java | 55 +++++++++++++++++++ .../lotto/domain/compare/LottoResults.java | 25 +++++++++ .../domain/compare/LottoTicketComparator.java | 37 +++++++++++++ .../lotto/domain/ticket/LottoNumber.java | 15 +++++ .../lotto/domain/ticket/LottoTicket.java | 4 ++ .../domain/ticket/LottoTicketDispenser.java | 1 + .../com/javabom/lotto/view/InputView.java | 41 ++++++++++++-- .../com/javabom/lotto/view/OutputView.java | 39 ++++++++++--- 11 files changed, 268 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/compare/LottoLuckyNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/compare/LottoResult.java create mode 100644 src/main/java/com/javabom/lotto/domain/compare/LottoResults.java create mode 100644 src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 614c9de..603dd0b 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -1,16 +1,28 @@ package com.javabom.lotto; +import com.javabom.lotto.domain.compare.LottoLuckyNumbers; +import com.javabom.lotto.domain.compare.LottoResults; +import com.javabom.lotto.domain.compare.LottoTicketComparator; import com.javabom.lotto.domain.ticket.LottoTicketDispenser; +import com.javabom.lotto.domain.ticket.LottoTickets; import com.javabom.lotto.domain.ticket.RandomLottoNumberGenerator; import com.javabom.lotto.view.InputView; import com.javabom.lotto.view.OutputView; public class LottoApplication { public static void main(String[] args) { - int ticketQuantity = InputView.getBuyTicketQuantity(); + long inputMoney = InputView.getMoneyToBuyTicket(); + int ticketQuantity = (int) inputMoney / 1000; LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new RandomLottoNumberGenerator()); + LottoTickets lottoTickets = lottoTicketDispenser.getAutoTickets(ticketQuantity); + OutputView.printLottoTickets(lottoTickets); - OutputView.printLottoTickets(lottoTicketDispenser.getAutoTickets(ticketQuantity)); + LottoLuckyNumbers luckyNumbers = InputView.getLottoLuckyNumbers(); + + LottoTicketComparator lottoTicketComparator = new LottoTicketComparator(luckyNumbers); + LottoResults lottoResults = lottoTicketComparator.getLottoResults(lottoTickets); + OutputView.printLottoResults(lottoResults); + OutputView.printEarningRate(inputMoney, lottoResults.getTotalPrizeMoney()); } } diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java new file mode 100644 index 0000000..780092f --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java @@ -0,0 +1,19 @@ +package com.javabom.lotto.domain.compare; + +import com.javabom.lotto.domain.ticket.LottoNumber; + +import java.util.Collections; +import java.util.List; + +public class LottoBasicLuckyNumbers { + + private final List numbers; + + public LottoBasicLuckyNumbers(List numbers) { + this.numbers = numbers; + } + + public List get() { + return Collections.unmodifiableList(numbers); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/compare/LottoLuckyNumbers.java new file mode 100644 index 0000000..024562b --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoLuckyNumbers.java @@ -0,0 +1,29 @@ +package com.javabom.lotto.domain.compare; + +import com.javabom.lotto.domain.ticket.LottoNumber; + +import java.util.Collections; +import java.util.List; + +public class LottoLuckyNumbers { + + private final LottoBasicLuckyNumbers basicNumbers; + private final LottoNumber bonusNumber; + + public LottoLuckyNumbers(LottoBasicLuckyNumbers basicNumbers, LottoNumber bonusNumber) { + this.basicNumbers = basicNumbers; + this.bonusNumber = bonusNumber; + } + + // 이미 basicNumbers.get() 내부에서 unmodifiableList로 감싸서 던져주는것을 + // 한 번더 감싸는 것이 안전하다고 판단하였습니다. + public List getBasicNumbers() { + return Collections.unmodifiableList(basicNumbers.get()); + } + + // 이 LottoNumber는 불변객체라고 생각해서 그냥 반환하였는데, + // LottoNumber 내부에 copy해주는 메소드를 추가하여 복사본을 반환하는게 더 나은가요? + public LottoNumber getBonusNumber() { + return bonusNumber; + } +} diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoResult.java b/src/main/java/com/javabom/lotto/domain/compare/LottoResult.java new file mode 100644 index 0000000..b357b50 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoResult.java @@ -0,0 +1,55 @@ +package com.javabom.lotto.domain.compare; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public enum LottoResult { + + FIRST_PRIZE(6, 2_000_000_000), + SECOND_PRIZE(5, 30_000_000), + THIRD_PRIZE(5, 1_500_000), + FOURTH_PRIZE(4, 50_000), + FIFTH_PRIZE(3, 5_000), + LOSE(-1, 0); + + private final int matchCount; + private final long price; + + LottoResult(int matchCount, long price) { + this.matchCount = matchCount; + this.price = price; + } + + public static LottoResult find(int matchCount, boolean isBonusMatched) { + validateMatchCount(matchCount); + if (matchCount == SECOND_PRIZE.matchCount && isBonusMatched) { + return SECOND_PRIZE; + } + return valuesWithoutSecond().stream() + .filter(result -> result.matchCount == matchCount) + .findFirst() + .orElse(LOSE); + } + + private static void validateMatchCount(int matchCount) { + if (matchCount < 0 || matchCount > 6) { + throw new IllegalArgumentException("로또번호 매치 수는 0~6 사이입니다."); + } + } + + private static List valuesWithoutSecond() { + return Arrays.stream(values()) + .filter(result -> result != SECOND_PRIZE) + .collect(Collectors.toList()); + } + + public long getPrice() { + return price; + } + + public int getMatchCount() { + return matchCount; + } + +} diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java b/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java new file mode 100644 index 0000000..74457e2 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java @@ -0,0 +1,25 @@ +package com.javabom.lotto.domain.compare; + +import java.util.List; +import java.util.stream.Collectors; + +public class LottoResults { + + private final List lottoResults; + + public LottoResults(List lottoResults) { + this.lottoResults = lottoResults; + } + + public List findResultsOf(LottoResult lottoResult) { + return lottoResults.stream() + .filter(result -> result == lottoResult) + .collect(Collectors.toList()); + } + + public long getTotalPrizeMoney() { + return lottoResults.stream() + .mapToLong(LottoResult::getPrice) + .sum(); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java b/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java new file mode 100644 index 0000000..63cc246 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java @@ -0,0 +1,37 @@ +package com.javabom.lotto.domain.compare; + +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.ticket.LottoTickets; + +import java.util.ArrayList; + +public class LottoTicketComparator { + + private final LottoLuckyNumbers luckyNumbers; + + public LottoTicketComparator(LottoLuckyNumbers luckyNumbers) { + this.luckyNumbers = luckyNumbers; + System.out.println(luckyNumbers.getBonusNumber().get()); + } + + public LottoResults getLottoResults(LottoTickets lottoTickets) { + ArrayList lottoResults = new ArrayList<>(); + for (LottoTicket ticket : lottoTickets.get()) { + lottoResults.add(getLottoResult(ticket)); + } + return new LottoResults(lottoResults); + } + + private LottoResult getLottoResult(LottoTicket lottoTicket) { + int count = countMatchingNumbers(lottoTicket); + boolean isBonusMatched = lottoTicket.isContain(luckyNumbers.getBonusNumber()); + return LottoResult.find(count, isBonusMatched); + } + + private int countMatchingNumbers(LottoTicket lottoTicket) { + return (int) luckyNumbers.getBasicNumbers().stream() + .map(lottoTicket::isContain) + .filter(isContain -> isContain) + .count(); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java index aceddd7..38e44bc 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java @@ -1,5 +1,7 @@ package com.javabom.lotto.domain.ticket; +import java.util.Objects; + public class LottoNumber { public static final int MIN_LOTTO_NUM = 1; public static final int MAX_LOTTO_NUM = 45; @@ -20,4 +22,17 @@ private void validateNumber(int number) { public int get() { return number; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoNumber that = (LottoNumber) o; + return number == that.number; + } + + @Override + public int hashCode() { + return Objects.hash(number); + } } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java index d5d8723..1329337 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java @@ -25,4 +25,8 @@ public List getNumbers() { .map(LottoNumber::get) .collect(Collectors.toList()); } + + public boolean isContain(LottoNumber number) { + return numbers.contains(number); + } } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java index 972b5a4..330caf8 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java @@ -1,6 +1,7 @@ package com.javabom.lotto.domain.ticket; import java.util.ArrayList; +import java.util.Collections; public class LottoTicketDispenser { diff --git a/src/main/java/com/javabom/lotto/view/InputView.java b/src/main/java/com/javabom/lotto/view/InputView.java index bd9bc01..652cff2 100644 --- a/src/main/java/com/javabom/lotto/view/InputView.java +++ b/src/main/java/com/javabom/lotto/view/InputView.java @@ -1,16 +1,49 @@ package com.javabom.lotto.view; +import com.javabom.lotto.domain.compare.LottoBasicLuckyNumbers; +import com.javabom.lotto.domain.compare.LottoLuckyNumbers; +import com.javabom.lotto.domain.ticket.LottoNumber; + +import java.util.Arrays; +import java.util.List; import java.util.Scanner; +import java.util.stream.Collectors; public class InputView { private static final String NOTICE_INPUT_MONEY = "구입 금액을 입력해 주세요. 잔돈은 없습니다 ^^"; + private static final String NOTICE_INPUT_BASIC_LUCKY_NUMBER = "지난 주 당첨 번호를 입력해 주세요. (,로 나눠서 입력)"; + private static final String NOTICE_INPUT_BONUS_NUMBER = "보너스 볼을 입력해 주세요."; private static final Scanner scanner = new Scanner(System.in); - public static int getBuyTicketQuantity() { - System.out.println(NOTICE_INPUT_MONEY); - int input = scanner.nextInt(); - return input / 1000; + public static long getMoneyToBuyTicket() { + printLineOf(NOTICE_INPUT_MONEY); + return Long.parseLong(scanner.nextLine()); + } + + public static LottoLuckyNumbers getLottoLuckyNumbers() { + LottoBasicLuckyNumbers basicLuckyNumbers = getLottoBasicLuckyNumbers(); + LottoNumber bonusNumber = getBonusNumber(); + return new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); + } + + private static LottoBasicLuckyNumbers getLottoBasicLuckyNumbers() { + printLineOf(NOTICE_INPUT_BASIC_LUCKY_NUMBER); + List numbers = Arrays.stream(scanner.nextLine().split(",")) + .map(Integer::parseInt) + .map(LottoNumber::new) + .collect(Collectors.toList()); + return new LottoBasicLuckyNumbers(numbers); } + + private static LottoNumber getBonusNumber() { + printLineOf(NOTICE_INPUT_BONUS_NUMBER); + return new LottoNumber(scanner.nextInt()); + } + + private static void printLineOf(String string) { + System.out.println(string); + } + } diff --git a/src/main/java/com/javabom/lotto/view/OutputView.java b/src/main/java/com/javabom/lotto/view/OutputView.java index 5698a71..536d370 100644 --- a/src/main/java/com/javabom/lotto/view/OutputView.java +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -1,5 +1,7 @@ package com.javabom.lotto.view; +import com.javabom.lotto.domain.compare.LottoResult; +import com.javabom.lotto.domain.compare.LottoResults; import com.javabom.lotto.domain.ticket.LottoTicket; import com.javabom.lotto.domain.ticket.LottoTickets; @@ -7,7 +9,13 @@ public class OutputView { - public static final String NOTICE_BUY_COMPLETE = "개를 구매했습니다."; + private static final String NOTICE_BUY_COMPLETE = "개를 구매했습니다."; + private static final String NOTICE_WINNING_STATISTICS = "당첨 통계"; + private static final String NOTICE_MATCH_QUANTITY = "%d개 일치, "; + private static final String NOTICE_PRIZE_MONEY = "(%d원)"; + private static final String NOTICE_MATCH_RESULT_QUANTITY = " - %d개"; + private static final String NOTICE_MATCH_BONUS = "보너스 볼 일치"; + private static final String NOTICE_EARNING_RATE = "총 수익률은 %d%% 입니다."; public static void printLottoTickets(LottoTickets lottoTickets) { printLineOf(lottoTickets.get().size() + NOTICE_BUY_COMPLETE); @@ -28,16 +36,33 @@ private static String stringOf(LottoTicket lottoTicket) { .toString(); } + public static void printLottoResults(LottoResults lottoResults) { + printLineOf(NOTICE_WINNING_STATISTICS); + for (LottoResult resultKind : LottoResult.values()) { + long resultSize = lottoResults.findResultsOf(resultKind).size(); + printLottoResult(resultKind, resultSize); + } + } - private static void printChangeLine() { - System.out.println(); + private static void printLottoResult(LottoResult result, long resultSize) { + if (result == LottoResult.LOSE) return; + StringBuilder stringBuilder = new StringBuilder() + .append(String.format(NOTICE_MATCH_QUANTITY, result.getMatchCount())); + if (result == LottoResult.SECOND_PRIZE) { + stringBuilder.append(NOTICE_MATCH_BONUS); + } + stringBuilder + .append(String.format(NOTICE_PRIZE_MONEY, result.getPrice())) + .append(String.format(NOTICE_MATCH_RESULT_QUANTITY, resultSize)); + printLineOf(stringBuilder.toString()); } - private static void printLineOf(String string) { - System.out.println(string); + public static void printEarningRate(long spendMoney, long earnMoney) { + double rate = (double) earnMoney / spendMoney * 100; + printLineOf(String.format(NOTICE_EARNING_RATE, (int) rate)); } - private static void printStringOf(String string) { - System.out.print(string); + private static void printLineOf(String string) { + System.out.println(string); } } From 339f14ceb06da9c0ed53cdf4973549e6063e0bb4 Mon Sep 17 00:00:00 2001 From: Malibin Date: Thu, 21 May 2020 15:45:59 +0900 Subject: [PATCH 03/13] =?UTF-8?q?[test]=20=ED=8B=B0=EC=BC=93=20=EC=AA=BD?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/domain/ticket/LottoTicket.java | 16 +++- .../lotto/domain/ticket/LottoTickets.java | 14 ++++ .../ticket/RandomLottoNumberGenerator.java | 2 +- ...rs.java => SortedLottoNumbersFactory.java} | 4 +- .../ticket/FixedLottoNumberGenerator.java | 17 +++++ .../lotto/domain/ticket/LottoNumberTest.java | 33 +++++++++ .../ticket/LottoTicketDispenserTest.java | 34 +++++++++ .../lotto/domain/ticket/LottoTicketTest.java | 73 +++++++++++++++++++ .../ticket/SortedLottoNumbersFactoryTest.java | 23 ++++++ 9 files changed, 212 insertions(+), 4 deletions(-) rename src/main/java/com/javabom/lotto/domain/ticket/{SortedLottoNumbers.java => SortedLottoNumbersFactory.java} (89%) create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactoryTest.java diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java index 1329337..ec87c85 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java @@ -1,6 +1,7 @@ package com.javabom.lotto.domain.ticket; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; public class LottoTicket { @@ -14,7 +15,7 @@ public LottoTicket(List numbers) { this.numbers = numbers; } - void validateListSize(List numbers) { + private void validateListSize(List numbers) { if (numbers.size() != LOTTO_NUM_PICK_SIZE) { throw new IllegalArgumentException("로또 티켓에 6개 숫자를 넣어야 합니다."); } @@ -29,4 +30,17 @@ public List getNumbers() { public boolean isContain(LottoNumber number) { return numbers.contains(number); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoTicket that = (LottoTicket) o; + return Objects.equals(numbers, that.numbers); + } + + @Override + public int hashCode() { + return Objects.hash(numbers); + } } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java index 44412b1..e87777b 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.List; +import java.util.Objects; public class LottoTickets { @@ -14,4 +15,17 @@ public LottoTickets(List tickets) { public List get() { return Collections.unmodifiableList(tickets); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoTickets that = (LottoTickets) o; + return Objects.equals(tickets, that.tickets); + } + + @Override + public int hashCode() { + return Objects.hash(tickets); + } } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java b/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java index 4a0bd36..26772dc 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java @@ -14,7 +14,7 @@ public class RandomLottoNumberGenerator implements LottoNumberGenerator { @Override public List getLottoNumbers() { - List numbers = SortedLottoNumbers.create(); + List numbers = SortedLottoNumbersFactory.create(); Collections.shuffle(numbers); return numbers.subList(0, LOTTO_NUM_PICK_SIZE); } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbers.java b/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactory.java similarity index 89% rename from src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbers.java rename to src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactory.java index dc5b1c8..ba3cc22 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbers.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactory.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -public class SortedLottoNumbers { +public class SortedLottoNumbersFactory { public static List create() { ArrayList numbers = new ArrayList<>(); @@ -20,4 +20,4 @@ public static List create() { // 지금은 부를 때 마다 새로 만들어준다. -// 무엇이 더 좋은지 모르겠습니다. +// 무엇이 더 좋은지 모르겠습니다. \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java b/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java new file mode 100644 index 0000000..6740c41 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java @@ -0,0 +1,17 @@ +package com.javabom.lotto.domain.ticket; + +import java.util.Arrays; +import java.util.List; + +public class FixedLottoNumberGenerator implements LottoNumberGenerator { + @Override + public List getLottoNumbers() { + return Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6)); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java new file mode 100644 index 0000000..ab7468f --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java @@ -0,0 +1,33 @@ +package com.javabom.lotto.domain.ticket; + + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LottoNumberTest { + + @DisplayName("생성시 넣은 숫자 잘 뱉는지 확인") + @Test + void get() { + // given + int expectedNum = 1; + LottoNumber lottoNumber = new LottoNumber(expectedNum); + + // then + assertThat(lottoNumber.get()).isEqualTo(expectedNum); + } + + @DisplayName("로또번호가 아닌 1~45 이외의 수 입력못함.") + @CsvSource({"0", "46"}) + @ParameterizedTest + void name(int number) { + assertThatThrownBy(() -> new LottoNumber(number)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("로또 번호는 1~45 입니다."); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java new file mode 100644 index 0000000..b7ee90f --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java @@ -0,0 +1,34 @@ +package com.javabom.lotto.domain.ticket; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class LottoTicketDispenserTest { + + @DisplayName("로또 발급기가 원하는대로 로또 티켓을 발급하는지 확인") + @Test + void getAutoTickets() { + // given + LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new FixedLottoNumberGenerator()); + List stubLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6)); + LottoTicket stubLottoTicket = new LottoTicket(stubLottoNumbers); + LottoTickets expectedLottoTickets = new LottoTickets(Arrays.asList(stubLottoTicket)); + + // when + LottoTickets receivedLottoTicket = lottoTicketDispenser.getAutoTickets(1); + + // then + assertThat(receivedLottoTicket).isEqualTo(expectedLottoTickets); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java new file mode 100644 index 0000000..612d66a --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java @@ -0,0 +1,73 @@ +package com.javabom.lotto.domain.ticket; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LottoTicketTest { + + @DisplayName("티켓 생성 후 입력 번호 리스트가 제대로 나오는지 확인") + @Test + void getNumbers() { + // given + List expectedIntegers = Arrays.asList(1, 2, 3, 4, 5, 6); + List stubLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6)); + LottoTicket lottoTicket = new LottoTicket(stubLottoNumbers); + + // then + assertThat(lottoTicket.getNumbers()).isEqualTo(expectedIntegers); + } + + @DisplayName("티켓내에 특정 번호가 들어있는지 확인") + @CsvSource({"1,true", "7,false"}) + @ParameterizedTest + void isContain(int matchNumber, boolean isNumberContain) { + // given + List stubLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6)); + LottoTicket lottoTicket = new LottoTicket(stubLottoNumbers); + LottoNumber matchLottoNumber = new LottoNumber(matchNumber); + // then + assertThat(lottoTicket.isContain(matchLottoNumber)).isEqualTo(isNumberContain); + } + + @DisplayName("로또 티켓생성시 로또번호의 개수는 6개이여야 함.") + @CsvSource({"5", "7"}) + @ParameterizedTest + void validateLottoNumbersSize(int size) { + // given + List lottoNumbers = stubLottoNumbers(size); + + // then + assertThatThrownBy(() -> new LottoTicket(lottoNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("로또 티켓에 6개 숫자를 넣어야 합니다."); + } + + private List stubLottoNumbers(int size) { + ArrayList numbers = new ArrayList<>(); + for (int i = 0; i < size; i++) { + numbers.add(new LottoNumber(size)); + } + return numbers; + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactoryTest.java b/src/test/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactoryTest.java new file mode 100644 index 0000000..3af810b --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactoryTest.java @@ -0,0 +1,23 @@ +package com.javabom.lotto.domain.ticket; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class SortedLottoNumbersFactoryTest { + + @DisplayName("LottoNumber의 size가 45인지 확인") + @Test + void create() { + // given + List lottoNumbers = SortedLottoNumbersFactory.create(); + + // then + assertThat(lottoNumbers.size()).isEqualTo(45); + } + // 얘는 어떻게 테스트를 하면 좋을지 몰라서 (for문을 쓰는 것은 지양하라 하여서) + // size 로 대체했으나, 정렬된것은 어떻게 테스트를 해야하는지 모르겠습니다 (for문없이) +} \ No newline at end of file From 41e7fa3e3ddd52c0e838460cb2ab764264648c29 Mon Sep 17 00:00:00 2001 From: Malibin Date: Fri, 22 May 2020 02:43:41 +0900 Subject: [PATCH 04/13] =?UTF-8?q?[test]=20=ED=8B=B0=EC=BC=93=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=20=EB=B6=80=EB=B6=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compare/LottoBasicLuckyNumbers.java | 9 +++ .../lotto/domain/compare/LottoResults.java | 14 +++++ .../domain/compare/LottoTicketComparator.java | 1 - .../domain/ticket/LottoTicketDispenser.java | 1 - .../compare/LottoBasicLuckyNumbersTest.java | 40 +++++++++++++ .../domain/compare/LottoLuckyNumbersTest.java | 56 +++++++++++++++++++ .../lotto/domain/compare/LottoResultTest.java | 40 +++++++++++++ .../domain/compare/LottoResultsTest.java | 50 +++++++++++++++++ .../compare/LottoTicketComparatorTest.java | 45 +++++++++++++++ src/test/java/com/javabom/lotto/empty.txt | 0 10 files changed, 254 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/compare/LottoResultTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java delete mode 100644 src/test/java/com/javabom/lotto/empty.txt diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java index 780092f..0ade8c3 100644 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java @@ -7,12 +7,21 @@ public class LottoBasicLuckyNumbers { + private static final int LUCKY_LOTTO_NUM_SIZE = 6; + private final List numbers; public LottoBasicLuckyNumbers(List numbers) { + validateLottoNumbersSize(numbers); this.numbers = numbers; } + private void validateLottoNumbersSize(List numbers) { + if (numbers.size() != LUCKY_LOTTO_NUM_SIZE) { + throw new IllegalArgumentException("당첨 번호는 반드시 6개입니다."); + } + } + public List get() { return Collections.unmodifiableList(numbers); } diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java b/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java index 74457e2..77fd809 100644 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java @@ -1,6 +1,7 @@ package com.javabom.lotto.domain.compare; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; public class LottoResults { @@ -22,4 +23,17 @@ public long getTotalPrizeMoney() { .mapToLong(LottoResult::getPrice) .sum(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoResults that = (LottoResults) o; + return Objects.equals(lottoResults, that.lottoResults); + } + + @Override + public int hashCode() { + return Objects.hash(lottoResults); + } } diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java b/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java index 63cc246..1f22552 100644 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java @@ -11,7 +11,6 @@ public class LottoTicketComparator { public LottoTicketComparator(LottoLuckyNumbers luckyNumbers) { this.luckyNumbers = luckyNumbers; - System.out.println(luckyNumbers.getBonusNumber().get()); } public LottoResults getLottoResults(LottoTickets lottoTickets) { diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java index 330caf8..972b5a4 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java @@ -1,7 +1,6 @@ package com.javabom.lotto.domain.ticket; import java.util.ArrayList; -import java.util.Collections; public class LottoTicketDispenser { diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java new file mode 100644 index 0000000..cfd415c --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java @@ -0,0 +1,40 @@ +package com.javabom.lotto.domain.compare; + +import com.javabom.lotto.domain.ticket.LottoNumber; +import com.javabom.lotto.domain.ticket.LottoTicket; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class LottoBasicLuckyNumbersTest { + + @DisplayName("기본 당첨 번호의 개수는 6개이여야 함.") + @CsvSource({"5", "7"}) + @ParameterizedTest + void validateLottoNumbersSize(int size) { + // given + List lottoNumbers = stubLottoNumbers(size); + + // then + assertThatThrownBy(() -> new LottoBasicLuckyNumbers(lottoNumbers)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("당첨 번호는 반드시 6개입니다."); + } + + private List stubLottoNumbers(int size) { + ArrayList numbers = new ArrayList<>(); + for (int i = 0; i < size; i++) { + numbers.add(new LottoNumber(size)); + } + return numbers; + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java new file mode 100644 index 0000000..9c42092 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java @@ -0,0 +1,56 @@ +package com.javabom.lotto.domain.compare; + +import com.javabom.lotto.domain.ticket.LottoNumber; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class LottoLuckyNumbersTest { + + @DisplayName("객체 생성시 넣은 로또 기본 번호 제대로 나오는지 확인") + @Test + void getBasicNumbers() { + // given + List expectedLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6)); + LottoNumber bonusNumber = new LottoNumber(7); + LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(expectedLottoNumbers); + + LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); + + // then + assertThat(lottoLuckyNumbers.getBasicNumbers()).isEqualTo(expectedLottoNumbers); + } + // LottoBasicLuckyNumbers 의 get()을 테스트하지 않았는데, + // 그 상위인 LottoLuckyNumbers에서 위 메소드를 부르니 테스트를 또 할 필요가 없다고 판단하였습니다. + // 오히려 반대로 LottoBasicLuckyNumbers에서 테스트하고, 상위인 LottoLuckyNumbers에서 테스트를 하지 말아야하나요? + + @DisplayName("객체 생성시 넣은 로또 보너스 번호 제대로 나오는지 확인") + @Test + void getBonusNumber() { + // given + List stubLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6)); + LottoNumber bonusNumber = new LottoNumber(7); + LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(stubLottoNumbers); + + LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); + + // then + assertThat(lottoLuckyNumbers.getBonusNumber()).isEqualTo(bonusNumber); + } +} diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoResultTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoResultTest.java new file mode 100644 index 0000000..779c7dd --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoResultTest.java @@ -0,0 +1,40 @@ +package com.javabom.lotto.domain.compare; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LottoResultTest { + + @DisplayName("로또 번호 매치 가능 수는 0~6 사이임.") + @CsvSource({"-1", "7"}) + @ParameterizedTest + void validateMatchCount(int matchCount) { + // then + assertThatThrownBy(() -> LottoResult.find(matchCount, true)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("로또번호 매치 수는 0~6 사이입니다."); + } + + @DisplayName("로또 번호 매치수와 보너스 매치여부에 따른 로또 결과 확인") + @CsvSource({ + "6,false,FIRST_PRIZE", + "5,true,SECOND_PRIZE", + "5,false,THIRD_PRIZE", + "4,false,FOURTH_PRIZE", + "3,false,FIFTH_PRIZE", + "2,false,LOSE", + "1,false,LOSE", + "0,false,LOSE",}) + @ParameterizedTest + void find(int matchCount, boolean isBonusMatched, LottoResult expectedLottoResult) { + // given + LottoResult findLottoResult = LottoResult.find(matchCount, isBonusMatched); + + // then + assertThat(findLottoResult).isEqualTo(expectedLottoResult); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java new file mode 100644 index 0000000..4ce78ed --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java @@ -0,0 +1,50 @@ +package com.javabom.lotto.domain.compare; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static com.javabom.lotto.domain.compare.LottoResult.FIFTH_PRIZE; +import static com.javabom.lotto.domain.compare.LottoResult.FOURTH_PRIZE; +import static org.assertj.core.api.Assertions.assertThat; + +class LottoResultsTest { + + @DisplayName("원하는 로또 결과만을 담은 List를 반환하는지 확인") + @Test + void findResultsOf() { + // given + List lottoResultList = Arrays.asList( + FOURTH_PRIZE, + FOURTH_PRIZE, + FIFTH_PRIZE); + LottoResults lottoResults = new LottoResults(lottoResultList); + List expectedLottoResultList = lottoResultList.stream() + .filter(result -> result == FOURTH_PRIZE) + .collect(Collectors.toList()); + + // then + assertThat(lottoResults.findResultsOf(FOURTH_PRIZE)) + .isEqualTo(expectedLottoResultList); + } + + @Test + void getTotalPrizeMoney() { + // given + List lottoResultList = Arrays.asList( + FOURTH_PRIZE, + FOURTH_PRIZE, + FIFTH_PRIZE); + LottoResults lottoResults = new LottoResults(lottoResultList); + long expectedTotalPrizeMoney = lottoResultList.stream() + .mapToLong(LottoResult::getPrice) + .sum(); + + // then + assertThat(lottoResults.getTotalPrizeMoney()) + .isEqualTo(expectedTotalPrizeMoney); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java new file mode 100644 index 0000000..de9e8f7 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java @@ -0,0 +1,45 @@ +package com.javabom.lotto.domain.compare; + +import com.javabom.lotto.domain.ticket.LottoNumber; +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.ticket.LottoTickets; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static com.javabom.lotto.domain.compare.LottoResult.FIRST_PRIZE; +import static org.assertj.core.api.Assertions.assertThat; + +class LottoTicketComparatorTest { + + @DisplayName("로또 번호 1등 당첨일 때 테스트") + @Test + void getLottoResults() { + // given + List stubLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6)); + LottoNumber bonusNumber = new LottoNumber(7); + LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(stubLottoNumbers); + + LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); + LottoTicketComparator lottoTicketComparator = new LottoTicketComparator(lottoLuckyNumbers); + + // when + LottoTickets allMatchLottoTicket = new LottoTickets(Arrays.asList(new LottoTicket(stubLottoNumbers))); + LottoResults lottoResults = lottoTicketComparator.getLottoResults(allMatchLottoTicket); + LottoResults expectedLottoResults = new LottoResults(Arrays.asList(FIRST_PRIZE)); + + // then + assertThat(lottoResults).isEqualTo(expectedLottoResults); + } + // 여기서 각 등수별 테스트를 하려고 했는데 파라미터가 매우 많아지는 현상이 생깁니다. + // 이 클래스를 잘못짰기 때문에 테스트가 힘든구조가 되는걸까요? + // 여기서 테스트를 어떤식으로 해야할지 잘 모르겠습니다. +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/empty.txt b/src/test/java/com/javabom/lotto/empty.txt deleted file mode 100644 index e69de29..0000000 From dd38b73f77e01c3542c077eaa892a1189c343add Mon Sep 17 00:00:00 2001 From: Malibin Date: Tue, 26 May 2020 21:10:32 +0900 Subject: [PATCH 05/13] =?UTF-8?q?=EC=B6=94=EC=83=81=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=9C=EC=99=B8=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 16 ++++++------- .../compare/LottoBasicLuckyNumbers.java | 16 ++++++++++--- .../lotto/domain/compare/LottoResults.java | 7 ++++-- .../domain/ticket/LottoTicketDispenser.java | 5 +++- .../javabom/lotto/domain/ticket/Money.java | 14 +++++++++++ .../com/javabom/lotto/view/InputView.java | 24 +++++-------------- .../com/javabom/lotto/view/OutputView.java | 5 ++-- .../compare/LottoBasicLuckyNumbersTest.java | 21 ++++------------ .../domain/compare/LottoLuckyNumbersTest.java | 22 ++++++----------- .../domain/compare/LottoResultsTest.java | 2 +- .../compare/LottoTicketComparatorTest.java | 15 ++++++------ .../ticket/LottoTicketDispenserTest.java | 20 +++++++++++++++- 12 files changed, 92 insertions(+), 75 deletions(-) create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/Money.java diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 603dd0b..529a9c8 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -1,26 +1,26 @@ package com.javabom.lotto; +import com.javabom.lotto.domain.compare.LottoBasicLuckyNumbers; import com.javabom.lotto.domain.compare.LottoLuckyNumbers; import com.javabom.lotto.domain.compare.LottoResults; import com.javabom.lotto.domain.compare.LottoTicketComparator; -import com.javabom.lotto.domain.ticket.LottoTicketDispenser; -import com.javabom.lotto.domain.ticket.LottoTickets; -import com.javabom.lotto.domain.ticket.RandomLottoNumberGenerator; +import com.javabom.lotto.domain.ticket.*; import com.javabom.lotto.view.InputView; import com.javabom.lotto.view.OutputView; public class LottoApplication { public static void main(String[] args) { - long inputMoney = InputView.getMoneyToBuyTicket(); - int ticketQuantity = (int) inputMoney / 1000; + Money inputMoney = new Money(InputView.getMoneyToBuyTicket()); LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new RandomLottoNumberGenerator()); - LottoTickets lottoTickets = lottoTicketDispenser.getAutoTickets(ticketQuantity); + LottoTickets lottoTickets = lottoTicketDispenser.getAutoTickets(inputMoney); OutputView.printLottoTickets(lottoTickets); - LottoLuckyNumbers luckyNumbers = InputView.getLottoLuckyNumbers(); + LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(InputView.getLottoBasicLuckyNumbers()); + LottoNumber bonusNumber = new LottoNumber(InputView.getBonusNumber()); + LottoLuckyNumbers LuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); - LottoTicketComparator lottoTicketComparator = new LottoTicketComparator(luckyNumbers); + LottoTicketComparator lottoTicketComparator = new LottoTicketComparator(LuckyNumbers); LottoResults lottoResults = lottoTicketComparator.getLottoResults(lottoTickets); OutputView.printLottoResults(lottoResults); OutputView.printEarningRate(inputMoney, lottoResults.getTotalPrizeMoney()); diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java index 0ade8c3..5b0a6be 100644 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class LottoBasicLuckyNumbers { @@ -11,17 +12,26 @@ public class LottoBasicLuckyNumbers { private final List numbers; - public LottoBasicLuckyNumbers(List numbers) { + public LottoBasicLuckyNumbers(List numbers) { validateLottoNumbersSize(numbers); - this.numbers = numbers; + this.numbers = convertToLottoNumbers(numbers); } + // 로또 당첨번호가 로또 번호를 변환하는 코드를 가진다? 뭔가 이상해보입니다. + // 차라리 외부에서 LottoNumberConverter 라는 클래스를 만든뒤, 거기에서 List를 반환받는게 + // 좀더 나아보일까요? - private void validateLottoNumbersSize(List numbers) { + private void validateLottoNumbersSize(List numbers) { if (numbers.size() != LUCKY_LOTTO_NUM_SIZE) { throw new IllegalArgumentException("당첨 번호는 반드시 6개입니다."); } } + private List convertToLottoNumbers(List numbers) { + return numbers.stream() + .map(LottoNumber::new) + .collect(Collectors.toList()); + } + public List get() { return Collections.unmodifiableList(numbers); } diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java b/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java index 77fd809..c50436f 100644 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java +++ b/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java @@ -1,5 +1,7 @@ package com.javabom.lotto.domain.compare; +import com.javabom.lotto.domain.ticket.Money; + import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -18,10 +20,11 @@ public List findResultsOf(LottoResult lottoResult) { .collect(Collectors.toList()); } - public long getTotalPrizeMoney() { - return lottoResults.stream() + public Money getTotalPrizeMoney() { + long sum = lottoResults.stream() .mapToLong(LottoResult::getPrice) .sum(); + return new Money(sum); } @Override diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java index 972b5a4..7cd0193 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java @@ -4,13 +4,16 @@ public class LottoTicketDispenser { + private static final int LOTTO_TICKET_PRICE = 1_000; + private final LottoNumberGenerator lottoNumberGenerator; public LottoTicketDispenser(LottoNumberGenerator lottoNumberGenerator) { this.lottoNumberGenerator = lottoNumberGenerator; } - public LottoTickets getAutoTickets(int quantity) { + public LottoTickets getAutoTickets(Money inputMoney) { + int quantity = (int) inputMoney.get() / LOTTO_TICKET_PRICE; ArrayList tickets = new ArrayList<>(); for (int i = 0; i < quantity; i++) { tickets.add(new LottoTicket(lottoNumberGenerator.getLottoNumbers())); diff --git a/src/main/java/com/javabom/lotto/domain/ticket/Money.java b/src/main/java/com/javabom/lotto/domain/ticket/Money.java new file mode 100644 index 0000000..e7c28af --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/Money.java @@ -0,0 +1,14 @@ +package com.javabom.lotto.domain.ticket; + +public class Money { + + private final long money; + + public Money(long money) { + this.money = money; + } + + public long get() { + return money; + } +} diff --git a/src/main/java/com/javabom/lotto/view/InputView.java b/src/main/java/com/javabom/lotto/view/InputView.java index 652cff2..6ecf6b4 100644 --- a/src/main/java/com/javabom/lotto/view/InputView.java +++ b/src/main/java/com/javabom/lotto/view/InputView.java @@ -1,9 +1,5 @@ package com.javabom.lotto.view; -import com.javabom.lotto.domain.compare.LottoBasicLuckyNumbers; -import com.javabom.lotto.domain.compare.LottoLuckyNumbers; -import com.javabom.lotto.domain.ticket.LottoNumber; - import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -17,29 +13,21 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); - public static long getMoneyToBuyTicket() { + public static int getMoneyToBuyTicket() { printLineOf(NOTICE_INPUT_MONEY); - return Long.parseLong(scanner.nextLine()); - } - - public static LottoLuckyNumbers getLottoLuckyNumbers() { - LottoBasicLuckyNumbers basicLuckyNumbers = getLottoBasicLuckyNumbers(); - LottoNumber bonusNumber = getBonusNumber(); - return new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); + return Integer.parseInt(scanner.nextLine()); } - private static LottoBasicLuckyNumbers getLottoBasicLuckyNumbers() { + public static List getLottoBasicLuckyNumbers() { printLineOf(NOTICE_INPUT_BASIC_LUCKY_NUMBER); - List numbers = Arrays.stream(scanner.nextLine().split(",")) + return Arrays.stream(scanner.nextLine().split(",")) .map(Integer::parseInt) - .map(LottoNumber::new) .collect(Collectors.toList()); - return new LottoBasicLuckyNumbers(numbers); } - private static LottoNumber getBonusNumber() { + public static int getBonusNumber() { printLineOf(NOTICE_INPUT_BONUS_NUMBER); - return new LottoNumber(scanner.nextInt()); + return scanner.nextInt(); } private static void printLineOf(String string) { diff --git a/src/main/java/com/javabom/lotto/view/OutputView.java b/src/main/java/com/javabom/lotto/view/OutputView.java index 536d370..9dbdb0d 100644 --- a/src/main/java/com/javabom/lotto/view/OutputView.java +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -4,6 +4,7 @@ import com.javabom.lotto.domain.compare.LottoResults; import com.javabom.lotto.domain.ticket.LottoTicket; import com.javabom.lotto.domain.ticket.LottoTickets; +import com.javabom.lotto.domain.ticket.Money; import java.util.stream.Collectors; @@ -57,8 +58,8 @@ private static void printLottoResult(LottoResult result, long resultSize) { printLineOf(stringBuilder.toString()); } - public static void printEarningRate(long spendMoney, long earnMoney) { - double rate = (double) earnMoney / spendMoney * 100; + public static void printEarningRate(Money spendMoney, Money earnMoney) { + double rate = (double) earnMoney.get() / spendMoney.get() * 100; printLineOf(String.format(NOTICE_EARNING_RATE, (int) rate)); } diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java index cfd415c..5859566 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java @@ -1,19 +1,14 @@ package com.javabom.lotto.domain.compare; -import com.javabom.lotto.domain.ticket.LottoNumber; -import com.javabom.lotto.domain.ticket.LottoTicket; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; -import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; class LottoBasicLuckyNumbersTest { @@ -22,19 +17,13 @@ class LottoBasicLuckyNumbersTest { @ParameterizedTest void validateLottoNumbersSize(int size) { // given - List lottoNumbers = stubLottoNumbers(size); + List lottoNumbers = IntStream.range(0, size) + .boxed() + .collect(Collectors.toList()); // then assertThatThrownBy(() -> new LottoBasicLuckyNumbers(lottoNumbers)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("당첨 번호는 반드시 6개입니다."); } - - private List stubLottoNumbers(int size) { - ArrayList numbers = new ArrayList<>(); - for (int i = 0; i < size; i++) { - numbers.add(new LottoNumber(size)); - } - return numbers; - } } \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java index 9c42092..34f6aa1 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -15,15 +16,12 @@ class LottoLuckyNumbersTest { @Test void getBasicNumbers() { // given - List expectedLottoNumbers = Arrays.asList( - new LottoNumber(1), - new LottoNumber(2), - new LottoNumber(3), - new LottoNumber(4), - new LottoNumber(5), - new LottoNumber(6)); + List stubLottoNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); + List expectedLottoNumbers = stubLottoNumbers.stream() + .map(LottoNumber::new) + .collect(Collectors.toList()); LottoNumber bonusNumber = new LottoNumber(7); - LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(expectedLottoNumbers); + LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(stubLottoNumbers); LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); @@ -38,13 +36,7 @@ void getBasicNumbers() { @Test void getBonusNumber() { // given - List stubLottoNumbers = Arrays.asList( - new LottoNumber(1), - new LottoNumber(2), - new LottoNumber(3), - new LottoNumber(4), - new LottoNumber(5), - new LottoNumber(6)); + List stubLottoNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); LottoNumber bonusNumber = new LottoNumber(7); LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(stubLottoNumbers); diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java index 4ce78ed..f5af900 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java @@ -44,7 +44,7 @@ void getTotalPrizeMoney() { .sum(); // then - assertThat(lottoResults.getTotalPrizeMoney()) + assertThat(lottoResults.getTotalPrizeMoney().get()) .isEqualTo(expectedTotalPrizeMoney); } } \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java index de9e8f7..5487487 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java @@ -8,6 +8,7 @@ import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import static com.javabom.lotto.domain.compare.LottoResult.FIRST_PRIZE; import static org.assertj.core.api.Assertions.assertThat; @@ -18,15 +19,13 @@ class LottoTicketComparatorTest { @Test void getLottoResults() { // given - List stubLottoNumbers = Arrays.asList( - new LottoNumber(1), - new LottoNumber(2), - new LottoNumber(3), - new LottoNumber(4), - new LottoNumber(5), - new LottoNumber(6)); + List LottoIntegerNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); + List stubLottoNumbers = LottoIntegerNumbers.stream() + .map(LottoNumber::new) + .collect(Collectors.toList()); + LottoNumber bonusNumber = new LottoNumber(7); - LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(stubLottoNumbers); + LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(LottoIntegerNumbers); LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); LottoTicketComparator lottoTicketComparator = new LottoTicketComparator(lottoLuckyNumbers); diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java index b7ee90f..66f62df 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java @@ -26,9 +26,27 @@ void getAutoTickets() { LottoTickets expectedLottoTickets = new LottoTickets(Arrays.asList(stubLottoTicket)); // when - LottoTickets receivedLottoTicket = lottoTicketDispenser.getAutoTickets(1); + Money money = new Money(1_000); + LottoTickets receivedLottoTicket = lottoTicketDispenser.getAutoTickets(money); // then assertThat(receivedLottoTicket).isEqualTo(expectedLottoTickets); } + + @DisplayName("로또 발급기가 원하는 개수의 티켓을 뽑아내는지 확인") + @Test + void name() { + // given + LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new RandomLottoNumberGenerator()); + + // when + int expectedTicketQuantity = 1; + Money money = new Money(1_000 * expectedTicketQuantity); + LottoTickets lottoTickets = lottoTicketDispenser.getAutoTickets(money); + + // then + assertThat(lottoTickets.get().size()).isEqualTo(expectedTicketQuantity); + } + // RandomLottoNumberGenerator 테스트 커버리지 0인걸 통과하려고 추가한 테스트입니다.. + // 의미가 있는 테스트인지 솔직히 모르겠습니다. } \ No newline at end of file From 6eee1202d8c8dd7e492777546033a5d2eb57655e Mon Sep 17 00:00:00 2001 From: Malibin Date: Tue, 26 May 2020 21:53:25 +0900 Subject: [PATCH 06/13] =?UTF-8?q?=EC=B6=94=EC=83=81=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=ED=95=98=EB=8B=A4=EA=B0=80=20=EB=A7=89=ED=9E=98..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javabom/lotto/domain/LottoNumbers.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/com/javabom/lotto/domain/LottoNumbers.java diff --git a/src/main/java/com/javabom/lotto/domain/LottoNumbers.java b/src/main/java/com/javabom/lotto/domain/LottoNumbers.java new file mode 100644 index 0000000..d228dd1 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/LottoNumbers.java @@ -0,0 +1,26 @@ +package com.javabom.lotto.domain; + +import com.javabom.lotto.domain.compare.LottoResult; +import com.javabom.lotto.domain.compare.LottoResults; +import com.javabom.lotto.domain.ticket.LottoNumber; + +import java.util.List; + +abstract public class LottoNumbers { + protected final List numbers; + + public LottoNumbers(List numbers) { + validateLottoNumbers(numbers); + this.numbers = numbers; + } + + protected abstract void validateLottoNumbers(List numbers); + + public LottoResults compare(LottoNumbers lottoNumbers) { + return null; + } + + private LottoResult getLottoResult() { + return null; + } +} From bfb1a47fa38d314e869a24b324a64e02aa9f26ab Mon Sep 17 00:00:00 2001 From: Malibin Date: Tue, 26 May 2020 22:35:10 +0900 Subject: [PATCH 07/13] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javabom/lotto/domain/LottoNumbers.java | 26 ------------ .../compare/LottoBasicLuckyNumbersTest.java | 2 +- .../compare/LottoTicketComparatorTest.java | 6 +-- .../ticket/FixedLottoNumberGenerator.java | 14 +++---- .../ticket/LottoTicketDispenserTest.java | 13 +++--- .../lotto/domain/ticket/LottoTicketTest.java | 40 +++++++------------ 6 files changed, 31 insertions(+), 70 deletions(-) delete mode 100644 src/main/java/com/javabom/lotto/domain/LottoNumbers.java diff --git a/src/main/java/com/javabom/lotto/domain/LottoNumbers.java b/src/main/java/com/javabom/lotto/domain/LottoNumbers.java deleted file mode 100644 index d228dd1..0000000 --- a/src/main/java/com/javabom/lotto/domain/LottoNumbers.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.javabom.lotto.domain; - -import com.javabom.lotto.domain.compare.LottoResult; -import com.javabom.lotto.domain.compare.LottoResults; -import com.javabom.lotto.domain.ticket.LottoNumber; - -import java.util.List; - -abstract public class LottoNumbers { - protected final List numbers; - - public LottoNumbers(List numbers) { - validateLottoNumbers(numbers); - this.numbers = numbers; - } - - protected abstract void validateLottoNumbers(List numbers); - - public LottoResults compare(LottoNumbers lottoNumbers) { - return null; - } - - private LottoResult getLottoResult() { - return null; - } -} diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java index 5859566..d5899fe 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java @@ -17,7 +17,7 @@ class LottoBasicLuckyNumbersTest { @ParameterizedTest void validateLottoNumbersSize(int size) { // given - List lottoNumbers = IntStream.range(0, size) + List lottoNumbers = IntStream.rangeClosed(1, size) .boxed() .collect(Collectors.toList()); diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java index 5487487..2052bae 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java +++ b/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java @@ -19,13 +19,13 @@ class LottoTicketComparatorTest { @Test void getLottoResults() { // given - List LottoIntegerNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); - List stubLottoNumbers = LottoIntegerNumbers.stream() + List lottoIntegerNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); + List stubLottoNumbers = lottoIntegerNumbers.stream() .map(LottoNumber::new) .collect(Collectors.toList()); LottoNumber bonusNumber = new LottoNumber(7); - LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(LottoIntegerNumbers); + LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(lottoIntegerNumbers); LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); LottoTicketComparator lottoTicketComparator = new LottoTicketComparator(lottoLuckyNumbers); diff --git a/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java b/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java index 6740c41..7cb1d7e 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java @@ -1,17 +1,15 @@ package com.javabom.lotto.domain.ticket; -import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class FixedLottoNumberGenerator implements LottoNumberGenerator { @Override public List getLottoNumbers() { - return Arrays.asList( - new LottoNumber(1), - new LottoNumber(2), - new LottoNumber(3), - new LottoNumber(4), - new LottoNumber(5), - new LottoNumber(6)); + return IntStream.rangeClosed(1, 6) + .boxed() + .map(LottoNumber::new) + .collect(Collectors.toList()); } } diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java index 66f62df..c5afa78 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java @@ -5,6 +5,8 @@ import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; @@ -15,13 +17,10 @@ class LottoTicketDispenserTest { void getAutoTickets() { // given LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new FixedLottoNumberGenerator()); - List stubLottoNumbers = Arrays.asList( - new LottoNumber(1), - new LottoNumber(2), - new LottoNumber(3), - new LottoNumber(4), - new LottoNumber(5), - new LottoNumber(6)); + List stubLottoNumbers = IntStream.rangeClosed(1, 6) + .boxed() + .map(LottoNumber::new) + .collect(Collectors.toList()); LottoTicket stubLottoTicket = new LottoTicket(stubLottoNumbers); LottoTickets expectedLottoTickets = new LottoTickets(Arrays.asList(stubLottoTicket)); diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java index 612d66a..0c54f4e 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java @@ -8,6 +8,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -19,13 +21,9 @@ class LottoTicketTest { void getNumbers() { // given List expectedIntegers = Arrays.asList(1, 2, 3, 4, 5, 6); - List stubLottoNumbers = Arrays.asList( - new LottoNumber(1), - new LottoNumber(2), - new LottoNumber(3), - new LottoNumber(4), - new LottoNumber(5), - new LottoNumber(6)); + List stubLottoNumbers = expectedIntegers.stream() + .map(LottoNumber::new) + .collect(Collectors.toList()); LottoTicket lottoTicket = new LottoTicket(stubLottoNumbers); // then @@ -37,13 +35,11 @@ void getNumbers() { @ParameterizedTest void isContain(int matchNumber, boolean isNumberContain) { // given - List stubLottoNumbers = Arrays.asList( - new LottoNumber(1), - new LottoNumber(2), - new LottoNumber(3), - new LottoNumber(4), - new LottoNumber(5), - new LottoNumber(6)); + List stubLottoNumbers = IntStream.rangeClosed(1, 6) + .boxed() + .map(LottoNumber::new) + .collect(Collectors.toList()); + LottoTicket lottoTicket = new LottoTicket(stubLottoNumbers); LottoNumber matchLottoNumber = new LottoNumber(matchNumber); // then @@ -55,19 +51,13 @@ void isContain(int matchNumber, boolean isNumberContain) { @ParameterizedTest void validateLottoNumbersSize(int size) { // given - List lottoNumbers = stubLottoNumbers(size); - + List stubLottoNumbers = IntStream.rangeClosed(1, size) + .boxed() + .map(LottoNumber::new) + .collect(Collectors.toList()); // then - assertThatThrownBy(() -> new LottoTicket(lottoNumbers)) + assertThatThrownBy(() -> new LottoTicket(stubLottoNumbers)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("로또 티켓에 6개 숫자를 넣어야 합니다."); } - - private List stubLottoNumbers(int size) { - ArrayList numbers = new ArrayList<>(); - for (int i = 0; i < size; i++) { - numbers.add(new LottoNumber(size)); - } - return numbers; - } } \ No newline at end of file From 40b23691f30f31e8ede149af21a562a69bb45a0d Mon Sep 17 00:00:00 2001 From: Malibin Date: Fri, 29 May 2020 15:57:59 +0900 Subject: [PATCH 08/13] =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20(LottoNumbers=20=EC=B6=94=EC=83=81=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 10 ++-- .../javabom/lotto/domain/LottoNumbers.java | 24 ++++++++++ .../compare/LottoBasicLuckyNumbers.java | 38 --------------- .../domain/compare/LottoLuckyNumbers.java | 29 ----------- .../domain/compare/LottoTicketComparator.java | 36 -------------- .../results/LottoBasicLuckyNumbers.java | 29 +++++++++++ .../domain/results/LottoLuckyNumbers.java | 33 +++++++++++++ .../{compare => results}/LottoResult.java | 4 +- .../{compare => results}/LottoResults.java | 2 +- .../lotto/domain/ticket/LottoNumber.java | 2 +- .../lotto/domain/ticket/LottoTicket.java | 13 ++--- .../domain/ticket/LottoTicketDispenser.java | 5 +- .../javabom/lotto/domain/ticket/Money.java | 30 +++++++++++- .../ticket/RandomLottoNumberGenerator.java | 22 ++++++--- .../ticket/SortedLottoNumbersFactory.java | 23 --------- .../com/javabom/lotto/view/OutputView.java | 10 ++-- .../domain/compare/LottoLuckyNumbersTest.java | 48 ------------------- .../LottoBasicLuckyNumbersTest.java | 2 +- .../LottoLuckyNumbersTest.java} | 30 ++++++------ .../{compare => results}/LottoResultTest.java | 4 +- .../LottoResultsTest.java | 24 ++++------ .../ticket/FixedLottoNumberGenerator.java | 15 ------ .../lotto/domain/ticket/LottoNumberTest.java | 2 +- .../ticket/LottoTicketDispenserTest.java | 18 +++---- .../lotto/domain/ticket/LottoTicketTest.java | 23 ++++++--- .../lotto/domain/ticket/MoneyTest.java | 30 ++++++++++++ .../ticket/SortedLottoNumbersFactoryTest.java | 23 --------- 27 files changed, 238 insertions(+), 291 deletions(-) create mode 100644 src/main/java/com/javabom/lotto/domain/LottoNumbers.java delete mode 100644 src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java delete mode 100644 src/main/java/com/javabom/lotto/domain/compare/LottoLuckyNumbers.java delete mode 100644 src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java create mode 100644 src/main/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java rename src/main/java/com/javabom/lotto/domain/{compare => results}/LottoResult.java (94%) rename src/main/java/com/javabom/lotto/domain/{compare => results}/LottoResults.java (96%) delete mode 100644 src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactory.java delete mode 100644 src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java rename src/test/java/com/javabom/lotto/domain/{compare => results}/LottoBasicLuckyNumbersTest.java (95%) rename src/test/java/com/javabom/lotto/domain/{compare/LottoTicketComparatorTest.java => results/LottoLuckyNumbersTest.java} (50%) rename src/test/java/com/javabom/lotto/domain/{compare => results}/LottoResultTest.java (90%) rename src/test/java/com/javabom/lotto/domain/{compare => results}/LottoResultsTest.java (59%) delete mode 100644 src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/MoneyTest.java delete mode 100644 src/test/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactoryTest.java diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 529a9c8..07ecb0d 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -1,9 +1,8 @@ package com.javabom.lotto; -import com.javabom.lotto.domain.compare.LottoBasicLuckyNumbers; -import com.javabom.lotto.domain.compare.LottoLuckyNumbers; -import com.javabom.lotto.domain.compare.LottoResults; -import com.javabom.lotto.domain.compare.LottoTicketComparator; +import com.javabom.lotto.domain.results.LottoBasicLuckyNumbers; +import com.javabom.lotto.domain.results.LottoLuckyNumbers; +import com.javabom.lotto.domain.results.LottoResults; import com.javabom.lotto.domain.ticket.*; import com.javabom.lotto.view.InputView; import com.javabom.lotto.view.OutputView; @@ -20,8 +19,7 @@ public static void main(String[] args) { LottoNumber bonusNumber = new LottoNumber(InputView.getBonusNumber()); LottoLuckyNumbers LuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); - LottoTicketComparator lottoTicketComparator = new LottoTicketComparator(LuckyNumbers); - LottoResults lottoResults = lottoTicketComparator.getLottoResults(lottoTickets); + LottoResults lottoResults = LuckyNumbers.getLottoResults(lottoTickets); OutputView.printLottoResults(lottoResults); OutputView.printEarningRate(inputMoney, lottoResults.getTotalPrizeMoney()); } diff --git a/src/main/java/com/javabom/lotto/domain/LottoNumbers.java b/src/main/java/com/javabom/lotto/domain/LottoNumbers.java new file mode 100644 index 0000000..17a27d0 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/LottoNumbers.java @@ -0,0 +1,24 @@ +package com.javabom.lotto.domain; + +import com.javabom.lotto.domain.ticket.LottoNumber; + +import java.util.List; + +abstract public class LottoNumbers { + + protected final List numbers; + + public LottoNumbers(List numbers) { + validateLottoNumbers(numbers); + this.numbers = numbers; + } + + protected abstract void validateLottoNumbers(List numbers); + + public int countMatchingNumbers(LottoNumbers lottoNumbers) { + return (int) lottoNumbers.numbers.stream() + .map(this.numbers::contains) + .filter(isContain -> isContain) + .count(); + } +} \ No newline at end of file diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java deleted file mode 100644 index 5b0a6be..0000000 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbers.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.javabom.lotto.domain.compare; - -import com.javabom.lotto.domain.ticket.LottoNumber; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -public class LottoBasicLuckyNumbers { - - private static final int LUCKY_LOTTO_NUM_SIZE = 6; - - private final List numbers; - - public LottoBasicLuckyNumbers(List numbers) { - validateLottoNumbersSize(numbers); - this.numbers = convertToLottoNumbers(numbers); - } - // 로또 당첨번호가 로또 번호를 변환하는 코드를 가진다? 뭔가 이상해보입니다. - // 차라리 외부에서 LottoNumberConverter 라는 클래스를 만든뒤, 거기에서 List를 반환받는게 - // 좀더 나아보일까요? - - private void validateLottoNumbersSize(List numbers) { - if (numbers.size() != LUCKY_LOTTO_NUM_SIZE) { - throw new IllegalArgumentException("당첨 번호는 반드시 6개입니다."); - } - } - - private List convertToLottoNumbers(List numbers) { - return numbers.stream() - .map(LottoNumber::new) - .collect(Collectors.toList()); - } - - public List get() { - return Collections.unmodifiableList(numbers); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/compare/LottoLuckyNumbers.java deleted file mode 100644 index 024562b..0000000 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoLuckyNumbers.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.javabom.lotto.domain.compare; - -import com.javabom.lotto.domain.ticket.LottoNumber; - -import java.util.Collections; -import java.util.List; - -public class LottoLuckyNumbers { - - private final LottoBasicLuckyNumbers basicNumbers; - private final LottoNumber bonusNumber; - - public LottoLuckyNumbers(LottoBasicLuckyNumbers basicNumbers, LottoNumber bonusNumber) { - this.basicNumbers = basicNumbers; - this.bonusNumber = bonusNumber; - } - - // 이미 basicNumbers.get() 내부에서 unmodifiableList로 감싸서 던져주는것을 - // 한 번더 감싸는 것이 안전하다고 판단하였습니다. - public List getBasicNumbers() { - return Collections.unmodifiableList(basicNumbers.get()); - } - - // 이 LottoNumber는 불변객체라고 생각해서 그냥 반환하였는데, - // LottoNumber 내부에 copy해주는 메소드를 추가하여 복사본을 반환하는게 더 나은가요? - public LottoNumber getBonusNumber() { - return bonusNumber; - } -} diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java b/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java deleted file mode 100644 index 1f22552..0000000 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoTicketComparator.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.javabom.lotto.domain.compare; - -import com.javabom.lotto.domain.ticket.LottoTicket; -import com.javabom.lotto.domain.ticket.LottoTickets; - -import java.util.ArrayList; - -public class LottoTicketComparator { - - private final LottoLuckyNumbers luckyNumbers; - - public LottoTicketComparator(LottoLuckyNumbers luckyNumbers) { - this.luckyNumbers = luckyNumbers; - } - - public LottoResults getLottoResults(LottoTickets lottoTickets) { - ArrayList lottoResults = new ArrayList<>(); - for (LottoTicket ticket : lottoTickets.get()) { - lottoResults.add(getLottoResult(ticket)); - } - return new LottoResults(lottoResults); - } - - private LottoResult getLottoResult(LottoTicket lottoTicket) { - int count = countMatchingNumbers(lottoTicket); - boolean isBonusMatched = lottoTicket.isContain(luckyNumbers.getBonusNumber()); - return LottoResult.find(count, isBonusMatched); - } - - private int countMatchingNumbers(LottoTicket lottoTicket) { - return (int) luckyNumbers.getBasicNumbers().stream() - .map(lottoTicket::isContain) - .filter(isContain -> isContain) - .count(); - } -} diff --git a/src/main/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbers.java new file mode 100644 index 0000000..1e1edb9 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbers.java @@ -0,0 +1,29 @@ +package com.javabom.lotto.domain.results; + +import com.javabom.lotto.domain.LottoNumbers; +import com.javabom.lotto.domain.ticket.LottoNumber; + +import java.util.List; +import java.util.stream.Collectors; + +public class LottoBasicLuckyNumbers extends LottoNumbers { + + private static final int LUCKY_LOTTO_NUM_SIZE = 6; + + public LottoBasicLuckyNumbers(List numbers) { + super(convertToLottoNumbers(numbers)); + } + + private static List convertToLottoNumbers(List numbers) { + return numbers.stream() + .map(LottoNumber::new) + .collect(Collectors.toList()); + } + + @Override + protected void validateLottoNumbers(List numbers) { + if (numbers.size() != LUCKY_LOTTO_NUM_SIZE) { + throw new IllegalArgumentException("당첨 번호는 반드시 6개입니다."); + } + } +} diff --git a/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java new file mode 100644 index 0000000..890bd18 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java @@ -0,0 +1,33 @@ +package com.javabom.lotto.domain.results; + +import com.javabom.lotto.domain.ticket.LottoNumber; +import com.javabom.lotto.domain.ticket.LottoTicket; +import com.javabom.lotto.domain.ticket.LottoTickets; + +import java.util.ArrayList; +import java.util.List; + +public class LottoLuckyNumbers { + + private final LottoBasicLuckyNumbers basicLuckyNumbers; + private final LottoNumber bonusNumber; + + public LottoLuckyNumbers(LottoBasicLuckyNumbers basicLuckyNumbers, LottoNumber bonusNumber) { + this.basicLuckyNumbers = basicLuckyNumbers; + this.bonusNumber = bonusNumber; + } + + public LottoResults getLottoResults(LottoTickets lottoTickets) { + List lottoResults = new ArrayList<>(); + for (LottoTicket ticket : lottoTickets.get()) { + lottoResults.add(getLottoResult(ticket)); + } + return new LottoResults(lottoResults); + } + + private LottoResult getLottoResult(LottoTicket lottoTicket) { + int matchCount = basicLuckyNumbers.countMatchingNumbers(lottoTicket); + boolean isBonusMatched = lottoTicket.isContain(bonusNumber); + return LottoResult.find(matchCount, isBonusMatched); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoResult.java b/src/main/java/com/javabom/lotto/domain/results/LottoResult.java similarity index 94% rename from src/main/java/com/javabom/lotto/domain/compare/LottoResult.java rename to src/main/java/com/javabom/lotto/domain/results/LottoResult.java index b357b50..2ec644c 100644 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoResult.java +++ b/src/main/java/com/javabom/lotto/domain/results/LottoResult.java @@ -1,4 +1,4 @@ -package com.javabom.lotto.domain.compare; +package com.javabom.lotto.domain.results; import java.util.Arrays; import java.util.List; @@ -34,7 +34,7 @@ public static LottoResult find(int matchCount, boolean isBonusMatched) { private static void validateMatchCount(int matchCount) { if (matchCount < 0 || matchCount > 6) { - throw new IllegalArgumentException("로또번호 매치 수는 0~6 사이입니다."); + throw new IllegalArgumentException("로또번호 매치 수는 0~6 이외일 수 없습니다."); } } diff --git a/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java b/src/main/java/com/javabom/lotto/domain/results/LottoResults.java similarity index 96% rename from src/main/java/com/javabom/lotto/domain/compare/LottoResults.java rename to src/main/java/com/javabom/lotto/domain/results/LottoResults.java index c50436f..d8f9ad9 100644 --- a/src/main/java/com/javabom/lotto/domain/compare/LottoResults.java +++ b/src/main/java/com/javabom/lotto/domain/results/LottoResults.java @@ -1,4 +1,4 @@ -package com.javabom.lotto.domain.compare; +package com.javabom.lotto.domain.results; import com.javabom.lotto.domain.ticket.Money; diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java index 38e44bc..eaac043 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java @@ -15,7 +15,7 @@ public LottoNumber(int number) { private void validateNumber(int number) { if (number < MIN_LOTTO_NUM || number > MAX_LOTTO_NUM) { - throw new IllegalArgumentException("로또 번호는 1~45 입니다."); + throw new IllegalArgumentException("로또 번호는 1~45이외 일 수 없습니다."); } } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java index ec87c85..7eebe53 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java @@ -1,21 +1,21 @@ package com.javabom.lotto.domain.ticket; +import com.javabom.lotto.domain.LottoNumbers; + import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -public class LottoTicket { +public class LottoTicket extends LottoNumbers { private static final int LOTTO_NUM_PICK_SIZE = 6; - private final List numbers; - public LottoTicket(List numbers) { - validateListSize(numbers); - this.numbers = numbers; + super(numbers); } - private void validateListSize(List numbers) { + @Override + protected void validateLottoNumbers(List numbers) { if (numbers.size() != LOTTO_NUM_PICK_SIZE) { throw new IllegalArgumentException("로또 티켓에 6개 숫자를 넣어야 합니다."); } @@ -43,4 +43,5 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(numbers); } + } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java index 7cd0193..94f4752 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java @@ -1,6 +1,7 @@ package com.javabom.lotto.domain.ticket; import java.util.ArrayList; +import java.util.List; public class LottoTicketDispenser { @@ -13,8 +14,8 @@ public LottoTicketDispenser(LottoNumberGenerator lottoNumberGenerator) { } public LottoTickets getAutoTickets(Money inputMoney) { - int quantity = (int) inputMoney.get() / LOTTO_TICKET_PRICE; - ArrayList tickets = new ArrayList<>(); + int quantity = inputMoney.calculateQuantityPer(LOTTO_TICKET_PRICE); + List tickets = new ArrayList<>(); for (int i = 0; i < quantity; i++) { tickets.add(new LottoTicket(lottoNumberGenerator.getLottoNumbers())); } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/Money.java b/src/main/java/com/javabom/lotto/domain/ticket/Money.java index e7c28af..92bd830 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/Money.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/Money.java @@ -1,14 +1,40 @@ package com.javabom.lotto.domain.ticket; +import java.util.Objects; + public class Money { private final long money; public Money(long money) { + validateMoney(money); this.money = money; } - public long get() { - return money; + private void validateMoney(long money) { + if (money < 0) { + throw new IllegalArgumentException("돈은 음수일 수 없습니다."); + } + } + + public int calculateQuantityPer(int price) { + return (int) money / price; + } + + public double calculateRatioOf(Money input) { + return (double) input.money / this.money * 100; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Money money1 = (Money) o; + return money == money1.money; + } + + @Override + public int hashCode() { + return Objects.hash(money); } } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java b/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java index 26772dc..0313da9 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java @@ -1,20 +1,30 @@ package com.javabom.lotto.domain.ticket; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class RandomLottoNumberGenerator implements LottoNumberGenerator { - // 여기서 LottoTickets.LOTTO_NUM_PICK_SIZE 변수를 가져와서 사용하려했으나, - // 의존성문제가 걸려서 다시 선언하여 사용하였습니다. - // 제 생각에는 숫자 선택 개수가 만약 바뀐다면, 여기서 꺼내쓰는게 맞다고 생각하지만 - // 로또의 경우에는 그럴 일이 없다고 판단하여 의존성때문에 재선언하여 사용하였습니다. - // 이부분 리뷰 바랍니다. private static final int LOTTO_NUM_PICK_SIZE = 6; + private final List sortedLottoNumbers; + + public RandomLottoNumberGenerator() { + sortedLottoNumbers = createSortedLottoNumbers(); + } + + private List createSortedLottoNumbers() { + return IntStream.rangeClosed(LottoNumber.MIN_LOTTO_NUM, LottoNumber.MAX_LOTTO_NUM) + .mapToObj(LottoNumber::new) + .collect(Collectors.toList()); + } + @Override public List getLottoNumbers() { - List numbers = SortedLottoNumbersFactory.create(); + List numbers = new ArrayList<>(sortedLottoNumbers); Collections.shuffle(numbers); return numbers.subList(0, LOTTO_NUM_PICK_SIZE); } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactory.java b/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactory.java deleted file mode 100644 index ba3cc22..0000000 --- a/src/main/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.javabom.lotto.domain.ticket; - -import java.util.ArrayList; -import java.util.List; - -public class SortedLottoNumbersFactory { - - public static List create() { - ArrayList numbers = new ArrayList<>(); - for (int number = LottoNumber.MIN_LOTTO_NUM; number <= LottoNumber.MAX_LOTTO_NUM; number++) { - numbers.add(new LottoNumber(number)); - } - return numbers; - } -} - -// 처음엔 static 하나도 없는 일급 컬렉션으로 설계. -// 생성자로 1~45 들어가있는 List를 한 번 생성한 뒤 필요할때마다 복사본을 넘기게 설계. -// 한 번만 만들어내고 그다음부턴 복사본을 넘긴다. - -// 지금은 부를 때 마다 새로 만들어준다. - -// 무엇이 더 좋은지 모르겠습니다. \ No newline at end of file diff --git a/src/main/java/com/javabom/lotto/view/OutputView.java b/src/main/java/com/javabom/lotto/view/OutputView.java index 9dbdb0d..b0ca68e 100644 --- a/src/main/java/com/javabom/lotto/view/OutputView.java +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -1,7 +1,7 @@ package com.javabom.lotto.view; -import com.javabom.lotto.domain.compare.LottoResult; -import com.javabom.lotto.domain.compare.LottoResults; +import com.javabom.lotto.domain.results.LottoResult; +import com.javabom.lotto.domain.results.LottoResults; import com.javabom.lotto.domain.ticket.LottoTicket; import com.javabom.lotto.domain.ticket.LottoTickets; import com.javabom.lotto.domain.ticket.Money; @@ -16,7 +16,7 @@ public class OutputView { private static final String NOTICE_PRIZE_MONEY = "(%d원)"; private static final String NOTICE_MATCH_RESULT_QUANTITY = " - %d개"; private static final String NOTICE_MATCH_BONUS = "보너스 볼 일치"; - private static final String NOTICE_EARNING_RATE = "총 수익률은 %d%% 입니다."; + private static final String NOTICE_EARNING_RATE = "총 수익률은 %.2f%% 입니다."; public static void printLottoTickets(LottoTickets lottoTickets) { printLineOf(lottoTickets.get().size() + NOTICE_BUY_COMPLETE); @@ -59,8 +59,8 @@ private static void printLottoResult(LottoResult result, long resultSize) { } public static void printEarningRate(Money spendMoney, Money earnMoney) { - double rate = (double) earnMoney.get() / spendMoney.get() * 100; - printLineOf(String.format(NOTICE_EARNING_RATE, (int) rate)); + double rate = spendMoney.calculateRatioOf(earnMoney); + printLineOf(String.format(NOTICE_EARNING_RATE, rate)); } private static void printLineOf(String string) { diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java deleted file mode 100644 index 34f6aa1..0000000 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoLuckyNumbersTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.javabom.lotto.domain.compare; - -import com.javabom.lotto.domain.ticket.LottoNumber; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; - -class LottoLuckyNumbersTest { - - @DisplayName("객체 생성시 넣은 로또 기본 번호 제대로 나오는지 확인") - @Test - void getBasicNumbers() { - // given - List stubLottoNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); - List expectedLottoNumbers = stubLottoNumbers.stream() - .map(LottoNumber::new) - .collect(Collectors.toList()); - LottoNumber bonusNumber = new LottoNumber(7); - LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(stubLottoNumbers); - - LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); - - // then - assertThat(lottoLuckyNumbers.getBasicNumbers()).isEqualTo(expectedLottoNumbers); - } - // LottoBasicLuckyNumbers 의 get()을 테스트하지 않았는데, - // 그 상위인 LottoLuckyNumbers에서 위 메소드를 부르니 테스트를 또 할 필요가 없다고 판단하였습니다. - // 오히려 반대로 LottoBasicLuckyNumbers에서 테스트하고, 상위인 LottoLuckyNumbers에서 테스트를 하지 말아야하나요? - - @DisplayName("객체 생성시 넣은 로또 보너스 번호 제대로 나오는지 확인") - @Test - void getBonusNumber() { - // given - List stubLottoNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); - LottoNumber bonusNumber = new LottoNumber(7); - LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(stubLottoNumbers); - - LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); - - // then - assertThat(lottoLuckyNumbers.getBonusNumber()).isEqualTo(bonusNumber); - } -} diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbersTest.java similarity index 95% rename from src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java rename to src/test/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbersTest.java index d5899fe..558d99f 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoBasicLuckyNumbersTest.java +++ b/src/test/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbersTest.java @@ -1,4 +1,4 @@ -package com.javabom.lotto.domain.compare; +package com.javabom.lotto.domain.results; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java b/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java similarity index 50% rename from src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java rename to src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java index 2052bae..80463f8 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoTicketComparatorTest.java +++ b/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java @@ -1,4 +1,4 @@ -package com.javabom.lotto.domain.compare; +package com.javabom.lotto.domain.results; import com.javabom.lotto.domain.ticket.LottoNumber; import com.javabom.lotto.domain.ticket.LottoTicket; @@ -10,35 +10,35 @@ import java.util.List; import java.util.stream.Collectors; -import static com.javabom.lotto.domain.compare.LottoResult.FIRST_PRIZE; +import static com.javabom.lotto.domain.results.LottoResult.FIRST_PRIZE; import static org.assertj.core.api.Assertions.assertThat; -class LottoTicketComparatorTest { +class LottoLuckyNumbersTest { - @DisplayName("로또 번호 1등 당첨일 때 테스트") + @DisplayName("로또 결과를 잘 계산해 내는지 확인") @Test void getLottoResults() { // given - List lottoIntegerNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); - List stubLottoNumbers = lottoIntegerNumbers.stream() - .map(LottoNumber::new) - .collect(Collectors.toList()); + List stubLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6) + ); LottoNumber bonusNumber = new LottoNumber(7); - LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(lottoIntegerNumbers); + LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(Arrays.asList(1, 2, 3, 4, 5, 6)); LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); - LottoTicketComparator lottoTicketComparator = new LottoTicketComparator(lottoLuckyNumbers); // when LottoTickets allMatchLottoTicket = new LottoTickets(Arrays.asList(new LottoTicket(stubLottoNumbers))); - LottoResults lottoResults = lottoTicketComparator.getLottoResults(allMatchLottoTicket); + LottoResults lottoResults = lottoLuckyNumbers.getLottoResults(allMatchLottoTicket); LottoResults expectedLottoResults = new LottoResults(Arrays.asList(FIRST_PRIZE)); // then assertThat(lottoResults).isEqualTo(expectedLottoResults); } - // 여기서 각 등수별 테스트를 하려고 했는데 파라미터가 매우 많아지는 현상이 생깁니다. - // 이 클래스를 잘못짰기 때문에 테스트가 힘든구조가 되는걸까요? - // 여기서 테스트를 어떤식으로 해야할지 잘 모르겠습니다. -} \ No newline at end of file +} diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoResultTest.java b/src/test/java/com/javabom/lotto/domain/results/LottoResultTest.java similarity index 90% rename from src/test/java/com/javabom/lotto/domain/compare/LottoResultTest.java rename to src/test/java/com/javabom/lotto/domain/results/LottoResultTest.java index 779c7dd..7ec1b34 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoResultTest.java +++ b/src/test/java/com/javabom/lotto/domain/results/LottoResultTest.java @@ -1,4 +1,4 @@ -package com.javabom.lotto.domain.compare; +package com.javabom.lotto.domain.results; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; @@ -16,7 +16,7 @@ void validateMatchCount(int matchCount) { // then assertThatThrownBy(() -> LottoResult.find(matchCount, true)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("로또번호 매치 수는 0~6 사이입니다."); + .hasMessage("로또번호 매치 수는 0~6 이외일 수 없습니다."); } @DisplayName("로또 번호 매치수와 보너스 매치여부에 따른 로또 결과 확인") diff --git a/src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java b/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java similarity index 59% rename from src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java rename to src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java index f5af900..137651e 100644 --- a/src/test/java/com/javabom/lotto/domain/compare/LottoResultsTest.java +++ b/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java @@ -1,5 +1,6 @@ -package com.javabom.lotto.domain.compare; +package com.javabom.lotto.domain.results; +import com.javabom.lotto.domain.ticket.Money; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -7,8 +8,8 @@ import java.util.List; import java.util.stream.Collectors; -import static com.javabom.lotto.domain.compare.LottoResult.FIFTH_PRIZE; -import static com.javabom.lotto.domain.compare.LottoResult.FOURTH_PRIZE; +import static com.javabom.lotto.domain.results.LottoResult.FIFTH_PRIZE; +import static com.javabom.lotto.domain.results.LottoResult.FOURTH_PRIZE; import static org.assertj.core.api.Assertions.assertThat; class LottoResultsTest { @@ -22,9 +23,9 @@ void findResultsOf() { FOURTH_PRIZE, FIFTH_PRIZE); LottoResults lottoResults = new LottoResults(lottoResultList); - List expectedLottoResultList = lottoResultList.stream() - .filter(result -> result == FOURTH_PRIZE) - .collect(Collectors.toList()); + List expectedLottoResultList = Arrays.asList( + FOURTH_PRIZE, + FOURTH_PRIZE); // then assertThat(lottoResults.findResultsOf(FOURTH_PRIZE)) @@ -34,17 +35,12 @@ void findResultsOf() { @Test void getTotalPrizeMoney() { // given - List lottoResultList = Arrays.asList( - FOURTH_PRIZE, - FOURTH_PRIZE, - FIFTH_PRIZE); + List lottoResultList = Arrays.asList(FOURTH_PRIZE, FIFTH_PRIZE); LottoResults lottoResults = new LottoResults(lottoResultList); - long expectedTotalPrizeMoney = lottoResultList.stream() - .mapToLong(LottoResult::getPrice) - .sum(); + Money expectedTotalPrizeMoney = new Money(FOURTH_PRIZE.getPrice() + FIFTH_PRIZE.getPrice()); // then - assertThat(lottoResults.getTotalPrizeMoney().get()) + assertThat(lottoResults.getTotalPrizeMoney()) .isEqualTo(expectedTotalPrizeMoney); } } \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java b/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java deleted file mode 100644 index 7cb1d7e..0000000 --- a/src/test/java/com/javabom/lotto/domain/ticket/FixedLottoNumberGenerator.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.javabom.lotto.domain.ticket; - -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class FixedLottoNumberGenerator implements LottoNumberGenerator { - @Override - public List getLottoNumbers() { - return IntStream.rangeClosed(1, 6) - .boxed() - .map(LottoNumber::new) - .collect(Collectors.toList()); - } -} diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java index ab7468f..9a50da2 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java @@ -28,6 +28,6 @@ void get() { void name(int number) { assertThatThrownBy(() -> new LottoNumber(number)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("로또 번호는 1~45 입니다."); + .hasMessage("로또 번호는 1~45이외 일 수 없습니다."); } } \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java index c5afa78..a5267b8 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java @@ -16,11 +16,15 @@ class LottoTicketDispenserTest { @Test void getAutoTickets() { // given - LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new FixedLottoNumberGenerator()); - List stubLottoNumbers = IntStream.rangeClosed(1, 6) - .boxed() - .map(LottoNumber::new) - .collect(Collectors.toList()); + List stubLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6) + ); + LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(() -> stubLottoNumbers); LottoTicket stubLottoTicket = new LottoTicket(stubLottoNumbers); LottoTickets expectedLottoTickets = new LottoTickets(Arrays.asList(stubLottoTicket)); @@ -44,8 +48,6 @@ void name() { LottoTickets lottoTickets = lottoTicketDispenser.getAutoTickets(money); // then - assertThat(lottoTickets.get().size()).isEqualTo(expectedTicketQuantity); + assertThat(lottoTickets.get()).hasSize(expectedTicketQuantity); } - // RandomLottoNumberGenerator 테스트 커버리지 0인걸 통과하려고 추가한 테스트입니다.. - // 의미가 있는 테스트인지 솔직히 모르겠습니다. } \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java index 0c54f4e..f1b9b53 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java @@ -21,9 +21,14 @@ class LottoTicketTest { void getNumbers() { // given List expectedIntegers = Arrays.asList(1, 2, 3, 4, 5, 6); - List stubLottoNumbers = expectedIntegers.stream() - .map(LottoNumber::new) - .collect(Collectors.toList()); + List stubLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6) + ); LottoTicket lottoTicket = new LottoTicket(stubLottoNumbers); // then @@ -35,10 +40,14 @@ void getNumbers() { @ParameterizedTest void isContain(int matchNumber, boolean isNumberContain) { // given - List stubLottoNumbers = IntStream.rangeClosed(1, 6) - .boxed() - .map(LottoNumber::new) - .collect(Collectors.toList()); + List stubLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6) + ); LottoTicket lottoTicket = new LottoTicket(stubLottoNumbers); LottoNumber matchLottoNumber = new LottoNumber(matchNumber); diff --git a/src/test/java/com/javabom/lotto/domain/ticket/MoneyTest.java b/src/test/java/com/javabom/lotto/domain/ticket/MoneyTest.java new file mode 100644 index 0000000..8a6d4d4 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/MoneyTest.java @@ -0,0 +1,30 @@ +package com.javabom.lotto.domain.ticket; + +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; + +class MoneyTest { + + @DisplayName("돈에 음수가 들어가면 Exception") + @Test + void validateMoney() { + assertThatThrownBy(() -> new Money(-1)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("돈은 음수일 수 없습니다."); + } + + @DisplayName("인풋값에 대한 수량 가져오기") + @Test + void calculateQuantityPer() { + // given + Money money = new Money(10_000); + int price = 1_000; + int expectedQuantity = 10; + + // then + assertThat(money.calculateQuantityPer(price)).isEqualTo(expectedQuantity); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactoryTest.java b/src/test/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactoryTest.java deleted file mode 100644 index 3af810b..0000000 --- a/src/test/java/com/javabom/lotto/domain/ticket/SortedLottoNumbersFactoryTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.javabom.lotto.domain.ticket; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -class SortedLottoNumbersFactoryTest { - - @DisplayName("LottoNumber의 size가 45인지 확인") - @Test - void create() { - // given - List lottoNumbers = SortedLottoNumbersFactory.create(); - - // then - assertThat(lottoNumbers.size()).isEqualTo(45); - } - // 얘는 어떻게 테스트를 하면 좋을지 몰라서 (for문을 쓰는 것은 지양하라 하여서) - // size 로 대체했으나, 정렬된것은 어떻게 테스트를 해야하는지 모르겠습니다 (for문없이) -} \ No newline at end of file From efe0fa128eb3c1a329cddca7f6d02f3a40f918bc Mon Sep 17 00:00:00 2001 From: Malibin Date: Fri, 5 Jun 2020 03:30:48 +0900 Subject: [PATCH 09/13] =?UTF-8?q?1=EC=B0=A8=20=ED=94=BC=EB=93=9C=EB=B0=B1?= =?UTF-8?q?=20=EB=B0=98=EC=98=81.=20=EC=83=81=EC=86=8D=EC=A0=9C=EA=B1=B0?= =?UTF-8?q?=20=EB=B0=8F=20BasicLuckyNumbers=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 5 ++-- .../javabom/lotto/domain/LottoNumbers.java | 24 --------------- .../results/LottoBasicLuckyNumbers.java | 29 ------------------ .../domain/results/LottoLuckyNumbers.java | 8 ++--- .../lotto/domain/ticket/LottoNumber.java | 12 ++++---- .../domain/ticket/LottoNumberConverter.java | 17 +++++++++++ .../lotto/domain/ticket/LottoTicket.java | 30 +++++++++++-------- .../com/javabom/lotto/view/OutputView.java | 14 +-------- .../results/LottoBasicLuckyNumbersTest.java | 29 ------------------ .../domain/results/LottoLuckyNumbersTest.java | 4 +-- .../lotto/domain/ticket/LottoNumberTest.java | 13 +------- .../lotto/domain/ticket/LottoTicketTest.java | 21 +------------ 12 files changed, 52 insertions(+), 154 deletions(-) delete mode 100644 src/main/java/com/javabom/lotto/domain/LottoNumbers.java delete mode 100644 src/main/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbers.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoNumberConverter.java delete mode 100644 src/test/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbersTest.java diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 07ecb0d..7fd365d 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -1,6 +1,5 @@ package com.javabom.lotto; -import com.javabom.lotto.domain.results.LottoBasicLuckyNumbers; import com.javabom.lotto.domain.results.LottoLuckyNumbers; import com.javabom.lotto.domain.results.LottoResults; import com.javabom.lotto.domain.ticket.*; @@ -15,9 +14,9 @@ public static void main(String[] args) { LottoTickets lottoTickets = lottoTicketDispenser.getAutoTickets(inputMoney); OutputView.printLottoTickets(lottoTickets); - LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(InputView.getLottoBasicLuckyNumbers()); + LottoTicket basicLuckyTicket = new LottoTicket(LottoNumberConverter.convert(InputView.getLottoBasicLuckyNumbers())); LottoNumber bonusNumber = new LottoNumber(InputView.getBonusNumber()); - LottoLuckyNumbers LuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); + LottoLuckyNumbers LuckyNumbers = new LottoLuckyNumbers(basicLuckyTicket, bonusNumber); LottoResults lottoResults = LuckyNumbers.getLottoResults(lottoTickets); OutputView.printLottoResults(lottoResults); diff --git a/src/main/java/com/javabom/lotto/domain/LottoNumbers.java b/src/main/java/com/javabom/lotto/domain/LottoNumbers.java deleted file mode 100644 index 17a27d0..0000000 --- a/src/main/java/com/javabom/lotto/domain/LottoNumbers.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.javabom.lotto.domain; - -import com.javabom.lotto.domain.ticket.LottoNumber; - -import java.util.List; - -abstract public class LottoNumbers { - - protected final List numbers; - - public LottoNumbers(List numbers) { - validateLottoNumbers(numbers); - this.numbers = numbers; - } - - protected abstract void validateLottoNumbers(List numbers); - - public int countMatchingNumbers(LottoNumbers lottoNumbers) { - return (int) lottoNumbers.numbers.stream() - .map(this.numbers::contains) - .filter(isContain -> isContain) - .count(); - } -} \ No newline at end of file diff --git a/src/main/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbers.java deleted file mode 100644 index 1e1edb9..0000000 --- a/src/main/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbers.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.javabom.lotto.domain.results; - -import com.javabom.lotto.domain.LottoNumbers; -import com.javabom.lotto.domain.ticket.LottoNumber; - -import java.util.List; -import java.util.stream.Collectors; - -public class LottoBasicLuckyNumbers extends LottoNumbers { - - private static final int LUCKY_LOTTO_NUM_SIZE = 6; - - public LottoBasicLuckyNumbers(List numbers) { - super(convertToLottoNumbers(numbers)); - } - - private static List convertToLottoNumbers(List numbers) { - return numbers.stream() - .map(LottoNumber::new) - .collect(Collectors.toList()); - } - - @Override - protected void validateLottoNumbers(List numbers) { - if (numbers.size() != LUCKY_LOTTO_NUM_SIZE) { - throw new IllegalArgumentException("당첨 번호는 반드시 6개입니다."); - } - } -} diff --git a/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java index 890bd18..d81f805 100644 --- a/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java +++ b/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java @@ -9,11 +9,11 @@ public class LottoLuckyNumbers { - private final LottoBasicLuckyNumbers basicLuckyNumbers; + private final LottoTicket basicLuckyTicket; private final LottoNumber bonusNumber; - public LottoLuckyNumbers(LottoBasicLuckyNumbers basicLuckyNumbers, LottoNumber bonusNumber) { - this.basicLuckyNumbers = basicLuckyNumbers; + public LottoLuckyNumbers(LottoTicket basicLuckyTicket, LottoNumber bonusNumber) { + this.basicLuckyTicket = basicLuckyTicket; this.bonusNumber = bonusNumber; } @@ -26,7 +26,7 @@ public LottoResults getLottoResults(LottoTickets lottoTickets) { } private LottoResult getLottoResult(LottoTicket lottoTicket) { - int matchCount = basicLuckyNumbers.countMatchingNumbers(lottoTicket); + int matchCount = basicLuckyTicket.countMatchingNumbers(lottoTicket); boolean isBonusMatched = lottoTicket.isContain(bonusNumber); return LottoResult.find(matchCount, isBonusMatched); } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java index eaac043..c7e4bcf 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumber.java @@ -15,14 +15,10 @@ public LottoNumber(int number) { private void validateNumber(int number) { if (number < MIN_LOTTO_NUM || number > MAX_LOTTO_NUM) { - throw new IllegalArgumentException("로또 번호는 1~45이외 일 수 없습니다."); + throw new IllegalArgumentException("로또 번호는 1~45이외 일 수 없습니다. 입력 값 : " + number); } } - public int get() { - return number; - } - @Override public boolean equals(Object o) { if (this == o) return true; @@ -35,4 +31,10 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(number); } + + @Override + public String toString() { + return String.valueOf(number); + } + } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumberConverter.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumberConverter.java new file mode 100644 index 0000000..8daabb3 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumberConverter.java @@ -0,0 +1,17 @@ +package com.javabom.lotto.domain.ticket; + +import java.util.List; +import java.util.stream.Collectors; + +public class LottoNumberConverter { + + private LottoNumberConverter() { + } + + public static List convert(List lottoNumbers) { + return lottoNumbers.stream() + .map(LottoNumber::new) + .collect(Collectors.toList()); + } + +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java index 7eebe53..4f3fdcb 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java @@ -1,30 +1,30 @@ package com.javabom.lotto.domain.ticket; -import com.javabom.lotto.domain.LottoNumbers; - import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -public class LottoTicket extends LottoNumbers { +public class LottoTicket { private static final int LOTTO_NUM_PICK_SIZE = 6; + private final List numbers; + public LottoTicket(List numbers) { - super(numbers); + validateLottoNumbers(numbers); + this.numbers = numbers; } - @Override - protected void validateLottoNumbers(List numbers) { + private void validateLottoNumbers(List numbers) { if (numbers.size() != LOTTO_NUM_PICK_SIZE) { - throw new IllegalArgumentException("로또 티켓에 6개 숫자를 넣어야 합니다."); + throw new IllegalArgumentException("로또 티켓에 6개 숫자를 넣어야 합니다. 입력 size : " + numbers.size()); } } - public List getNumbers() { - return numbers.stream() - .map(LottoNumber::get) - .collect(Collectors.toList()); + public int countMatchingNumbers(LottoTicket lottoTicket) { + return (int) lottoTicket.numbers.stream() + .filter(this.numbers::contains) + .count(); } public boolean isContain(LottoNumber number) { @@ -35,8 +35,8 @@ public boolean isContain(LottoNumber number) { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - LottoTicket that = (LottoTicket) o; - return Objects.equals(numbers, that.numbers); + LottoTicket ticket = (LottoTicket) o; + return Objects.equals(numbers, ticket.numbers); } @Override @@ -44,4 +44,8 @@ public int hashCode() { return Objects.hash(numbers); } + @Override + public String toString() { + return String.valueOf(numbers); + } } diff --git a/src/main/java/com/javabom/lotto/view/OutputView.java b/src/main/java/com/javabom/lotto/view/OutputView.java index b0ca68e..a2743d3 100644 --- a/src/main/java/com/javabom/lotto/view/OutputView.java +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -21,22 +21,10 @@ public class OutputView { public static void printLottoTickets(LottoTickets lottoTickets) { printLineOf(lottoTickets.get().size() + NOTICE_BUY_COMPLETE); for (LottoTicket lottoTicket : lottoTickets.get()) { - printLineOf(stringOf(lottoTicket)); + printLineOf(lottoTicket.toString()); } } - private static String stringOf(LottoTicket lottoTicket) { - String lottoNumbers = lottoTicket.getNumbers().stream() - .map(String::valueOf) - .collect(Collectors.joining(", ")); - - return new StringBuilder() - .append("[") - .append(lottoNumbers) - .append("]") - .toString(); - } - public static void printLottoResults(LottoResults lottoResults) { printLineOf(NOTICE_WINNING_STATISTICS); for (LottoResult resultKind : LottoResult.values()) { diff --git a/src/test/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbersTest.java deleted file mode 100644 index 558d99f..0000000 --- a/src/test/java/com/javabom/lotto/domain/results/LottoBasicLuckyNumbersTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.javabom.lotto.domain.results; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; - -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -class LottoBasicLuckyNumbersTest { - - @DisplayName("기본 당첨 번호의 개수는 6개이여야 함.") - @CsvSource({"5", "7"}) - @ParameterizedTest - void validateLottoNumbersSize(int size) { - // given - List lottoNumbers = IntStream.rangeClosed(1, size) - .boxed() - .collect(Collectors.toList()); - - // then - assertThatThrownBy(() -> new LottoBasicLuckyNumbers(lottoNumbers)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("당첨 번호는 반드시 6개입니다."); - } -} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java index 80463f8..db7520d 100644 --- a/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java +++ b/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java @@ -29,9 +29,9 @@ void getLottoResults() { ); LottoNumber bonusNumber = new LottoNumber(7); - LottoBasicLuckyNumbers basicLuckyNumbers = new LottoBasicLuckyNumbers(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket basicLuckyTicket = new LottoTicket(stubLottoNumbers); - LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyNumbers, bonusNumber); + LottoLuckyNumbers lottoLuckyNumbers = new LottoLuckyNumbers(basicLuckyTicket, bonusNumber); // when LottoTickets allMatchLottoTicket = new LottoTickets(Arrays.asList(new LottoTicket(stubLottoNumbers))); diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java index 9a50da2..db736fe 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberTest.java @@ -11,23 +11,12 @@ class LottoNumberTest { - @DisplayName("생성시 넣은 숫자 잘 뱉는지 확인") - @Test - void get() { - // given - int expectedNum = 1; - LottoNumber lottoNumber = new LottoNumber(expectedNum); - - // then - assertThat(lottoNumber.get()).isEqualTo(expectedNum); - } - @DisplayName("로또번호가 아닌 1~45 이외의 수 입력못함.") @CsvSource({"0", "46"}) @ParameterizedTest void name(int number) { assertThatThrownBy(() -> new LottoNumber(number)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("로또 번호는 1~45이외 일 수 없습니다."); + .hasMessage("로또 번호는 1~45이외 일 수 없습니다. 입력 값 : " + number); } } \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java index f1b9b53..49cb5dd 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java @@ -16,25 +16,6 @@ class LottoTicketTest { - @DisplayName("티켓 생성 후 입력 번호 리스트가 제대로 나오는지 확인") - @Test - void getNumbers() { - // given - List expectedIntegers = Arrays.asList(1, 2, 3, 4, 5, 6); - List stubLottoNumbers = Arrays.asList( - new LottoNumber(1), - new LottoNumber(2), - new LottoNumber(3), - new LottoNumber(4), - new LottoNumber(5), - new LottoNumber(6) - ); - LottoTicket lottoTicket = new LottoTicket(stubLottoNumbers); - - // then - assertThat(lottoTicket.getNumbers()).isEqualTo(expectedIntegers); - } - @DisplayName("티켓내에 특정 번호가 들어있는지 확인") @CsvSource({"1,true", "7,false"}) @ParameterizedTest @@ -67,6 +48,6 @@ void validateLottoNumbersSize(int size) { // then assertThatThrownBy(() -> new LottoTicket(stubLottoNumbers)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("로또 티켓에 6개 숫자를 넣어야 합니다."); + .hasMessage("로또 티켓에 6개 숫자를 넣어야 합니다. 입력 size : " + size); } } \ No newline at end of file From 97bf6f178d981c9016d78bf09d37fbf97a72f966 Mon Sep 17 00:00:00 2001 From: Malibin Date: Fri, 5 Jun 2020 05:07:43 +0900 Subject: [PATCH 10/13] =?UTF-8?q?2=EB=8B=A8=EA=B3=84=20=EB=AF=B8=EC=85=98?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 13 ++++++-- .../domain/ticket/LottoTicketDispenser.java | 9 +++++- .../lotto/domain/ticket/LottoTickets.java | 8 +++++ .../domain/ticket/ManualLottoNumbers.java | 20 ++++++++++++ .../javabom/lotto/domain/ticket/Money.java | 31 ++++++++++++++----- .../com/javabom/lotto/view/InputView.java | 28 ++++++++++++++++- .../com/javabom/lotto/view/OutputView.java | 13 ++++---- .../domain/results/LottoResultsTest.java | 1 - .../{MoneyTest.java => LottoMoneyTest.java} | 6 ++-- .../ticket/LottoNumberConverterTest.java | 31 +++++++++++++++++++ .../ticket/LottoTicketDispenserTest.java | 2 -- .../domain/ticket/ManualLottoNumbersTest.java | 29 +++++++++++++++++ 12 files changed, 166 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/ManualLottoNumbers.java rename src/test/java/com/javabom/lotto/domain/ticket/{MoneyTest.java => LottoMoneyTest.java} (84%) create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/LottoNumberConverterTest.java create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/ManualLottoNumbersTest.java diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 7fd365d..6c22a44 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -6,19 +6,26 @@ import com.javabom.lotto.view.InputView; import com.javabom.lotto.view.OutputView; +import java.util.List; + public class LottoApplication { public static void main(String[] args) { Money inputMoney = new Money(InputView.getMoneyToBuyTicket()); + int manualLottoAmount = InputView.getManualLottoAmount(); + List manualLottoNumbers = InputView.getManualLottoNumbers(manualLottoAmount); + LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new RandomLottoNumberGenerator()); - LottoTickets lottoTickets = lottoTicketDispenser.getAutoTickets(inputMoney); - OutputView.printLottoTickets(lottoTickets); + LottoTickets manualLottoTickets = lottoTicketDispenser.getManualTickets(manualLottoNumbers); + Money restMoney = inputMoney.spend(LottoTicketDispenser.LOTTO_TICKET_PRICE.multiply(manualLottoAmount)); + LottoTickets autoLottoTickets = lottoTicketDispenser.getAutoTickets(restMoney); + OutputView.printLottoTickets(manualLottoTickets, autoLottoTickets); LottoTicket basicLuckyTicket = new LottoTicket(LottoNumberConverter.convert(InputView.getLottoBasicLuckyNumbers())); LottoNumber bonusNumber = new LottoNumber(InputView.getBonusNumber()); LottoLuckyNumbers LuckyNumbers = new LottoLuckyNumbers(basicLuckyTicket, bonusNumber); - LottoResults lottoResults = LuckyNumbers.getLottoResults(lottoTickets); + LottoResults lottoResults = LuckyNumbers.getLottoResults(autoLottoTickets.add(manualLottoTickets)); OutputView.printLottoResults(lottoResults); OutputView.printEarningRate(inputMoney, lottoResults.getTotalPrizeMoney()); } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java index 94f4752..d6830cf 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java @@ -2,10 +2,11 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class LottoTicketDispenser { - private static final int LOTTO_TICKET_PRICE = 1_000; + public static final Money LOTTO_TICKET_PRICE = new Money(1_000); private final LottoNumberGenerator lottoNumberGenerator; @@ -21,4 +22,10 @@ public LottoTickets getAutoTickets(Money inputMoney) { } return new LottoTickets(tickets); } + + public LottoTickets getManualTickets(List manualNumbers) { + return new LottoTickets(manualNumbers.stream() + .map(ManualLottoNumbers::toLottoTicket) + .collect(Collectors.toList())); + } } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java index e87777b..71ba81c 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java @@ -1,5 +1,6 @@ package com.javabom.lotto.domain.ticket; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -16,6 +17,13 @@ public List get() { return Collections.unmodifiableList(tickets); } + public LottoTickets add(LottoTickets lottoTickets) { + List newTickets = new ArrayList<>(); + newTickets.addAll(this.tickets); + newTickets.addAll(lottoTickets.tickets); + return new LottoTickets(newTickets); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/javabom/lotto/domain/ticket/ManualLottoNumbers.java b/src/main/java/com/javabom/lotto/domain/ticket/ManualLottoNumbers.java new file mode 100644 index 0000000..a982664 --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/ManualLottoNumbers.java @@ -0,0 +1,20 @@ +package com.javabom.lotto.domain.ticket; + +import java.util.List; +import java.util.stream.Collectors; + +public class ManualLottoNumbers { + + private final List numbers; + + public ManualLottoNumbers(List numbers) { + this.numbers = numbers; + } + + public LottoTicket toLottoTicket() { + return new LottoTicket(numbers.stream() + .map(LottoNumber::new) + .collect(Collectors.toList()) + ); + } +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/Money.java b/src/main/java/com/javabom/lotto/domain/ticket/Money.java index 92bd830..1a111fe 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/Money.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/Money.java @@ -4,25 +4,40 @@ public class Money { - private final long money; + private final long value; public Money(long money) { validateMoney(money); - this.money = money; + value = money; } private void validateMoney(long money) { if (money < 0) { - throw new IllegalArgumentException("돈은 음수일 수 없습니다."); + throw new IllegalArgumentException("돈은 음수일 수 없습니다. 입력값 : " + money); } } - public int calculateQuantityPer(int price) { - return (int) money / price; + public Money multiply(int value) { + return new Money(this.value * value); + } + + public Money spend(Money money) { + validateCanSpendMoney(money); + return new Money(this.value - money.value); + } + + private void validateCanSpendMoney(Money money) { + if (money.value > this.value) { + throw new IllegalArgumentException("현재 값 (" + value + ") 보다 사용하려는 금액 (" + money.value + ") 이 더 많습니다."); + } + } + + public int calculateQuantityPer(Money price) { + return (int) (value / price.value); } public double calculateRatioOf(Money input) { - return (double) input.money / this.money * 100; + return (double) input.value / this.value * 100; } @Override @@ -30,11 +45,11 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Money money1 = (Money) o; - return money == money1.money; + return value == money1.value; } @Override public int hashCode() { - return Objects.hash(money); + return Objects.hash(value); } } diff --git a/src/main/java/com/javabom/lotto/view/InputView.java b/src/main/java/com/javabom/lotto/view/InputView.java index 6ecf6b4..3a67d58 100644 --- a/src/main/java/com/javabom/lotto/view/InputView.java +++ b/src/main/java/com/javabom/lotto/view/InputView.java @@ -1,5 +1,8 @@ package com.javabom.lotto.view; +import com.javabom.lotto.domain.ticket.ManualLottoNumbers; + +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -7,9 +10,12 @@ public class InputView { + private static final String DELIMITER_COMMA = ","; private static final String NOTICE_INPUT_MONEY = "구입 금액을 입력해 주세요. 잔돈은 없습니다 ^^"; private static final String NOTICE_INPUT_BASIC_LUCKY_NUMBER = "지난 주 당첨 번호를 입력해 주세요. (,로 나눠서 입력)"; private static final String NOTICE_INPUT_BONUS_NUMBER = "보너스 볼을 입력해 주세요."; + private static final String NOTICE_INPUT_MANUAL_LOTTO_AMOUNT = "수동으로 구매할 로또 수를 입력해 주세요."; + private static final String NOTICE_INPUT_MANUAL_LOTTO_NUMBER = "수동으로 구매할 번호를 입력해 주세요."; private static final Scanner scanner = new Scanner(System.in); @@ -20,7 +26,7 @@ public static int getMoneyToBuyTicket() { public static List getLottoBasicLuckyNumbers() { printLineOf(NOTICE_INPUT_BASIC_LUCKY_NUMBER); - return Arrays.stream(scanner.nextLine().split(",")) + return Arrays.stream(scanner.nextLine().split(DELIMITER_COMMA)) .map(Integer::parseInt) .collect(Collectors.toList()); } @@ -30,6 +36,26 @@ public static int getBonusNumber() { return scanner.nextInt(); } + public static int getManualLottoAmount() { + printLineOf(NOTICE_INPUT_MANUAL_LOTTO_AMOUNT); + return Integer.parseInt(scanner.nextLine()); + } + + public static List getManualLottoNumbers(int amount) { + printLineOf(NOTICE_INPUT_MANUAL_LOTTO_NUMBER); + List manualLottoNumbers = new ArrayList<>(); + for (int i = 0; i < amount; i++) { + manualLottoNumbers.add(new ManualLottoNumbers(getManualLottoNumber())); + } + return manualLottoNumbers; + } + + public static List getManualLottoNumber() { + return Arrays.stream(scanner.nextLine().split(DELIMITER_COMMA)) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + private static void printLineOf(String string) { System.out.println(string); } diff --git a/src/main/java/com/javabom/lotto/view/OutputView.java b/src/main/java/com/javabom/lotto/view/OutputView.java index a2743d3..7b5aadd 100644 --- a/src/main/java/com/javabom/lotto/view/OutputView.java +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -6,11 +6,9 @@ import com.javabom.lotto.domain.ticket.LottoTickets; import com.javabom.lotto.domain.ticket.Money; -import java.util.stream.Collectors; - public class OutputView { - private static final String NOTICE_BUY_COMPLETE = "개를 구매했습니다."; + private static final String NOTICE_BUY_COMPLETE = "수동으로 %d장, 자동으로 %d개를 구매했습니다."; private static final String NOTICE_WINNING_STATISTICS = "당첨 통계"; private static final String NOTICE_MATCH_QUANTITY = "%d개 일치, "; private static final String NOTICE_PRIZE_MONEY = "(%d원)"; @@ -18,9 +16,12 @@ public class OutputView { private static final String NOTICE_MATCH_BONUS = "보너스 볼 일치"; private static final String NOTICE_EARNING_RATE = "총 수익률은 %.2f%% 입니다."; - public static void printLottoTickets(LottoTickets lottoTickets) { - printLineOf(lottoTickets.get().size() + NOTICE_BUY_COMPLETE); - for (LottoTicket lottoTicket : lottoTickets.get()) { + public static void printLottoTickets(LottoTickets manualLottoTickets, LottoTickets autoLottoTickets) { + printLineOf(String.format(NOTICE_BUY_COMPLETE, manualLottoTickets.get().size(), autoLottoTickets.get().size())); + for (LottoTicket lottoTicket : manualLottoTickets.get()) { + printLineOf(lottoTicket.toString()); + } + for (LottoTicket lottoTicket : autoLottoTickets.get()) { printLineOf(lottoTicket.toString()); } } diff --git a/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java b/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java index 137651e..e34411e 100644 --- a/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java +++ b/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java @@ -6,7 +6,6 @@ import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import static com.javabom.lotto.domain.results.LottoResult.FIFTH_PRIZE; import static com.javabom.lotto.domain.results.LottoResult.FOURTH_PRIZE; diff --git a/src/test/java/com/javabom/lotto/domain/ticket/MoneyTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoMoneyTest.java similarity index 84% rename from src/test/java/com/javabom/lotto/domain/ticket/MoneyTest.java rename to src/test/java/com/javabom/lotto/domain/ticket/LottoMoneyTest.java index 8a6d4d4..5be0dcf 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/MoneyTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoMoneyTest.java @@ -6,14 +6,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -class MoneyTest { +class LottoMoneyTest { @DisplayName("돈에 음수가 들어가면 Exception") @Test void validateMoney() { assertThatThrownBy(() -> new Money(-1)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("돈은 음수일 수 없습니다."); + .hasMessage("돈은 음수일 수 없습니다. 입력값 : -1"); } @DisplayName("인풋값에 대한 수량 가져오기") @@ -21,7 +21,7 @@ void validateMoney() { void calculateQuantityPer() { // given Money money = new Money(10_000); - int price = 1_000; + Money price = new Money(1_000); int expectedQuantity = 10; // then diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberConverterTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberConverterTest.java new file mode 100644 index 0000000..b8b438e --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoNumberConverterTest.java @@ -0,0 +1,31 @@ +package com.javabom.lotto.domain.ticket; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class LottoNumberConverterTest { + + @DisplayName("정수 리스트를 로또 넘버 리스트로 제대로 변환하는 지 검사") + @Test + void convert() { + // given + List stubNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); + List expectedLottoNumbers = Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6) + ); + + // then + assertThat(LottoNumberConverter.convert(stubNumbers)) + .isEqualTo(expectedLottoNumbers); + } +} \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java index a5267b8..1b92525 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java @@ -5,8 +5,6 @@ import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/com/javabom/lotto/domain/ticket/ManualLottoNumbersTest.java b/src/test/java/com/javabom/lotto/domain/ticket/ManualLottoNumbersTest.java new file mode 100644 index 0000000..be53934 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/ManualLottoNumbersTest.java @@ -0,0 +1,29 @@ +package com.javabom.lotto.domain.ticket; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +class ManualLottoNumbersTest { + + @DisplayName("수동 입력 정수가 로또티켓으로 변환되는지 확인") + @Test + void toLottoTicket() { + // given + ManualLottoNumbers manualLottoNumbers = new ManualLottoNumbers(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket expectedLottoTicket = new LottoTicket(Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6) + )); + + // then + assertThat(manualLottoNumbers.toLottoTicket()).isEqualTo(expectedLottoTicket); + } +} \ No newline at end of file From 1cd3d44f870efd6fa3c2f8c79bc7ea89a1a28cf8 Mon Sep 17 00:00:00 2001 From: Malibin Date: Fri, 5 Jun 2020 05:20:05 +0900 Subject: [PATCH 11/13] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/domain/ticket/LottoMoneyTest.java | 26 ++++++++++++ .../lotto/domain/ticket/LottoTicketTest.java | 25 +++++++++++ .../lotto/domain/ticket/LottoTicketsTest.java | 42 +++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 src/test/java/com/javabom/lotto/domain/ticket/LottoTicketsTest.java diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoMoneyTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoMoneyTest.java index 5be0dcf..029e8c4 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoMoneyTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoMoneyTest.java @@ -27,4 +27,30 @@ void calculateQuantityPer() { // then assertThat(money.calculateQuantityPer(price)).isEqualTo(expectedQuantity); } + + @DisplayName("돈 소비할 때 제대로 남는 돈이 제대로 계산 되는지 확인") + @Test + void spend() { + // given + Money money = new Money(5_000); + Money spendMoney = new Money(2_000); + Money expectedMoney = new Money(3_000); + + // then + assertThat(money.spend(spendMoney)).isEqualTo(expectedMoney); + } + + @DisplayName("남은 돈 보다 더 많은 돈을 사용할 수는 없음.") + @Test + void validateCanSpendMoney() { + // given + Money bigMoney = new Money(5_000); + Money smallMoney = new Money(3_000); + // then + assertThatThrownBy(() ->smallMoney.spend(bigMoney)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("현재 값 (3000) 보다 사용하려는 금액 (5000) 이 더 많습니다."); + + + } } \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java index 49cb5dd..efcbc60 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketTest.java @@ -50,4 +50,29 @@ void validateLottoNumbersSize(int size) { .isInstanceOf(IllegalArgumentException.class) .hasMessage("로또 티켓에 6개 숫자를 넣어야 합니다. 입력 size : " + size); } + + @DisplayName("로또 번호 매치 수를 잘 구하는지 확인") + @Test + void countMatchingNumbers() { + // given + LottoTicket ticket1 = new LottoTicket(Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6) + )); + LottoTicket ticket2 = new LottoTicket(Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(7), + new LottoNumber(8) + )); + + // then + assertThat(ticket1.countMatchingNumbers(ticket2)).isEqualTo(4); + } } \ No newline at end of file diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketsTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketsTest.java new file mode 100644 index 0000000..8d24a31 --- /dev/null +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketsTest.java @@ -0,0 +1,42 @@ +package com.javabom.lotto.domain.ticket; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +class LottoTicketsTest { + + @DisplayName("두 일급 컬렉션 합치기") + @Test + void add() { + // given + LottoTicket ticket1 = new LottoTicket(Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6) + )); + LottoTicket ticket2 = new LottoTicket(Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(7), + new LottoNumber(8) + )); + LottoTickets lottoTickets1 = new LottoTickets(Arrays.asList(ticket1)); + LottoTickets lottoTickets2 = new LottoTickets(Arrays.asList(ticket2)); + + // when + LottoTickets addedLottoTickets = lottoTickets1.add(lottoTickets2); + + // then + assertThat(addedLottoTickets.get()).isEqualTo(Arrays.asList(ticket1, ticket2)); + + } +} \ No newline at end of file From 9fb8981eb4ae36c772f291c2704240514d9f4359 Mon Sep 17 00:00:00 2001 From: Malibin Date: Wed, 10 Jun 2020 21:52:56 +0900 Subject: [PATCH 12/13] =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20=EB=B0=8F=20=EC=83=88=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/javabom/lotto/LottoApplication.java | 11 ++++--- .../domain/results/LottoLuckyNumbers.java | 22 ++++++------- .../lotto/domain/results/LottoResult.java | 31 +++++++++---------- .../lotto/domain/results/LottoResults.java | 2 +- .../domain/ticket/LottoNumberGenerator.java | 9 ------ .../lotto/domain/ticket/LottoTicket.java | 11 ++++--- .../domain/ticket/LottoTicketDispenser.java | 28 +++++++++++++---- .../domain/ticket/LottoTicketGenerator.java | 7 +++++ .../lotto/domain/ticket/LottoTickets.java | 11 +++++++ .../javabom/lotto/domain/ticket/Money.java | 11 ++++++- ...r.java => RandomLottoTicketGenerator.java} | 8 ++--- .../com/javabom/lotto/view/OutputView.java | 2 +- .../domain/results/LottoLuckyNumbersTest.java | 2 +- .../domain/results/LottoResultsTest.java | 2 +- .../ticket/LottoTicketDispenserTest.java | 4 +-- 15 files changed, 97 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoNumberGenerator.java create mode 100644 src/main/java/com/javabom/lotto/domain/ticket/LottoTicketGenerator.java rename src/main/java/com/javabom/lotto/domain/ticket/{RandomLottoNumberGenerator.java => RandomLottoTicketGenerator.java} (77%) diff --git a/src/main/java/com/javabom/lotto/LottoApplication.java b/src/main/java/com/javabom/lotto/LottoApplication.java index 6c22a44..9588963 100644 --- a/src/main/java/com/javabom/lotto/LottoApplication.java +++ b/src/main/java/com/javabom/lotto/LottoApplication.java @@ -15,17 +15,18 @@ public static void main(String[] args) { int manualLottoAmount = InputView.getManualLottoAmount(); List manualLottoNumbers = InputView.getManualLottoNumbers(manualLottoAmount); - LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new RandomLottoNumberGenerator()); - LottoTickets manualLottoTickets = lottoTicketDispenser.getManualTickets(manualLottoNumbers); - Money restMoney = inputMoney.spend(LottoTicketDispenser.LOTTO_TICKET_PRICE.multiply(manualLottoAmount)); + LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new RandomLottoTicketGenerator()); + LottoTickets manualLottoTickets = lottoTicketDispenser.getManualTickets(inputMoney, manualLottoNumbers); + Money restMoney = inputMoney.spend(LottoTicketDispenser.getTotalTicketPrice(manualLottoAmount)); LottoTickets autoLottoTickets = lottoTicketDispenser.getAutoTickets(restMoney); OutputView.printLottoTickets(manualLottoTickets, autoLottoTickets); LottoTicket basicLuckyTicket = new LottoTicket(LottoNumberConverter.convert(InputView.getLottoBasicLuckyNumbers())); LottoNumber bonusNumber = new LottoNumber(InputView.getBonusNumber()); - LottoLuckyNumbers LuckyNumbers = new LottoLuckyNumbers(basicLuckyTicket, bonusNumber); + LottoLuckyNumbers luckyNumbers = new LottoLuckyNumbers(basicLuckyTicket, bonusNumber); - LottoResults lottoResults = LuckyNumbers.getLottoResults(autoLottoTickets.add(manualLottoTickets)); + LottoTickets wholeLottoTickets = autoLottoTickets.add(manualLottoTickets); + LottoResults lottoResults = wholeLottoTickets.getLottoResults(luckyNumbers); OutputView.printLottoResults(lottoResults); OutputView.printEarningRate(inputMoney, lottoResults.getTotalPrizeMoney()); } diff --git a/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java b/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java index d81f805..6e5cfe2 100644 --- a/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java +++ b/src/main/java/com/javabom/lotto/domain/results/LottoLuckyNumbers.java @@ -2,10 +2,6 @@ import com.javabom.lotto.domain.ticket.LottoNumber; import com.javabom.lotto.domain.ticket.LottoTicket; -import com.javabom.lotto.domain.ticket.LottoTickets; - -import java.util.ArrayList; -import java.util.List; public class LottoLuckyNumbers { @@ -15,19 +11,21 @@ public class LottoLuckyNumbers { public LottoLuckyNumbers(LottoTicket basicLuckyTicket, LottoNumber bonusNumber) { this.basicLuckyTicket = basicLuckyTicket; this.bonusNumber = bonusNumber; + validateDuplicatedBonusNumber(); } - public LottoResults getLottoResults(LottoTickets lottoTickets) { - List lottoResults = new ArrayList<>(); - for (LottoTicket ticket : lottoTickets.get()) { - lottoResults.add(getLottoResult(ticket)); + private void validateDuplicatedBonusNumber() { + if (this.basicLuckyTicket.isContain(bonusNumber)) { + throw new IllegalStateException( + String.format("보너스 숫자 %s는 기본 당첨번호와 중복 될 수 없습니다.", bonusNumber.toString()) + ); } - return new LottoResults(lottoResults); } - private LottoResult getLottoResult(LottoTicket lottoTicket) { - int matchCount = basicLuckyTicket.countMatchingNumbers(lottoTicket); + public LottoResult getLottoResult(LottoTicket lottoTicket) { + int matchCounts = lottoTicket.countMatchingNumbers(basicLuckyTicket); boolean isBonusMatched = lottoTicket.isContain(bonusNumber); - return LottoResult.find(matchCount, isBonusMatched); + return LottoResult.find(matchCounts, isBonusMatched); } + } diff --git a/src/main/java/com/javabom/lotto/domain/results/LottoResult.java b/src/main/java/com/javabom/lotto/domain/results/LottoResult.java index 2ec644c..759e1ac 100644 --- a/src/main/java/com/javabom/lotto/domain/results/LottoResult.java +++ b/src/main/java/com/javabom/lotto/domain/results/LottoResult.java @@ -1,8 +1,6 @@ package com.javabom.lotto.domain.results; import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; public enum LottoResult { @@ -14,38 +12,39 @@ public enum LottoResult { LOSE(-1, 0); private final int matchCount; - private final long price; + private final long prize; - LottoResult(int matchCount, long price) { + LottoResult(int matchCount, long prize) { this.matchCount = matchCount; - this.price = price; + this.prize = prize; } - public static LottoResult find(int matchCount, boolean isBonusMatched) { + public static LottoResult find(final int matchCount, final boolean isBonusMatched) { validateMatchCount(matchCount); - if (matchCount == SECOND_PRIZE.matchCount && isBonusMatched) { - return SECOND_PRIZE; + if (matchCount == SECOND_PRIZE.matchCount) { + return findByBonus(isBonusMatched); } - return valuesWithoutSecond().stream() + return Arrays.stream(values()) .filter(result -> result.matchCount == matchCount) .findFirst() .orElse(LOSE); } - private static void validateMatchCount(int matchCount) { + private static void validateMatchCount(final int matchCount) { if (matchCount < 0 || matchCount > 6) { throw new IllegalArgumentException("로또번호 매치 수는 0~6 이외일 수 없습니다."); } } - private static List valuesWithoutSecond() { - return Arrays.stream(values()) - .filter(result -> result != SECOND_PRIZE) - .collect(Collectors.toList()); + private static LottoResult findByBonus(final boolean isBonusMatched) { + if (isBonusMatched) { + return SECOND_PRIZE; + } + return THIRD_PRIZE; } - public long getPrice() { - return price; + public long getPrize() { + return prize; } public int getMatchCount() { diff --git a/src/main/java/com/javabom/lotto/domain/results/LottoResults.java b/src/main/java/com/javabom/lotto/domain/results/LottoResults.java index d8f9ad9..d758d60 100644 --- a/src/main/java/com/javabom/lotto/domain/results/LottoResults.java +++ b/src/main/java/com/javabom/lotto/domain/results/LottoResults.java @@ -22,7 +22,7 @@ public List findResultsOf(LottoResult lottoResult) { public Money getTotalPrizeMoney() { long sum = lottoResults.stream() - .mapToLong(LottoResult::getPrice) + .mapToLong(LottoResult::getPrize) .sum(); return new Money(sum); } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumberGenerator.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoNumberGenerator.java deleted file mode 100644 index f9b58be..0000000 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoNumberGenerator.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.javabom.lotto.domain.ticket; - -import java.util.List; - -public interface LottoNumberGenerator { - - List getLottoNumbers(); - -} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java index 4f3fdcb..8964179 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicket.java @@ -2,7 +2,6 @@ import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; public class LottoTicket { @@ -17,14 +16,16 @@ public LottoTicket(List numbers) { private void validateLottoNumbers(List numbers) { if (numbers.size() != LOTTO_NUM_PICK_SIZE) { - throw new IllegalArgumentException("로또 티켓에 6개 숫자를 넣어야 합니다. 입력 size : " + numbers.size()); + throw new IllegalArgumentException(String.format("로또 티켓에 6개 숫자를 넣어야 합니다. 입력 size : %d", numbers.size())); } } public int countMatchingNumbers(LottoTicket lottoTicket) { - return (int) lottoTicket.numbers.stream() - .filter(this.numbers::contains) - .count(); + int count = 0; + for (int i = 0; i < LOTTO_NUM_PICK_SIZE; i++) { + if (this.numbers.get(i).equals(lottoTicket.numbers.get(i))) count++; + } + return count; } public boolean isContain(LottoNumber number) { diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java index d6830cf..db0bfcf 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketDispenser.java @@ -6,26 +6,42 @@ public class LottoTicketDispenser { - public static final Money LOTTO_TICKET_PRICE = new Money(1_000); + private static final Money LOTTO_TICKET_PRICE = new Money(1_000); - private final LottoNumberGenerator lottoNumberGenerator; + private final LottoTicketGenerator lottoTicketGenerator; - public LottoTicketDispenser(LottoNumberGenerator lottoNumberGenerator) { - this.lottoNumberGenerator = lottoNumberGenerator; + public LottoTicketDispenser(LottoTicketGenerator lottoTicketGenerator) { + this.lottoTicketGenerator = lottoTicketGenerator; + } + + static public Money getTotalTicketPrice(int amount) { + return LOTTO_TICKET_PRICE.multiply(amount); } public LottoTickets getAutoTickets(Money inputMoney) { int quantity = inputMoney.calculateQuantityPer(LOTTO_TICKET_PRICE); List tickets = new ArrayList<>(); for (int i = 0; i < quantity; i++) { - tickets.add(new LottoTicket(lottoNumberGenerator.getLottoNumbers())); + LottoTicket lottoTicket = lottoTicketGenerator.getLottoTicket(); + tickets.add(lottoTicket); } return new LottoTickets(tickets); } - public LottoTickets getManualTickets(List manualNumbers) { + public LottoTickets getManualTickets(Money inputMoney, List manualNumbers) { + validateEnoughMoney(inputMoney, manualNumbers.size()); return new LottoTickets(manualNumbers.stream() .map(ManualLottoNumbers::toLottoTicket) .collect(Collectors.toList())); } + + private void validateEnoughMoney(Money inputMoney, int quantity) { + Money totalPrice = LOTTO_TICKET_PRICE.multiply(quantity); + if (totalPrice.isBiggerThan(inputMoney)) { + throw new IllegalStateException(String.format("%d개의 티켓을 사기에 돈이 모자랍니다. 넣은 금액 : %s", quantity, inputMoney.toString())); + } + } + // 여기서 그냥 inputMoney.spend(totalPrice); 한줄만 때리려했는데, (spend 내부에 금액 검사 로직이 있어서) + // 다른사람이 볼 때 이게뭐야? 할거같고, inputMoney내부의 상태값이 바뀌는듯한 인상을 주어 + // 이렇게 바꿨는데.. 어떻게 생각하시나요? } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketGenerator.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketGenerator.java new file mode 100644 index 0000000..4b615be --- /dev/null +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTicketGenerator.java @@ -0,0 +1,7 @@ +package com.javabom.lotto.domain.ticket; + +public interface LottoTicketGenerator { + + LottoTicket getLottoTicket(); + +} diff --git a/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java b/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java index 71ba81c..d732069 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/LottoTickets.java @@ -1,9 +1,14 @@ package com.javabom.lotto.domain.ticket; +import com.javabom.lotto.domain.results.LottoLuckyNumbers; +import com.javabom.lotto.domain.results.LottoResult; +import com.javabom.lotto.domain.results.LottoResults; + import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; public class LottoTickets { @@ -24,6 +29,12 @@ public LottoTickets add(LottoTickets lottoTickets) { return new LottoTickets(newTickets); } + public LottoResults getLottoResults(LottoLuckyNumbers lottoLuckyNumbers) { + return new LottoResults(tickets.stream() + .map(lottoLuckyNumbers::getLottoResult) + .collect(Collectors.toList())); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/javabom/lotto/domain/ticket/Money.java b/src/main/java/com/javabom/lotto/domain/ticket/Money.java index 1a111fe..4c7549d 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/Money.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/Money.java @@ -21,6 +21,10 @@ public Money multiply(int value) { return new Money(this.value * value); } + public boolean isBiggerThan(Money money) { + return this.value > money.value; + } + public Money spend(Money money) { validateCanSpendMoney(money); return new Money(this.value - money.value); @@ -28,7 +32,7 @@ public Money spend(Money money) { private void validateCanSpendMoney(Money money) { if (money.value > this.value) { - throw new IllegalArgumentException("현재 값 (" + value + ") 보다 사용하려는 금액 (" + money.value + ") 이 더 많습니다."); + throw new IllegalArgumentException(String.format("현재 값 (%d) 보다 사용하려는 금액 (%d) 이 더 많습니다.", value, money.value)); } } @@ -52,4 +56,9 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(value); } + + @Override + public String toString() { + return String.valueOf(value); + } } diff --git a/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java b/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoTicketGenerator.java similarity index 77% rename from src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java rename to src/main/java/com/javabom/lotto/domain/ticket/RandomLottoTicketGenerator.java index 0313da9..d6d2385 100644 --- a/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoNumberGenerator.java +++ b/src/main/java/com/javabom/lotto/domain/ticket/RandomLottoTicketGenerator.java @@ -6,13 +6,13 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -public class RandomLottoNumberGenerator implements LottoNumberGenerator { +public class RandomLottoTicketGenerator implements LottoTicketGenerator { private static final int LOTTO_NUM_PICK_SIZE = 6; private final List sortedLottoNumbers; - public RandomLottoNumberGenerator() { + public RandomLottoTicketGenerator() { sortedLottoNumbers = createSortedLottoNumbers(); } @@ -23,9 +23,9 @@ private List createSortedLottoNumbers() { } @Override - public List getLottoNumbers() { + public LottoTicket getLottoTicket() { List numbers = new ArrayList<>(sortedLottoNumbers); Collections.shuffle(numbers); - return numbers.subList(0, LOTTO_NUM_PICK_SIZE); + return new LottoTicket(numbers.subList(0, LOTTO_NUM_PICK_SIZE)); } } diff --git a/src/main/java/com/javabom/lotto/view/OutputView.java b/src/main/java/com/javabom/lotto/view/OutputView.java index 7b5aadd..aff7cb6 100644 --- a/src/main/java/com/javabom/lotto/view/OutputView.java +++ b/src/main/java/com/javabom/lotto/view/OutputView.java @@ -42,7 +42,7 @@ private static void printLottoResult(LottoResult result, long resultSize) { stringBuilder.append(NOTICE_MATCH_BONUS); } stringBuilder - .append(String.format(NOTICE_PRIZE_MONEY, result.getPrice())) + .append(String.format(NOTICE_PRIZE_MONEY, result.getPrize())) .append(String.format(NOTICE_MATCH_RESULT_QUANTITY, resultSize)); printLineOf(stringBuilder.toString()); } diff --git a/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java b/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java index db7520d..4ee31ab 100644 --- a/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java +++ b/src/test/java/com/javabom/lotto/domain/results/LottoLuckyNumbersTest.java @@ -35,7 +35,7 @@ void getLottoResults() { // when LottoTickets allMatchLottoTicket = new LottoTickets(Arrays.asList(new LottoTicket(stubLottoNumbers))); - LottoResults lottoResults = lottoLuckyNumbers.getLottoResults(allMatchLottoTicket); + LottoResults lottoResults = allMatchLottoTicket.getLottoResults(lottoLuckyNumbers); LottoResults expectedLottoResults = new LottoResults(Arrays.asList(FIRST_PRIZE)); // then diff --git a/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java b/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java index e34411e..ea7eead 100644 --- a/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java +++ b/src/test/java/com/javabom/lotto/domain/results/LottoResultsTest.java @@ -36,7 +36,7 @@ void getTotalPrizeMoney() { // given List lottoResultList = Arrays.asList(FOURTH_PRIZE, FIFTH_PRIZE); LottoResults lottoResults = new LottoResults(lottoResultList); - Money expectedTotalPrizeMoney = new Money(FOURTH_PRIZE.getPrice() + FIFTH_PRIZE.getPrice()); + Money expectedTotalPrizeMoney = new Money(FOURTH_PRIZE.getPrize() + FIFTH_PRIZE.getPrize()); // then assertThat(lottoResults.getTotalPrizeMoney()) diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java index 1b92525..73ef616 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java @@ -22,8 +22,8 @@ void getAutoTickets() { new LottoNumber(5), new LottoNumber(6) ); - LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(() -> stubLottoNumbers); LottoTicket stubLottoTicket = new LottoTicket(stubLottoNumbers); + LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(() -> stubLottoTicket); LottoTickets expectedLottoTickets = new LottoTickets(Arrays.asList(stubLottoTicket)); // when @@ -38,7 +38,7 @@ void getAutoTickets() { @Test void name() { // given - LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new RandomLottoNumberGenerator()); + LottoTicketDispenser lottoTicketDispenser = new LottoTicketDispenser(new RandomLottoTicketGenerator()); // when int expectedTicketQuantity = 1; From a8c58351e8f43188b5d3f889079aecfc87af436a Mon Sep 17 00:00:00 2001 From: Malibin Date: Wed, 10 Jun 2020 22:21:06 +0900 Subject: [PATCH 13/13] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ticket/LottoTicketDispenserTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java index 73ef616..cb61ee2 100644 --- a/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java +++ b/src/test/java/com/javabom/lotto/domain/ticket/LottoTicketDispenserTest.java @@ -3,10 +3,12 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.lang.reflect.Array; import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class LottoTicketDispenserTest { @@ -48,4 +50,47 @@ void name() { // then assertThat(lottoTickets.get()).hasSize(expectedTicketQuantity); } + + @DisplayName("돈이 발급 해야할 티켓보다 적을 경우") + @Test + void validateEnoughMoney() { + // given + Money money = new Money(1_000); + List stubManualNumbers = Arrays.asList( + new ManualLottoNumbers(Arrays.asList(1, 2, 3, 4, 5, 6)), + new ManualLottoNumbers(Arrays.asList(1, 2, 3, 4, 5, 6)) + ); + LottoTicketDispenser dispenser = new LottoTicketDispenser(new RandomLottoTicketGenerator()); + + // then + assertThatThrownBy(() -> dispenser.getManualTickets(money, stubManualNumbers)) + .isInstanceOf(IllegalStateException.class) + .hasMessage("2개의 티켓을 사기에 돈이 모자랍니다. 넣은 금액 : 1000"); + } + + @DisplayName("수동 티켓 발급 테스트") + @Test + void getManualTickets() { + // given + Money money = new Money(1_000); + List stubManualNumbers = Arrays.asList( + new ManualLottoNumbers(Arrays.asList(1, 2, 3, 4, 5, 6)) + ); + LottoTicket stubTicket = new LottoTicket(Arrays.asList( + new LottoNumber(1), + new LottoNumber(2), + new LottoNumber(3), + new LottoNumber(4), + new LottoNumber(5), + new LottoNumber(6) + )); + LottoTickets expectedTickets = new LottoTickets(Arrays.asList(stubTicket)); + LottoTicketDispenser dispenser = new LottoTicketDispenser(new RandomLottoTicketGenerator()); + + // when + LottoTickets manualTickets = dispenser.getManualTickets(money, stubManualNumbers); + + // then + assertThat(manualTickets).isEqualTo(expectedTickets); + } } \ No newline at end of file