From e1b19c9b7a76ecaff096f3b5ef6f7bc433160542 Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Tue, 27 Dec 2022 13:32:24 +0900 Subject: [PATCH 01/13] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoApplication.kt | 7 ++++--- .../lotto/{ => domain}/LottoNumberSelector.kt | 2 +- src/main/kotlin/lotto/domain/LottoTicket.kt | 2 -- .../kotlin/lotto/domain/LottoTicketBundle.kt | 3 ++- src/main/kotlin/lotto/domain/LottoWinning.kt | 9 ++------- .../domain/StatisticalResultExtractor.kt | 1 - .../{ => domain}/WinningNumberExtractor.kt | 19 +++++-------------- .../{ => domain}/LottoNumberSelectorTest.kt | 2 +- .../domain/StatisticalResultExtractorTest.kt | 1 - .../WinningNumberExtractorTest.kt | 10 +++------- 10 files changed, 18 insertions(+), 38 deletions(-) rename src/main/kotlin/lotto/{ => domain}/LottoNumberSelector.kt (96%) rename src/main/kotlin/lotto/{ => domain}/WinningNumberExtractor.kt (53%) rename src/test/kotlin/lotto/{ => domain}/LottoNumberSelectorTest.kt (92%) rename src/test/kotlin/lotto/{ => domain}/WinningNumberExtractorTest.kt (71%) diff --git a/src/main/kotlin/lotto/LottoApplication.kt b/src/main/kotlin/lotto/LottoApplication.kt index f86a101861..f0a8a77711 100644 --- a/src/main/kotlin/lotto/LottoApplication.kt +++ b/src/main/kotlin/lotto/LottoApplication.kt @@ -2,17 +2,18 @@ package lotto import lotto.domain.LottoTicketBundle import lotto.domain.StatisticalResultExtractor +import lotto.domain.WinningNumberExtractor import lotto.domain.WinningNumbers import lotto.view.InputView import lotto.view.OutputView fun main() { val ticketAmount = InputView.getPurchaseAmount() - val lottoTicketBundle = LottoTicketBundle(ticketAmount).lottoTickets - InputView.getNumberOfPurchases(lottoTicketBundle.size) + val lottoTicketBundle = LottoTicketBundle(ticketAmount) + InputView.getNumberOfPurchases(lottoTicketBundle.lottoTickets.size) val winningNumber = InputView.getWinningNumber() val lottoWinning = WinningNumberExtractor.process( lottoTicketBundle, WinningNumbers(winningNumber.first, winningNumber.second) ) - OutputView.printOutput(StatisticalResultExtractor(lottoWinning), lottoTicketBundle.size) + OutputView.printOutput(StatisticalResultExtractor(lottoWinning), lottoTicketBundle.lottoTickets.size) } diff --git a/src/main/kotlin/lotto/LottoNumberSelector.kt b/src/main/kotlin/lotto/domain/LottoNumberSelector.kt similarity index 96% rename from src/main/kotlin/lotto/LottoNumberSelector.kt rename to src/main/kotlin/lotto/domain/LottoNumberSelector.kt index 3c202c3077..385f27c97f 100644 --- a/src/main/kotlin/lotto/LottoNumberSelector.kt +++ b/src/main/kotlin/lotto/domain/LottoNumberSelector.kt @@ -1,4 +1,4 @@ -package lotto +package lotto.domain import lotto.common.LottoTicketPolicy.END_NUMBER import lotto.common.LottoTicketPolicy.MAX_LOTTO_NUMBER_SIZE diff --git a/src/main/kotlin/lotto/domain/LottoTicket.kt b/src/main/kotlin/lotto/domain/LottoTicket.kt index 397e151efc..0260b8778a 100644 --- a/src/main/kotlin/lotto/domain/LottoTicket.kt +++ b/src/main/kotlin/lotto/domain/LottoTicket.kt @@ -1,7 +1,5 @@ package lotto.domain -import lotto.LottoNumberSelector - data class LottoTicket( val numbers: Set = LottoNumberSelector.select(), ) : Set by numbers diff --git a/src/main/kotlin/lotto/domain/LottoTicketBundle.kt b/src/main/kotlin/lotto/domain/LottoTicketBundle.kt index d3db20b910..df25ed4e8a 100644 --- a/src/main/kotlin/lotto/domain/LottoTicketBundle.kt +++ b/src/main/kotlin/lotto/domain/LottoTicketBundle.kt @@ -2,8 +2,9 @@ package lotto.domain import lotto.common.LottoTicketPolicy -class LottoTicketBundle(amount: Int) { +data class LottoTicketBundle(val amount: Int) { private val count = amount / LottoTicketPolicy.PRICE + val lottoTickets: List = List(count) { LottoTicket() } diff --git a/src/main/kotlin/lotto/domain/LottoWinning.kt b/src/main/kotlin/lotto/domain/LottoWinning.kt index 54f5dbfa24..a81c5f0cc1 100644 --- a/src/main/kotlin/lotto/domain/LottoWinning.kt +++ b/src/main/kotlin/lotto/domain/LottoWinning.kt @@ -1,16 +1,11 @@ package lotto.domain -import lotto.TicketResult - data class LottoWinning( val result: Map, ) { fun totalAmount(): Long { - var totalAmount = 0L - result.entries.map { - totalAmount += WinningAmount.from(it.key.matchCount, it.key.isBonusBallMatched).amount * it.value + return result.entries.sumOf { + WinningAmount.from(it.key.matchCount, it.key.isBonusBallMatched).amount * it.value } - - return totalAmount } } diff --git a/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt b/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt index d4dd5bad8f..861bce6824 100644 --- a/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt +++ b/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt @@ -1,6 +1,5 @@ package lotto.domain -import lotto.TicketResult import lotto.common.LottoTicketPolicy class StatisticalResultExtractor( diff --git a/src/main/kotlin/lotto/WinningNumberExtractor.kt b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt similarity index 53% rename from src/main/kotlin/lotto/WinningNumberExtractor.kt rename to src/main/kotlin/lotto/domain/WinningNumberExtractor.kt index 43caf8bbf3..60f5e88270 100644 --- a/src/main/kotlin/lotto/WinningNumberExtractor.kt +++ b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt @@ -1,22 +1,13 @@ -package lotto - -import lotto.domain.LottoTicket -import lotto.domain.LottoWinning -import lotto.domain.WinningNumbers -import java.util.Comparator +package lotto.domain object WinningNumberExtractor { - fun process(tickets: List, winningNumbers: WinningNumbers): LottoWinning { + fun process(lottoTicketBundle: LottoTicketBundle, winningNumbers: WinningNumbers): LottoWinning { val resultMap = mutableMapOf() - tickets.forEach { ticket -> + lottoTicketBundle.lottoTickets.groupingBy { ticket -> val intersectNumbers = ticket.intersect(winningNumbers) val isBonusBallMatched = winningNumbers.bonusBall in ticket - val ticketResult = TicketResult(intersectNumbers.size, isBonusBallMatched) - - resultMap[ticketResult] - ?.let { resultMap[ticketResult] = it.inc() } - ?: run { resultMap.put(ticketResult, 1) } - } + TicketResult(intersectNumbers.size, isBonusBallMatched) + }.eachCountTo(resultMap) return LottoWinning(resultMap.toSortedMap(getTicketResultComparator())) } diff --git a/src/test/kotlin/lotto/LottoNumberSelectorTest.kt b/src/test/kotlin/lotto/domain/LottoNumberSelectorTest.kt similarity index 92% rename from src/test/kotlin/lotto/LottoNumberSelectorTest.kt rename to src/test/kotlin/lotto/domain/LottoNumberSelectorTest.kt index 2691e32d8a..dfe28668b3 100644 --- a/src/test/kotlin/lotto/LottoNumberSelectorTest.kt +++ b/src/test/kotlin/lotto/domain/LottoNumberSelectorTest.kt @@ -1,4 +1,4 @@ -package lotto +package lotto.domain import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe diff --git a/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt b/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt index 0cce673426..5b1c2e2255 100644 --- a/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt @@ -2,7 +2,6 @@ package lotto.domain import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe -import lotto.TicketResult internal class StatisticalResultExtractorTest : BehaviorSpec({ Given("로또 당첨 개수가 ") { diff --git a/src/test/kotlin/lotto/WinningNumberExtractorTest.kt b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt similarity index 71% rename from src/test/kotlin/lotto/WinningNumberExtractorTest.kt rename to src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt index a487df8881..4ad11fe620 100644 --- a/src/test/kotlin/lotto/WinningNumberExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt @@ -1,12 +1,10 @@ -package lotto +package lotto.domain import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe import io.mockk.every import io.mockk.mockkObject import io.mockk.unmockkObject -import lotto.domain.LottoTicketBundle -import lotto.domain.WinningNumbers import lotto.utils.RandomNumberGenerator internal class WinningNumberExtractorTest : StringSpec({ @@ -15,8 +13,7 @@ internal class WinningNumberExtractorTest : StringSpec({ mockkObject(RandomNumberGenerator) every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 6) - val tickets = LottoTicketBundle(amount).lottoTickets - val lottoWinning = WinningNumberExtractor.process(tickets, WinningNumbers(setOf(1, 2, 3, 4, 5, 6), 7)) + val lottoWinning = WinningNumberExtractor.process(LottoTicketBundle(amount), WinningNumbers(setOf(1, 2, 3, 4, 5, 6), 7)) val ticketResult = TicketResult(6, false) lottoWinning.result[ticketResult] shouldBe 1 @@ -29,8 +26,7 @@ internal class WinningNumberExtractorTest : StringSpec({ mockkObject(RandomNumberGenerator) every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 7) - val tickets = LottoTicketBundle(amount).lottoTickets - val lottoWinning = WinningNumberExtractor.process(tickets, WinningNumbers(setOf(1, 2, 3, 4, 5, 6), 7)) + val lottoWinning = WinningNumberExtractor.process(LottoTicketBundle(amount), WinningNumbers(setOf(1, 2, 3, 4, 5, 6), 7)) val ticketResult = TicketResult(5, true) lottoWinning.result[ticketResult] shouldBe 1 From 3996fc974d9de9a6cec7f7e0ca835b0598cb1f35 Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Tue, 27 Dec 2022 14:20:51 +0900 Subject: [PATCH 02/13] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=84=98?= =?UTF-8?q?=EB=B2=84=20=EC=9D=BC=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/domain/LottoNumber.kt | 13 +++++++++++ .../lotto/domain/LottoNumberSelector.kt | 8 +++---- src/main/kotlin/lotto/domain/LottoTicket.kt | 4 ++-- .../kotlin/lotto/domain/WinningNumbers.kt | 6 ++--- src/main/kotlin/lotto/view/InputView.kt | 8 ++++--- .../kotlin/lotto/domain/LottoNumberTest.kt | 12 ++++++++++ .../domain/WinningNumberExtractorTest.kt | 22 +++++++++++++++++-- 7 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 src/main/kotlin/lotto/domain/LottoNumber.kt create mode 100644 src/test/kotlin/lotto/domain/LottoNumberTest.kt diff --git a/src/main/kotlin/lotto/domain/LottoNumber.kt b/src/main/kotlin/lotto/domain/LottoNumber.kt new file mode 100644 index 0000000000..cbdb46127b --- /dev/null +++ b/src/main/kotlin/lotto/domain/LottoNumber.kt @@ -0,0 +1,13 @@ +package lotto.domain + +import lotto.common.LottoTicketPolicy.END_NUMBER +import lotto.common.LottoTicketPolicy.START_NUMBER + +@JvmInline +value class LottoNumber( + val number: Int, +) { + init { + require(number in START_NUMBER..END_NUMBER) { "로또 번호는 1~45 사이의 숫자만 가능합니다." } + } +} diff --git a/src/main/kotlin/lotto/domain/LottoNumberSelector.kt b/src/main/kotlin/lotto/domain/LottoNumberSelector.kt index 385f27c97f..ff5f50be3e 100644 --- a/src/main/kotlin/lotto/domain/LottoNumberSelector.kt +++ b/src/main/kotlin/lotto/domain/LottoNumberSelector.kt @@ -6,14 +6,14 @@ import lotto.common.LottoTicketPolicy.START_NUMBER import lotto.utils.RandomNumberGenerator object LottoNumberSelector { - fun select(): Set { - val lottoNumbers = mutableSetOf() + fun select(): Set { + val lottoNumbers = mutableSetOf() while (lottoNumbers.size < MAX_LOTTO_NUMBER_SIZE) { - lottoNumbers.add(generateRandomNumber()) + lottoNumbers.add(generateLottoNumber()) } return lottoNumbers } - private fun generateRandomNumber() = RandomNumberGenerator.generate(START_NUMBER..END_NUMBER) + private fun generateLottoNumber() = LottoNumber(RandomNumberGenerator.generate(START_NUMBER..END_NUMBER)) } diff --git a/src/main/kotlin/lotto/domain/LottoTicket.kt b/src/main/kotlin/lotto/domain/LottoTicket.kt index 0260b8778a..a17e9f919d 100644 --- a/src/main/kotlin/lotto/domain/LottoTicket.kt +++ b/src/main/kotlin/lotto/domain/LottoTicket.kt @@ -1,5 +1,5 @@ package lotto.domain data class LottoTicket( - val numbers: Set = LottoNumberSelector.select(), -) : Set by numbers + val numbers: Set = LottoNumberSelector.select(), +) : Set by numbers diff --git a/src/main/kotlin/lotto/domain/WinningNumbers.kt b/src/main/kotlin/lotto/domain/WinningNumbers.kt index 8c6a62f638..d8f8ce26c3 100644 --- a/src/main/kotlin/lotto/domain/WinningNumbers.kt +++ b/src/main/kotlin/lotto/domain/WinningNumbers.kt @@ -1,6 +1,6 @@ package lotto.domain data class WinningNumbers( - val numbers: Set, - val bonusBall: Int, -) : Set by numbers + val lottoNumbers: Set, + val bonusBall: LottoNumber, +) : Set by lottoNumbers diff --git a/src/main/kotlin/lotto/view/InputView.kt b/src/main/kotlin/lotto/view/InputView.kt index 89d8756529..ae31b40769 100644 --- a/src/main/kotlin/lotto/view/InputView.kt +++ b/src/main/kotlin/lotto/view/InputView.kt @@ -1,5 +1,7 @@ package lotto.view +import lotto.domain.LottoNumber + object InputView { fun getPurchaseAmount(): Int { println("구매금액을 입력해 주세요.") @@ -13,16 +15,16 @@ object InputView { println("$count 개를 구매했습니다.") } - fun getWinningNumber(): Pair, Int> { + fun getWinningNumber(): Pair, LottoNumber> { println("지난 주 당첨 번호를 입력해 주세요.") val winningNumber = readln() require(winningNumber.isNotEmpty()) { "당첨 번호를 입력해주세요." } - val numbers = winningNumber.split(", ").map { it.toInt() }.toSet() + val numbers = winningNumber.split(", ").map { LottoNumber(it.toInt()) }.toSet() require(numbers.size == 6) { " 중복없는 6개의 숫자를 입력해주세요." } println("보너스 볼을 입력해 주세요.") - val bonusBall = readln().toInt() + val bonusBall = LottoNumber(readln().toInt()) require(!numbers.contains(bonusBall)) { "보너스 볼은 당첨 번호와 중복될 수 없습니다." } return numbers to bonusBall diff --git a/src/test/kotlin/lotto/domain/LottoNumberTest.kt b/src/test/kotlin/lotto/domain/LottoNumberTest.kt new file mode 100644 index 0000000000..0daf132e7a --- /dev/null +++ b/src/test/kotlin/lotto/domain/LottoNumberTest.kt @@ -0,0 +1,12 @@ +package lotto.domain + +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.StringSpec + +internal class LottoNumberTest : StringSpec({ + "로또 번호는 1~45 사이의 숫자만 가능하다." { + shouldThrow { + LottoNumber(46) + } + } +}) diff --git a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt index 4ad11fe620..ad780070ab 100644 --- a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt @@ -13,7 +13,16 @@ internal class WinningNumberExtractorTest : StringSpec({ mockkObject(RandomNumberGenerator) every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 6) - val lottoWinning = WinningNumberExtractor.process(LottoTicketBundle(amount), WinningNumbers(setOf(1, 2, 3, 4, 5, 6), 7)) + val lottoWinning = WinningNumberExtractor.process( + LottoTicketBundle(amount), + WinningNumbers( + setOf( + LottoNumber(1), LottoNumber(2), LottoNumber(3), + LottoNumber(4), LottoNumber(5), LottoNumber(6) + ), + LottoNumber(7) + ) + ) val ticketResult = TicketResult(6, false) lottoWinning.result[ticketResult] shouldBe 1 @@ -26,7 +35,16 @@ internal class WinningNumberExtractorTest : StringSpec({ mockkObject(RandomNumberGenerator) every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 7) - val lottoWinning = WinningNumberExtractor.process(LottoTicketBundle(amount), WinningNumbers(setOf(1, 2, 3, 4, 5, 6), 7)) + val lottoWinning = WinningNumberExtractor.process( + LottoTicketBundle(amount), + WinningNumbers( + setOf( + LottoNumber(1), LottoNumber(2), LottoNumber(3), + LottoNumber(4), LottoNumber(5), LottoNumber(6) + ), + LottoNumber(7) + ) + ) val ticketResult = TicketResult(5, true) lottoWinning.result[ticketResult] shouldBe 1 From ac84773b103dcc3fb10df2e7bf6f7e3ea070c5ae Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Tue, 27 Dec 2022 14:40:28 +0900 Subject: [PATCH 03/13] =?UTF-8?q?chore:=20LottoWinning=20->=20LottoWinning?= =?UTF-8?q?Result=EB=A1=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/{LottoWinning.kt => LottoWinningResult.kt} | 2 +- .../kotlin/lotto/domain/StatisticalResultExtractor.kt | 6 +++--- .../kotlin/lotto/domain/StatisticalResultExtractorTest.kt | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) rename src/main/kotlin/lotto/domain/{LottoWinning.kt => LottoWinningResult.kt} (88%) diff --git a/src/main/kotlin/lotto/domain/LottoWinning.kt b/src/main/kotlin/lotto/domain/LottoWinningResult.kt similarity index 88% rename from src/main/kotlin/lotto/domain/LottoWinning.kt rename to src/main/kotlin/lotto/domain/LottoWinningResult.kt index a81c5f0cc1..338356cb80 100644 --- a/src/main/kotlin/lotto/domain/LottoWinning.kt +++ b/src/main/kotlin/lotto/domain/LottoWinningResult.kt @@ -1,6 +1,6 @@ package lotto.domain -data class LottoWinning( +data class LottoWinningResult( val result: Map, ) { fun totalAmount(): Long { diff --git a/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt b/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt index 861bce6824..37cc99f957 100644 --- a/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt +++ b/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt @@ -3,15 +3,15 @@ package lotto.domain import lotto.common.LottoTicketPolicy class StatisticalResultExtractor( - private val lottoWinning: LottoWinning, + private val lottoWinningResult: LottoWinningResult, ) { fun getMatchCount(winningAmount: WinningAmount): Int { val ticketResult = TicketResult(winningAmount.count, winningAmount.isBonusBallMatched) - return lottoWinning.result[ticketResult] ?: ZERO_COUNT + return lottoWinningResult.result[ticketResult] ?: ZERO_COUNT } fun getTotalRateOfReturn(ticketCount: Int): Double { - return lottoWinning.totalAmount() / (ticketCount * LottoTicketPolicy.PRICE).toDouble() + return lottoWinningResult.totalAmount() / (ticketCount * LottoTicketPolicy.PRICE).toDouble() } companion object { diff --git a/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt b/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt index 5b1c2e2255..c57f3c6d81 100644 --- a/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt @@ -6,8 +6,8 @@ import io.kotest.matchers.shouldBe internal class StatisticalResultExtractorTest : BehaviorSpec({ Given("로또 당첨 개수가 ") { val ticketResult = TicketResult(3, false) - val lottoWinning = LottoWinning(mapOf(ticketResult to 4)) - val statisticalResultExtractor = StatisticalResultExtractor(lottoWinning) + val lottoWinningResult = LottoWinningResult(mapOf(ticketResult to 4)) + val statisticalResultExtractor = StatisticalResultExtractor(lottoWinningResult) When("하나 이상 존재한다면, ") { val matchCount = statisticalResultExtractor.getMatchCount(WinningAmount.THREE) Then("몇개의 티켓이 존재하는지 가져온다.") { @@ -25,8 +25,8 @@ internal class StatisticalResultExtractorTest : BehaviorSpec({ Given("로또의") { val ticketResult = TicketResult(3, false) - val lottoWinning = LottoWinning(mapOf(ticketResult to 2)) - val statisticalResultExtractor = StatisticalResultExtractor(lottoWinning) + val lottoWinningResult = LottoWinningResult(mapOf(ticketResult to 2)) + val statisticalResultExtractor = StatisticalResultExtractor(lottoWinningResult) When("당첨 금액에 따른") { val totalRateOfReturn = statisticalResultExtractor.getTotalRateOfReturn(20) Then("수익률을 계산할 수 있다.") { From b986fd379a3ccc3c89d47b5bac57d7ef41211658 Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Tue, 27 Dec 2022 14:40:52 +0900 Subject: [PATCH 04/13] =?UTF-8?q?chore:=20WinningNumbers=20->=20WinningBal?= =?UTF-8?q?ls=EB=A1=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoApplication.kt | 6 +++--- .../domain/{WinningNumbers.kt => WinningBalls.kt} | 2 +- src/main/kotlin/lotto/domain/WinningNumberExtractor.kt | 8 ++++---- src/main/kotlin/lotto/view/InputView.kt | 10 +++++----- .../kotlin/lotto/domain/WinningNumberExtractorTest.kt | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) rename src/main/kotlin/lotto/domain/{WinningNumbers.kt => WinningBalls.kt} (82%) diff --git a/src/main/kotlin/lotto/LottoApplication.kt b/src/main/kotlin/lotto/LottoApplication.kt index f0a8a77711..46f4c5bfb7 100644 --- a/src/main/kotlin/lotto/LottoApplication.kt +++ b/src/main/kotlin/lotto/LottoApplication.kt @@ -3,7 +3,7 @@ package lotto import lotto.domain.LottoTicketBundle import lotto.domain.StatisticalResultExtractor import lotto.domain.WinningNumberExtractor -import lotto.domain.WinningNumbers +import lotto.domain.WinningBalls import lotto.view.InputView import lotto.view.OutputView @@ -11,9 +11,9 @@ fun main() { val ticketAmount = InputView.getPurchaseAmount() val lottoTicketBundle = LottoTicketBundle(ticketAmount) InputView.getNumberOfPurchases(lottoTicketBundle.lottoTickets.size) - val winningNumber = InputView.getWinningNumber() + val winningBalls = InputView.getWinningBalls() val lottoWinning = WinningNumberExtractor.process( - lottoTicketBundle, WinningNumbers(winningNumber.first, winningNumber.second) + lottoTicketBundle, WinningBalls(winningBalls.first, winningBalls.second) ) OutputView.printOutput(StatisticalResultExtractor(lottoWinning), lottoTicketBundle.lottoTickets.size) } diff --git a/src/main/kotlin/lotto/domain/WinningNumbers.kt b/src/main/kotlin/lotto/domain/WinningBalls.kt similarity index 82% rename from src/main/kotlin/lotto/domain/WinningNumbers.kt rename to src/main/kotlin/lotto/domain/WinningBalls.kt index d8f8ce26c3..f26c1a9ccc 100644 --- a/src/main/kotlin/lotto/domain/WinningNumbers.kt +++ b/src/main/kotlin/lotto/domain/WinningBalls.kt @@ -1,6 +1,6 @@ package lotto.domain -data class WinningNumbers( +data class WinningBalls( val lottoNumbers: Set, val bonusBall: LottoNumber, ) : Set by lottoNumbers diff --git a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt index 60f5e88270..7187264ab7 100644 --- a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt +++ b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt @@ -1,15 +1,15 @@ package lotto.domain object WinningNumberExtractor { - fun process(lottoTicketBundle: LottoTicketBundle, winningNumbers: WinningNumbers): LottoWinning { + fun process(lottoTicketBundle: LottoTicketBundle, winningBalls: WinningBalls): LottoWinningResult { val resultMap = mutableMapOf() lottoTicketBundle.lottoTickets.groupingBy { ticket -> - val intersectNumbers = ticket.intersect(winningNumbers) - val isBonusBallMatched = winningNumbers.bonusBall in ticket + val intersectNumbers = ticket.intersect(winningBalls) + val isBonusBallMatched = winningBalls.bonusBall in ticket TicketResult(intersectNumbers.size, isBonusBallMatched) }.eachCountTo(resultMap) - return LottoWinning(resultMap.toSortedMap(getTicketResultComparator())) + return LottoWinningResult(resultMap.toSortedMap(getTicketResultComparator())) } private fun getTicketResultComparator(): Comparator = diff --git a/src/main/kotlin/lotto/view/InputView.kt b/src/main/kotlin/lotto/view/InputView.kt index ae31b40769..6fd332ede8 100644 --- a/src/main/kotlin/lotto/view/InputView.kt +++ b/src/main/kotlin/lotto/view/InputView.kt @@ -15,18 +15,18 @@ object InputView { println("$count 개를 구매했습니다.") } - fun getWinningNumber(): Pair, LottoNumber> { + fun getWinningBalls(): Pair, LottoNumber> { println("지난 주 당첨 번호를 입력해 주세요.") val winningNumber = readln() require(winningNumber.isNotEmpty()) { "당첨 번호를 입력해주세요." } - val numbers = winningNumber.split(", ").map { LottoNumber(it.toInt()) }.toSet() - require(numbers.size == 6) { " 중복없는 6개의 숫자를 입력해주세요." } + val winningBalls = winningNumber.split(", ").map { LottoNumber(it.toInt()) }.toSet() + require(winningBalls.size == 6) { " 중복없는 6개의 숫자를 입력해주세요." } println("보너스 볼을 입력해 주세요.") val bonusBall = LottoNumber(readln().toInt()) - require(!numbers.contains(bonusBall)) { "보너스 볼은 당첨 번호와 중복될 수 없습니다." } + require(!winningBalls.contains(bonusBall)) { "보너스 볼은 당첨 번호와 중복될 수 없습니다." } - return numbers to bonusBall + return winningBalls to bonusBall } } diff --git a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt index ad780070ab..68e95bce48 100644 --- a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt @@ -15,7 +15,7 @@ internal class WinningNumberExtractorTest : StringSpec({ every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 6) val lottoWinning = WinningNumberExtractor.process( LottoTicketBundle(amount), - WinningNumbers( + WinningBalls( setOf( LottoNumber(1), LottoNumber(2), LottoNumber(3), LottoNumber(4), LottoNumber(5), LottoNumber(6) @@ -37,7 +37,7 @@ internal class WinningNumberExtractorTest : StringSpec({ every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 7) val lottoWinning = WinningNumberExtractor.process( LottoTicketBundle(amount), - WinningNumbers( + WinningBalls( setOf( LottoNumber(1), LottoNumber(2), LottoNumber(3), LottoNumber(4), LottoNumber(5), LottoNumber(6) From 1c8d75d7e355d4786e41616ed1f5b92d3d413a02 Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Tue, 27 Dec 2022 14:59:34 +0900 Subject: [PATCH 05/13] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8(WinningBalls)=20=EC=9D=BC=EA=B8=89=20=EC=BB=AC?= =?UTF-8?q?=EB=A0=89=EC=85=98=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoApplication.kt | 9 +++------ .../kotlin/lotto/domain/WinningBallResult.kt | 10 ++++++++++ src/main/kotlin/lotto/domain/WinningBalls.kt | 9 ++++++--- .../lotto/domain/WinningNumberExtractor.kt | 6 +++--- src/main/kotlin/lotto/view/InputView.kt | 12 +++++------ .../domain/WinningNumberExtractorTest.kt | 20 +++++++++++-------- 6 files changed, 39 insertions(+), 27 deletions(-) create mode 100644 src/main/kotlin/lotto/domain/WinningBallResult.kt diff --git a/src/main/kotlin/lotto/LottoApplication.kt b/src/main/kotlin/lotto/LottoApplication.kt index 46f4c5bfb7..3c7d4f7255 100644 --- a/src/main/kotlin/lotto/LottoApplication.kt +++ b/src/main/kotlin/lotto/LottoApplication.kt @@ -3,7 +3,6 @@ package lotto import lotto.domain.LottoTicketBundle import lotto.domain.StatisticalResultExtractor import lotto.domain.WinningNumberExtractor -import lotto.domain.WinningBalls import lotto.view.InputView import lotto.view.OutputView @@ -11,9 +10,7 @@ fun main() { val ticketAmount = InputView.getPurchaseAmount() val lottoTicketBundle = LottoTicketBundle(ticketAmount) InputView.getNumberOfPurchases(lottoTicketBundle.lottoTickets.size) - val winningBalls = InputView.getWinningBalls() - val lottoWinning = WinningNumberExtractor.process( - lottoTicketBundle, WinningBalls(winningBalls.first, winningBalls.second) - ) - OutputView.printOutput(StatisticalResultExtractor(lottoWinning), lottoTicketBundle.lottoTickets.size) + val winningBallResult = InputView.getWinningBalls() + val lottoWinningResult = WinningNumberExtractor.process(lottoTicketBundle, winningBallResult) + OutputView.printOutput(StatisticalResultExtractor(lottoWinningResult), lottoTicketBundle.lottoTickets.size) } diff --git a/src/main/kotlin/lotto/domain/WinningBallResult.kt b/src/main/kotlin/lotto/domain/WinningBallResult.kt new file mode 100644 index 0000000000..50a942a27d --- /dev/null +++ b/src/main/kotlin/lotto/domain/WinningBallResult.kt @@ -0,0 +1,10 @@ +package lotto.domain + +data class WinningBallResult( + val winningBalls: WinningBalls, + val bonusBall: LottoNumber, +) { + init { + require(!winningBalls.contains(bonusBall)) { "보너스 볼은 당첨 번호와 중복될 수 없습니다." } + } +} diff --git a/src/main/kotlin/lotto/domain/WinningBalls.kt b/src/main/kotlin/lotto/domain/WinningBalls.kt index f26c1a9ccc..a38068326e 100644 --- a/src/main/kotlin/lotto/domain/WinningBalls.kt +++ b/src/main/kotlin/lotto/domain/WinningBalls.kt @@ -1,6 +1,9 @@ package lotto.domain data class WinningBalls( - val lottoNumbers: Set, - val bonusBall: LottoNumber, -) : Set by lottoNumbers + val balls: Set, +) : Set by balls { + init { + require(balls.size == 6) { "당첨 번호는 중복이 없어야 합니다." } + } +} diff --git a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt index 7187264ab7..b1f0020f60 100644 --- a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt +++ b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt @@ -1,11 +1,11 @@ package lotto.domain object WinningNumberExtractor { - fun process(lottoTicketBundle: LottoTicketBundle, winningBalls: WinningBalls): LottoWinningResult { + fun process(lottoTicketBundle: LottoTicketBundle, winningBallResult: WinningBallResult): LottoWinningResult { val resultMap = mutableMapOf() lottoTicketBundle.lottoTickets.groupingBy { ticket -> - val intersectNumbers = ticket.intersect(winningBalls) - val isBonusBallMatched = winningBalls.bonusBall in ticket + val intersectNumbers = ticket.intersect(winningBallResult.winningBalls) + val isBonusBallMatched = winningBallResult.bonusBall in ticket TicketResult(intersectNumbers.size, isBonusBallMatched) }.eachCountTo(resultMap) diff --git a/src/main/kotlin/lotto/view/InputView.kt b/src/main/kotlin/lotto/view/InputView.kt index 6fd332ede8..2de83f193d 100644 --- a/src/main/kotlin/lotto/view/InputView.kt +++ b/src/main/kotlin/lotto/view/InputView.kt @@ -1,6 +1,8 @@ package lotto.view import lotto.domain.LottoNumber +import lotto.domain.WinningBallResult +import lotto.domain.WinningBalls object InputView { fun getPurchaseAmount(): Int { @@ -15,18 +17,14 @@ object InputView { println("$count 개를 구매했습니다.") } - fun getWinningBalls(): Pair, LottoNumber> { + fun getWinningBalls(): WinningBallResult { println("지난 주 당첨 번호를 입력해 주세요.") val winningNumber = readln() require(winningNumber.isNotEmpty()) { "당첨 번호를 입력해주세요." } - - val winningBalls = winningNumber.split(", ").map { LottoNumber(it.toInt()) }.toSet() - require(winningBalls.size == 6) { " 중복없는 6개의 숫자를 입력해주세요." } - + val winningBalls = WinningBalls(winningNumber.split(", ").map { LottoNumber(it.toInt()) }.toSet()) println("보너스 볼을 입력해 주세요.") val bonusBall = LottoNumber(readln().toInt()) - require(!winningBalls.contains(bonusBall)) { "보너스 볼은 당첨 번호와 중복될 수 없습니다." } - return winningBalls to bonusBall + return WinningBallResult(winningBalls, bonusBall) } } diff --git a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt index 68e95bce48..3ae1790a05 100644 --- a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt @@ -15,10 +15,12 @@ internal class WinningNumberExtractorTest : StringSpec({ every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 6) val lottoWinning = WinningNumberExtractor.process( LottoTicketBundle(amount), - WinningBalls( - setOf( - LottoNumber(1), LottoNumber(2), LottoNumber(3), - LottoNumber(4), LottoNumber(5), LottoNumber(6) + WinningBallResult( + WinningBalls( + setOf( + LottoNumber(1), LottoNumber(2), LottoNumber(3), + LottoNumber(4), LottoNumber(5), LottoNumber(6) + ) ), LottoNumber(7) ) @@ -37,10 +39,12 @@ internal class WinningNumberExtractorTest : StringSpec({ every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 7) val lottoWinning = WinningNumberExtractor.process( LottoTicketBundle(amount), - WinningBalls( - setOf( - LottoNumber(1), LottoNumber(2), LottoNumber(3), - LottoNumber(4), LottoNumber(5), LottoNumber(6) + WinningBallResult( + WinningBalls( + setOf( + LottoNumber(1), LottoNumber(2), LottoNumber(3), + LottoNumber(4), LottoNumber(5), LottoNumber(6) + ) ), LottoNumber(7) ) From 6bb4ae482392d9e792d43de90ec92f5dbf155df3 Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Tue, 27 Dec 2022 15:03:20 +0900 Subject: [PATCH 06/13] =?UTF-8?q?chore:=20TicketResult=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/domain/TickeResult.kt | 6 ++++++ src/main/kotlin/lotto/domain/WinningNumberExtractor.kt | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 src/main/kotlin/lotto/domain/TickeResult.kt diff --git a/src/main/kotlin/lotto/domain/TickeResult.kt b/src/main/kotlin/lotto/domain/TickeResult.kt new file mode 100644 index 0000000000..923f00beb1 --- /dev/null +++ b/src/main/kotlin/lotto/domain/TickeResult.kt @@ -0,0 +1,6 @@ +package lotto.domain + +data class TicketResult( + val matchCount: Int, + val isBonusBallMatched: Boolean, +) diff --git a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt index b1f0020f60..c4194ca920 100644 --- a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt +++ b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt @@ -16,8 +16,3 @@ object WinningNumberExtractor { Comparator.comparing(TicketResult::matchCount) .thenComparing(TicketResult::isBonusBallMatched) } - -data class TicketResult( - val matchCount: Int, - val isBonusBallMatched: Boolean, -) From 974b68838e3bdd4a580587a56a0fe71f99167e8e Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Tue, 27 Dec 2022 15:06:56 +0900 Subject: [PATCH 07/13] =?UTF-8?q?chore:=20TicketResult=20->=20LottoTicketR?= =?UTF-8?q?esult=EB=A1=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/{TickeResult.kt => LottoTicketResult.kt} | 2 +- src/main/kotlin/lotto/domain/LottoWinningResult.kt | 2 +- .../kotlin/lotto/domain/StatisticalResultExtractor.kt | 4 ++-- src/main/kotlin/lotto/domain/WinningNumberExtractor.kt | 10 +++++----- .../lotto/domain/StatisticalResultExtractorTest.kt | 4 ++-- .../kotlin/lotto/domain/WinningNumberExtractorTest.kt | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) rename src/main/kotlin/lotto/domain/{TickeResult.kt => LottoTicketResult.kt} (74%) diff --git a/src/main/kotlin/lotto/domain/TickeResult.kt b/src/main/kotlin/lotto/domain/LottoTicketResult.kt similarity index 74% rename from src/main/kotlin/lotto/domain/TickeResult.kt rename to src/main/kotlin/lotto/domain/LottoTicketResult.kt index 923f00beb1..6ac332ab2d 100644 --- a/src/main/kotlin/lotto/domain/TickeResult.kt +++ b/src/main/kotlin/lotto/domain/LottoTicketResult.kt @@ -1,6 +1,6 @@ package lotto.domain -data class TicketResult( +data class LottoTicketResult( val matchCount: Int, val isBonusBallMatched: Boolean, ) diff --git a/src/main/kotlin/lotto/domain/LottoWinningResult.kt b/src/main/kotlin/lotto/domain/LottoWinningResult.kt index 338356cb80..0d205ab55f 100644 --- a/src/main/kotlin/lotto/domain/LottoWinningResult.kt +++ b/src/main/kotlin/lotto/domain/LottoWinningResult.kt @@ -1,7 +1,7 @@ package lotto.domain data class LottoWinningResult( - val result: Map, + val result: Map, ) { fun totalAmount(): Long { return result.entries.sumOf { diff --git a/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt b/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt index 37cc99f957..8100f9acab 100644 --- a/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt +++ b/src/main/kotlin/lotto/domain/StatisticalResultExtractor.kt @@ -6,8 +6,8 @@ class StatisticalResultExtractor( private val lottoWinningResult: LottoWinningResult, ) { fun getMatchCount(winningAmount: WinningAmount): Int { - val ticketResult = TicketResult(winningAmount.count, winningAmount.isBonusBallMatched) - return lottoWinningResult.result[ticketResult] ?: ZERO_COUNT + val lottoTicketResult = LottoTicketResult(winningAmount.count, winningAmount.isBonusBallMatched) + return lottoWinningResult.result[lottoTicketResult] ?: ZERO_COUNT } fun getTotalRateOfReturn(ticketCount: Int): Double { diff --git a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt index c4194ca920..82e8b4d976 100644 --- a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt +++ b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt @@ -2,17 +2,17 @@ package lotto.domain object WinningNumberExtractor { fun process(lottoTicketBundle: LottoTicketBundle, winningBallResult: WinningBallResult): LottoWinningResult { - val resultMap = mutableMapOf() + val resultMap = mutableMapOf() lottoTicketBundle.lottoTickets.groupingBy { ticket -> val intersectNumbers = ticket.intersect(winningBallResult.winningBalls) val isBonusBallMatched = winningBallResult.bonusBall in ticket - TicketResult(intersectNumbers.size, isBonusBallMatched) + LottoTicketResult(intersectNumbers.size, isBonusBallMatched) }.eachCountTo(resultMap) return LottoWinningResult(resultMap.toSortedMap(getTicketResultComparator())) } - private fun getTicketResultComparator(): Comparator = - Comparator.comparing(TicketResult::matchCount) - .thenComparing(TicketResult::isBonusBallMatched) + private fun getTicketResultComparator(): Comparator = + Comparator.comparing(LottoTicketResult::matchCount) + .thenComparing(LottoTicketResult::isBonusBallMatched) } diff --git a/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt b/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt index c57f3c6d81..423cc81185 100644 --- a/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/StatisticalResultExtractorTest.kt @@ -5,7 +5,7 @@ import io.kotest.matchers.shouldBe internal class StatisticalResultExtractorTest : BehaviorSpec({ Given("로또 당첨 개수가 ") { - val ticketResult = TicketResult(3, false) + val ticketResult = LottoTicketResult(3, false) val lottoWinningResult = LottoWinningResult(mapOf(ticketResult to 4)) val statisticalResultExtractor = StatisticalResultExtractor(lottoWinningResult) When("하나 이상 존재한다면, ") { @@ -24,7 +24,7 @@ internal class StatisticalResultExtractorTest : BehaviorSpec({ } Given("로또의") { - val ticketResult = TicketResult(3, false) + val ticketResult = LottoTicketResult(3, false) val lottoWinningResult = LottoWinningResult(mapOf(ticketResult to 2)) val statisticalResultExtractor = StatisticalResultExtractor(lottoWinningResult) When("당첨 금액에 따른") { diff --git a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt index 3ae1790a05..39f3fd5d6e 100644 --- a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt @@ -26,7 +26,7 @@ internal class WinningNumberExtractorTest : StringSpec({ ) ) - val ticketResult = TicketResult(6, false) + val ticketResult = LottoTicketResult(6, false) lottoWinning.result[ticketResult] shouldBe 1 unmockkObject(RandomNumberGenerator) @@ -50,7 +50,7 @@ internal class WinningNumberExtractorTest : StringSpec({ ) ) - val ticketResult = TicketResult(5, true) + val ticketResult = LottoTicketResult(5, true) lottoWinning.result[ticketResult] shouldBe 1 unmockkObject(RandomNumberGenerator) From 69bce82944c65555cad057a37d1ae3c06a20b68e Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Tue, 27 Dec 2022 15:19:34 +0900 Subject: [PATCH 08/13] =?UTF-8?q?feat:=20=EB=88=84=EB=9D=BD=EB=90=9C=20?= =?UTF-8?q?=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/LottoWinningResultTest.kt | 11 ++++++++++ .../lotto/domain/WinningBallResultTest.kt | 20 +++++++++++++++++++ .../kotlin/lotto/domain/WinningBallsTest.kt | 17 ++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 src/test/kotlin/lotto/domain/LottoWinningResultTest.kt create mode 100644 src/test/kotlin/lotto/domain/WinningBallResultTest.kt create mode 100644 src/test/kotlin/lotto/domain/WinningBallsTest.kt diff --git a/src/test/kotlin/lotto/domain/LottoWinningResultTest.kt b/src/test/kotlin/lotto/domain/LottoWinningResultTest.kt new file mode 100644 index 0000000000..4e9d6918c7 --- /dev/null +++ b/src/test/kotlin/lotto/domain/LottoWinningResultTest.kt @@ -0,0 +1,11 @@ +package lotto.domain + +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.shouldBe + +internal class LottoWinningResultTest : StringSpec({ + "LottoTicketResult 결과에 따른 최종 당첨 금액을 계산할 수 있다." { + val lottoWinningResult = LottoWinningResult(mapOf(LottoTicketResult(5, true) to 1)) + lottoWinningResult.totalAmount() shouldBe 30000000 + } +}) diff --git a/src/test/kotlin/lotto/domain/WinningBallResultTest.kt b/src/test/kotlin/lotto/domain/WinningBallResultTest.kt new file mode 100644 index 0000000000..936cdbd664 --- /dev/null +++ b/src/test/kotlin/lotto/domain/WinningBallResultTest.kt @@ -0,0 +1,20 @@ +package lotto.domain + +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.StringSpec + +internal class WinningBallResultTest : StringSpec({ + "로또 볼과 보너스 볼이 중복되면 예외가 발생한다." { + shouldThrow { + WinningBallResult( + WinningBalls( + setOf( + LottoNumber(1), LottoNumber(2), LottoNumber(3), + LottoNumber(4), LottoNumber(5), LottoNumber(6) + ) + ), + LottoNumber(1) + ) + } + } +}) diff --git a/src/test/kotlin/lotto/domain/WinningBallsTest.kt b/src/test/kotlin/lotto/domain/WinningBallsTest.kt new file mode 100644 index 0000000000..71c1fee996 --- /dev/null +++ b/src/test/kotlin/lotto/domain/WinningBallsTest.kt @@ -0,0 +1,17 @@ +package lotto.domain + +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.StringSpec + +internal class WinningBallsTest : StringSpec({ + "로또 당첨 번호가 중복되면 예외가 발생한다." { + shouldThrow { + WinningBalls( + setOf( + LottoNumber(1), LottoNumber(5), LottoNumber(3), + LottoNumber(4), LottoNumber(5), LottoNumber(6) + ) + ) + } + } +}) From c2bb815bc971ccbc535287abce543e98e54a6d4a Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Fri, 30 Dec 2022 23:14:06 +0900 Subject: [PATCH 09/13] =?UTF-8?q?chore:=20LottoNumberSelector.select()=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/domain/LottoTicket.kt | 2 +- src/main/kotlin/lotto/domain/LottoTicketBundle.kt | 6 ++++-- src/test/kotlin/lotto/domain/LottoTicketTest.kt | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/lotto/domain/LottoTicket.kt b/src/main/kotlin/lotto/domain/LottoTicket.kt index a17e9f919d..29bcc89113 100644 --- a/src/main/kotlin/lotto/domain/LottoTicket.kt +++ b/src/main/kotlin/lotto/domain/LottoTicket.kt @@ -1,5 +1,5 @@ package lotto.domain data class LottoTicket( - val numbers: Set = LottoNumberSelector.select(), + val numbers: Set, ) : Set by numbers diff --git a/src/main/kotlin/lotto/domain/LottoTicketBundle.kt b/src/main/kotlin/lotto/domain/LottoTicketBundle.kt index df25ed4e8a..e6ab0f1568 100644 --- a/src/main/kotlin/lotto/domain/LottoTicketBundle.kt +++ b/src/main/kotlin/lotto/domain/LottoTicketBundle.kt @@ -2,10 +2,12 @@ package lotto.domain import lotto.common.LottoTicketPolicy -data class LottoTicketBundle(val amount: Int) { +data class LottoTicketBundle( + val amount: Int, +) { private val count = amount / LottoTicketPolicy.PRICE val lottoTickets: List = List(count) { - LottoTicket() + LottoTicket(LottoNumberSelector.select()) } } diff --git a/src/test/kotlin/lotto/domain/LottoTicketTest.kt b/src/test/kotlin/lotto/domain/LottoTicketTest.kt index 4af458e465..1bc8675b28 100644 --- a/src/test/kotlin/lotto/domain/LottoTicketTest.kt +++ b/src/test/kotlin/lotto/domain/LottoTicketTest.kt @@ -5,6 +5,6 @@ import io.kotest.matchers.shouldBe internal class LottoTicketTest : StringSpec({ "로또 1장을 만들 수 있다." { - LottoTicket().numbers.size shouldBe 6 + LottoTicket(LottoNumberSelector.select()).numbers.size shouldBe 6 } }) From acf13019ba10db9b711f035b6cbbe7deb295ef23 Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Fri, 30 Dec 2022 23:34:33 +0900 Subject: [PATCH 10/13] =?UTF-8?q?feat:=20LottoTicketCount=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EC=97=AD=ED=95=A0=20LottoMachine=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoApplication.kt | 9 +++++++-- src/main/kotlin/lotto/domain/LottoMachine.kt | 11 +++++++++++ src/main/kotlin/lotto/domain/LottoTicketBundle.kt | 8 ++------ src/main/kotlin/lotto/domain/LottoTicketCount.kt | 6 ++++++ src/main/kotlin/lotto/view/InputView.kt | 12 ++++++++++-- .../kotlin/lotto/domain/LottoTicketBundleTest.kt | 4 ++-- .../lotto/domain/WinningNumberExtractorTest.kt | 8 ++++---- 7 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 src/main/kotlin/lotto/domain/LottoMachine.kt create mode 100644 src/main/kotlin/lotto/domain/LottoTicketCount.kt diff --git a/src/main/kotlin/lotto/LottoApplication.kt b/src/main/kotlin/lotto/LottoApplication.kt index 3c7d4f7255..718270365e 100644 --- a/src/main/kotlin/lotto/LottoApplication.kt +++ b/src/main/kotlin/lotto/LottoApplication.kt @@ -1,5 +1,6 @@ package lotto +import lotto.domain.LottoMachine import lotto.domain.LottoTicketBundle import lotto.domain.StatisticalResultExtractor import lotto.domain.WinningNumberExtractor @@ -8,8 +9,12 @@ import lotto.view.OutputView fun main() { val ticketAmount = InputView.getPurchaseAmount() - val lottoTicketBundle = LottoTicketBundle(ticketAmount) - InputView.getNumberOfPurchases(lottoTicketBundle.lottoTickets.size) + val manualTicketCount = InputView.getManualTicketCount() + val ticketCount = LottoMachine.calculateTicketCount(ticketAmount, manualTicketCount) + + val lottoTicketBundle = LottoTicketBundle(ticketCount) + InputView.getNumberOfPurchases(ticketCount) + val winningBallResult = InputView.getWinningBalls() val lottoWinningResult = WinningNumberExtractor.process(lottoTicketBundle, winningBallResult) OutputView.printOutput(StatisticalResultExtractor(lottoWinningResult), lottoTicketBundle.lottoTickets.size) diff --git a/src/main/kotlin/lotto/domain/LottoMachine.kt b/src/main/kotlin/lotto/domain/LottoMachine.kt new file mode 100644 index 0000000000..0196780dee --- /dev/null +++ b/src/main/kotlin/lotto/domain/LottoMachine.kt @@ -0,0 +1,11 @@ +package lotto.domain + +import lotto.common.LottoTicketPolicy + +object LottoMachine { + fun calculateTicketCount(amount: Int, manualTicketCount: Int): LottoTicketCount { + val autoTicketCount = (amount / LottoTicketPolicy.PRICE) - manualTicketCount + + return LottoTicketCount(autoTicketCount, manualTicketCount) + } +} diff --git a/src/main/kotlin/lotto/domain/LottoTicketBundle.kt b/src/main/kotlin/lotto/domain/LottoTicketBundle.kt index e6ab0f1568..de4e49b816 100644 --- a/src/main/kotlin/lotto/domain/LottoTicketBundle.kt +++ b/src/main/kotlin/lotto/domain/LottoTicketBundle.kt @@ -1,13 +1,9 @@ package lotto.domain -import lotto.common.LottoTicketPolicy - data class LottoTicketBundle( - val amount: Int, + val lottoTicketCount: LottoTicketCount, ) { - private val count = amount / LottoTicketPolicy.PRICE - - val lottoTickets: List = List(count) { + val lottoTickets: List = List(lottoTicketCount.autoTicketCount) { LottoTicket(LottoNumberSelector.select()) } } diff --git a/src/main/kotlin/lotto/domain/LottoTicketCount.kt b/src/main/kotlin/lotto/domain/LottoTicketCount.kt new file mode 100644 index 0000000000..c947a55eb9 --- /dev/null +++ b/src/main/kotlin/lotto/domain/LottoTicketCount.kt @@ -0,0 +1,6 @@ +package lotto.domain + +data class LottoTicketCount( + val autoTicketCount: Int, + val manualTicketCount: Int, +) diff --git a/src/main/kotlin/lotto/view/InputView.kt b/src/main/kotlin/lotto/view/InputView.kt index 2de83f193d..6dcae65ff3 100644 --- a/src/main/kotlin/lotto/view/InputView.kt +++ b/src/main/kotlin/lotto/view/InputView.kt @@ -1,6 +1,7 @@ package lotto.view import lotto.domain.LottoNumber +import lotto.domain.LottoTicketCount import lotto.domain.WinningBallResult import lotto.domain.WinningBalls @@ -13,8 +14,15 @@ object InputView { return amount.toInt() } - fun getNumberOfPurchases(count: Int) { - println("$count 개를 구매했습니다.") + fun getManualTicketCount(): Int { + println("수동으로 구매할 로또 수를 입력해 주세요.") + val manualTicketCount = readln() + + return manualTicketCount.toInt() + } + + fun getNumberOfPurchases(lottoTicketCount: LottoTicketCount) { + println("수동으로 ${lottoTicketCount.manualTicketCount}장, 자동으로 ${lottoTicketCount.autoTicketCount}개를 구매했습니다.") } fun getWinningBalls(): WinningBallResult { diff --git a/src/test/kotlin/lotto/domain/LottoTicketBundleTest.kt b/src/test/kotlin/lotto/domain/LottoTicketBundleTest.kt index 3d0c892a69..7b61d1e528 100644 --- a/src/test/kotlin/lotto/domain/LottoTicketBundleTest.kt +++ b/src/test/kotlin/lotto/domain/LottoTicketBundleTest.kt @@ -6,8 +6,8 @@ import io.kotest.matchers.shouldNotBe internal class LottoTicketBundleTest : StringSpec({ "로또 n개를 만들 수 있다." { - val amount = 5000 - val lottoTicketBundle = LottoTicketBundle(amount) + val lottoTicketCount = LottoTicketCount(5, 0) + val lottoTicketBundle = LottoTicketBundle(lottoTicketCount) lottoTicketBundle shouldNotBe null lottoTicketBundle.lottoTickets.size shouldBe 5 } diff --git a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt index 39f3fd5d6e..5fdf5df770 100644 --- a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt @@ -9,12 +9,12 @@ import lotto.utils.RandomNumberGenerator internal class WinningNumberExtractorTest : StringSpec({ "로또 당첨 개수에 따른 티켓 개수를 추출할 수 있다." { - val amount = 1000 + val lottoTicketCount = LottoTicketCount(1, 0) mockkObject(RandomNumberGenerator) every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 6) val lottoWinning = WinningNumberExtractor.process( - LottoTicketBundle(amount), + LottoTicketBundle(lottoTicketCount), WinningBallResult( WinningBalls( setOf( @@ -33,12 +33,12 @@ internal class WinningNumberExtractorTest : StringSpec({ } "로또 당첨 개수가 5개이고, 보너스 볼이 맞다면 2등에 당첨된다." { - val amount = 1000 + val lottoTicketCount = LottoTicketCount(1, 0) mockkObject(RandomNumberGenerator) every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 7) val lottoWinning = WinningNumberExtractor.process( - LottoTicketBundle(amount), + LottoTicketBundle(lottoTicketCount), WinningBallResult( WinningBalls( setOf( From 29266298ff6aebb3878a33e5439a775f3fa4534c Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Sat, 31 Dec 2022 00:34:26 +0900 Subject: [PATCH 11/13] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EC=88=98?= =?UTF-8?q?=EB=8F=99=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoApplication.kt | 9 ++++--- .../kotlin/lotto/domain/LottoTicketBundle.kt | 16 ++++++++--- .../domain/strategy/LottoGenerateStrategy.kt | 27 +++++++++++++++++++ .../domain/strategy/TicketGenerateType.kt | 6 +++++ src/main/kotlin/lotto/view/InputView.kt | 9 ++++++- .../lotto/domain/LottoTicketBundleTest.kt | 4 ++- .../domain/WinningNumberExtractorTest.kt | 6 +++-- 7 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 src/main/kotlin/lotto/domain/strategy/LottoGenerateStrategy.kt create mode 100644 src/main/kotlin/lotto/domain/strategy/TicketGenerateType.kt diff --git a/src/main/kotlin/lotto/LottoApplication.kt b/src/main/kotlin/lotto/LottoApplication.kt index 718270365e..1bb827092d 100644 --- a/src/main/kotlin/lotto/LottoApplication.kt +++ b/src/main/kotlin/lotto/LottoApplication.kt @@ -4,6 +4,8 @@ import lotto.domain.LottoMachine import lotto.domain.LottoTicketBundle import lotto.domain.StatisticalResultExtractor import lotto.domain.WinningNumberExtractor +import lotto.domain.strategy.LottoAutoGenerateStrategy +import lotto.domain.strategy.LottoManualGenerateStrategy import lotto.view.InputView import lotto.view.OutputView @@ -11,10 +13,9 @@ fun main() { val ticketAmount = InputView.getPurchaseAmount() val manualTicketCount = InputView.getManualTicketCount() val ticketCount = LottoMachine.calculateTicketCount(ticketAmount, manualTicketCount) - - val lottoTicketBundle = LottoTicketBundle(ticketCount) - InputView.getNumberOfPurchases(ticketCount) - + InputView.printManualTicketNumber(ticketCount.manualTicketCount) + val lottoTicketBundle = LottoTicketBundle(ticketCount, listOf(LottoAutoGenerateStrategy(), LottoManualGenerateStrategy())) + InputView.printNumberOfPurchases(ticketCount) val winningBallResult = InputView.getWinningBalls() val lottoWinningResult = WinningNumberExtractor.process(lottoTicketBundle, winningBallResult) OutputView.printOutput(StatisticalResultExtractor(lottoWinningResult), lottoTicketBundle.lottoTickets.size) diff --git a/src/main/kotlin/lotto/domain/LottoTicketBundle.kt b/src/main/kotlin/lotto/domain/LottoTicketBundle.kt index de4e49b816..d9b579f3c7 100644 --- a/src/main/kotlin/lotto/domain/LottoTicketBundle.kt +++ b/src/main/kotlin/lotto/domain/LottoTicketBundle.kt @@ -1,9 +1,19 @@ package lotto.domain -data class LottoTicketBundle( - val lottoTicketCount: LottoTicketCount, +import lotto.domain.strategy.LottoGenerateStrategy +import lotto.domain.strategy.TicketGenerateType + +class LottoTicketBundle( + lottoTicketCount: LottoTicketCount, + lottoGenerateStrategies: List, ) { + private val lottoGenerateStrategyMap = lottoGenerateStrategies.associateBy { it.ticketGenerateType } + val lottoTickets: List = List(lottoTicketCount.autoTicketCount) { - LottoTicket(LottoNumberSelector.select()) + val autoGenerateStrategy = lottoGenerateStrategyMap.getValue(TicketGenerateType.AUTO) + autoGenerateStrategy.generate() + } + List(lottoTicketCount.manualTicketCount) { + val manualGenerateStrategy = lottoGenerateStrategyMap.getValue(TicketGenerateType.MANUAL) + manualGenerateStrategy.generate() } } diff --git a/src/main/kotlin/lotto/domain/strategy/LottoGenerateStrategy.kt b/src/main/kotlin/lotto/domain/strategy/LottoGenerateStrategy.kt new file mode 100644 index 0000000000..35e638d89f --- /dev/null +++ b/src/main/kotlin/lotto/domain/strategy/LottoGenerateStrategy.kt @@ -0,0 +1,27 @@ +package lotto.domain.strategy + +import lotto.domain.LottoNumber +import lotto.domain.LottoNumberSelector +import lotto.domain.LottoTicket + +interface LottoGenerateStrategy { + val ticketGenerateType: TicketGenerateType + fun generate(): LottoTicket +} + +class LottoAutoGenerateStrategy : LottoGenerateStrategy { + override val ticketGenerateType = TicketGenerateType.AUTO + override fun generate(): LottoTicket { + return LottoTicket(LottoNumberSelector.select()) + } +} + +class LottoManualGenerateStrategy : LottoGenerateStrategy { + override val ticketGenerateType = TicketGenerateType.MANUAL + override fun generate(): LottoTicket { + val manualLottoNumberStr = readln() + val manualLottoNumber = manualLottoNumberStr.split(", ").map { LottoNumber(it.toInt()) }.toSet() + + return LottoTicket(manualLottoNumber) + } +} diff --git a/src/main/kotlin/lotto/domain/strategy/TicketGenerateType.kt b/src/main/kotlin/lotto/domain/strategy/TicketGenerateType.kt new file mode 100644 index 0000000000..6f3b581abe --- /dev/null +++ b/src/main/kotlin/lotto/domain/strategy/TicketGenerateType.kt @@ -0,0 +1,6 @@ +package lotto.domain.strategy + +enum class TicketGenerateType { + AUTO, + MANUAL, +} diff --git a/src/main/kotlin/lotto/view/InputView.kt b/src/main/kotlin/lotto/view/InputView.kt index 6dcae65ff3..1edb89e5a4 100644 --- a/src/main/kotlin/lotto/view/InputView.kt +++ b/src/main/kotlin/lotto/view/InputView.kt @@ -21,7 +21,14 @@ object InputView { return manualTicketCount.toInt() } - fun getNumberOfPurchases(lottoTicketCount: LottoTicketCount) { + fun printManualTicketNumber(manualTicketCount: Int) { + when (manualTicketCount) { + 0 -> return + else -> println("수동으로 구매할 번호를 입력해 주세요.") + } + } + + fun printNumberOfPurchases(lottoTicketCount: LottoTicketCount) { println("수동으로 ${lottoTicketCount.manualTicketCount}장, 자동으로 ${lottoTicketCount.autoTicketCount}개를 구매했습니다.") } diff --git a/src/test/kotlin/lotto/domain/LottoTicketBundleTest.kt b/src/test/kotlin/lotto/domain/LottoTicketBundleTest.kt index 7b61d1e528..873e9903a5 100644 --- a/src/test/kotlin/lotto/domain/LottoTicketBundleTest.kt +++ b/src/test/kotlin/lotto/domain/LottoTicketBundleTest.kt @@ -3,11 +3,13 @@ package lotto.domain import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe +import lotto.domain.strategy.LottoAutoGenerateStrategy +import lotto.domain.strategy.LottoManualGenerateStrategy internal class LottoTicketBundleTest : StringSpec({ "로또 n개를 만들 수 있다." { val lottoTicketCount = LottoTicketCount(5, 0) - val lottoTicketBundle = LottoTicketBundle(lottoTicketCount) + val lottoTicketBundle = LottoTicketBundle(lottoTicketCount, listOf(LottoAutoGenerateStrategy(), LottoManualGenerateStrategy())) lottoTicketBundle shouldNotBe null lottoTicketBundle.lottoTickets.size shouldBe 5 } diff --git a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt index 5fdf5df770..88c2dd295b 100644 --- a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt @@ -5,6 +5,8 @@ import io.kotest.matchers.shouldBe import io.mockk.every import io.mockk.mockkObject import io.mockk.unmockkObject +import lotto.domain.strategy.LottoAutoGenerateStrategy +import lotto.domain.strategy.LottoManualGenerateStrategy import lotto.utils.RandomNumberGenerator internal class WinningNumberExtractorTest : StringSpec({ @@ -14,7 +16,7 @@ internal class WinningNumberExtractorTest : StringSpec({ every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 6) val lottoWinning = WinningNumberExtractor.process( - LottoTicketBundle(lottoTicketCount), + LottoTicketBundle(lottoTicketCount, listOf(LottoAutoGenerateStrategy(), LottoManualGenerateStrategy())), WinningBallResult( WinningBalls( setOf( @@ -38,7 +40,7 @@ internal class WinningNumberExtractorTest : StringSpec({ every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 7) val lottoWinning = WinningNumberExtractor.process( - LottoTicketBundle(lottoTicketCount), + LottoTicketBundle(lottoTicketCount, listOf(LottoAutoGenerateStrategy(), LottoManualGenerateStrategy())), WinningBallResult( WinningBalls( setOf( From 2da6a897a4eb5f2f9e339eb8e1fe7e77dc8793f7 Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Sat, 31 Dec 2022 00:47:12 +0900 Subject: [PATCH 12/13] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoApplication.kt | 3 +-- src/main/kotlin/lotto/domain/LottoMachine.kt | 15 +++++++++++++++ src/main/kotlin/lotto/domain/LottoNumber.kt | 2 +- .../lotto/domain/WinningNumberExtractor.kt | 18 ------------------ ...berExtractorTest.kt => LottoMachineTest.kt} | 6 +++--- 5 files changed, 20 insertions(+), 24 deletions(-) delete mode 100644 src/main/kotlin/lotto/domain/WinningNumberExtractor.kt rename src/test/kotlin/lotto/domain/{WinningNumberExtractorTest.kt => LottoMachineTest.kt} (92%) diff --git a/src/main/kotlin/lotto/LottoApplication.kt b/src/main/kotlin/lotto/LottoApplication.kt index 1bb827092d..b6a8842860 100644 --- a/src/main/kotlin/lotto/LottoApplication.kt +++ b/src/main/kotlin/lotto/LottoApplication.kt @@ -3,7 +3,6 @@ package lotto import lotto.domain.LottoMachine import lotto.domain.LottoTicketBundle import lotto.domain.StatisticalResultExtractor -import lotto.domain.WinningNumberExtractor import lotto.domain.strategy.LottoAutoGenerateStrategy import lotto.domain.strategy.LottoManualGenerateStrategy import lotto.view.InputView @@ -17,6 +16,6 @@ fun main() { val lottoTicketBundle = LottoTicketBundle(ticketCount, listOf(LottoAutoGenerateStrategy(), LottoManualGenerateStrategy())) InputView.printNumberOfPurchases(ticketCount) val winningBallResult = InputView.getWinningBalls() - val lottoWinningResult = WinningNumberExtractor.process(lottoTicketBundle, winningBallResult) + val lottoWinningResult = LottoMachine.process(lottoTicketBundle, winningBallResult) OutputView.printOutput(StatisticalResultExtractor(lottoWinningResult), lottoTicketBundle.lottoTickets.size) } diff --git a/src/main/kotlin/lotto/domain/LottoMachine.kt b/src/main/kotlin/lotto/domain/LottoMachine.kt index 0196780dee..b322dc3531 100644 --- a/src/main/kotlin/lotto/domain/LottoMachine.kt +++ b/src/main/kotlin/lotto/domain/LottoMachine.kt @@ -8,4 +8,19 @@ object LottoMachine { return LottoTicketCount(autoTicketCount, manualTicketCount) } + + fun process(lottoTicketBundle: LottoTicketBundle, winningBallResult: WinningBallResult): LottoWinningResult { + val resultMap = mutableMapOf() + lottoTicketBundle.lottoTickets.groupingBy { ticket -> + val intersectNumbers = ticket.intersect(winningBallResult.winningBalls) + val isBonusBallMatched = winningBallResult.bonusBall in ticket + LottoTicketResult(intersectNumbers.size, isBonusBallMatched) + }.eachCountTo(resultMap) + + return LottoWinningResult(resultMap.toSortedMap(getTicketResultComparator())) + } + + private fun getTicketResultComparator(): Comparator = + Comparator.comparing(LottoTicketResult::matchCount) + .thenComparing(LottoTicketResult::isBonusBallMatched) } diff --git a/src/main/kotlin/lotto/domain/LottoNumber.kt b/src/main/kotlin/lotto/domain/LottoNumber.kt index cbdb46127b..4acba7f01a 100644 --- a/src/main/kotlin/lotto/domain/LottoNumber.kt +++ b/src/main/kotlin/lotto/domain/LottoNumber.kt @@ -5,7 +5,7 @@ import lotto.common.LottoTicketPolicy.START_NUMBER @JvmInline value class LottoNumber( - val number: Int, + private val number: Int, ) { init { require(number in START_NUMBER..END_NUMBER) { "로또 번호는 1~45 사이의 숫자만 가능합니다." } diff --git a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt b/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt deleted file mode 100644 index 82e8b4d976..0000000000 --- a/src/main/kotlin/lotto/domain/WinningNumberExtractor.kt +++ /dev/null @@ -1,18 +0,0 @@ -package lotto.domain - -object WinningNumberExtractor { - fun process(lottoTicketBundle: LottoTicketBundle, winningBallResult: WinningBallResult): LottoWinningResult { - val resultMap = mutableMapOf() - lottoTicketBundle.lottoTickets.groupingBy { ticket -> - val intersectNumbers = ticket.intersect(winningBallResult.winningBalls) - val isBonusBallMatched = winningBallResult.bonusBall in ticket - LottoTicketResult(intersectNumbers.size, isBonusBallMatched) - }.eachCountTo(resultMap) - - return LottoWinningResult(resultMap.toSortedMap(getTicketResultComparator())) - } - - private fun getTicketResultComparator(): Comparator = - Comparator.comparing(LottoTicketResult::matchCount) - .thenComparing(LottoTicketResult::isBonusBallMatched) -} diff --git a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt b/src/test/kotlin/lotto/domain/LottoMachineTest.kt similarity index 92% rename from src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt rename to src/test/kotlin/lotto/domain/LottoMachineTest.kt index 88c2dd295b..c74ef4bc15 100644 --- a/src/test/kotlin/lotto/domain/WinningNumberExtractorTest.kt +++ b/src/test/kotlin/lotto/domain/LottoMachineTest.kt @@ -9,13 +9,13 @@ import lotto.domain.strategy.LottoAutoGenerateStrategy import lotto.domain.strategy.LottoManualGenerateStrategy import lotto.utils.RandomNumberGenerator -internal class WinningNumberExtractorTest : StringSpec({ +internal class LottoMachineTest : StringSpec({ "로또 당첨 개수에 따른 티켓 개수를 추출할 수 있다." { val lottoTicketCount = LottoTicketCount(1, 0) mockkObject(RandomNumberGenerator) every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 6) - val lottoWinning = WinningNumberExtractor.process( + val lottoWinning = LottoMachine.process( LottoTicketBundle(lottoTicketCount, listOf(LottoAutoGenerateStrategy(), LottoManualGenerateStrategy())), WinningBallResult( WinningBalls( @@ -39,7 +39,7 @@ internal class WinningNumberExtractorTest : StringSpec({ mockkObject(RandomNumberGenerator) every { RandomNumberGenerator.generate(1..45) }.returnsMany(1, 2, 3, 4, 5, 7) - val lottoWinning = WinningNumberExtractor.process( + val lottoWinning = LottoMachine.process( LottoTicketBundle(lottoTicketCount, listOf(LottoAutoGenerateStrategy(), LottoManualGenerateStrategy())), WinningBallResult( WinningBalls( From ef9e487773fe290f1e9eeac9751c3c36afbb2b85 Mon Sep 17 00:00:00 2001 From: 0923kdh <0923kdh@gmail.com> Date: Sat, 31 Dec 2022 00:47:29 +0900 Subject: [PATCH 13/13] =?UTF-8?q?chore:=20=EB=A6=AC=EB=93=9C=EB=AF=B8=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a24f52b046..4252b5d036 100644 --- a/README.md +++ b/README.md @@ -37,3 +37,4 @@ * 구매한 n장의 로또에 대해 당첨 통계를 관리할 수 있다. * 보너스 볼을 입력을 수 있다. * 보너스 볼을 포함하여 당첨 통계를 낼 수 있다. +* 수동으로 로또 번호를 입력받을 수 있다.