From 45ba384d682749300424218b2839cec7de4ed260 Mon Sep 17 00:00:00 2001 From: "silvio.oivlis" Date: Thu, 30 Nov 2023 17:35:07 +0900 Subject: [PATCH 1/8] =?UTF-8?q?refactor:=20=EC=9D=BC=EB=B6=80=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ticket}/AutoTicketProvideStrategy.kt | 6 ++++-- src/main/kotlin/lotto/provider/ticket/AutoTicketProvider.kt | 1 - src/test/kotlin/lotto/LottoAutoTest.kt | 2 +- .../lotto/provider/ticket}/ManualTicketProvideStrategy.kt | 4 ++-- src/test/kotlin/lotto/provider/ticket/MockTicketProvider.kt | 1 - 5 files changed, 7 insertions(+), 7 deletions(-) rename src/main/kotlin/lotto/{domain => provider/ticket}/AutoTicketProvideStrategy.kt (80%) rename src/{main/kotlin/lotto/domain => test/kotlin/lotto/provider/ticket}/ManualTicketProvideStrategy.kt (70%) diff --git a/src/main/kotlin/lotto/domain/AutoTicketProvideStrategy.kt b/src/main/kotlin/lotto/provider/ticket/AutoTicketProvideStrategy.kt similarity index 80% rename from src/main/kotlin/lotto/domain/AutoTicketProvideStrategy.kt rename to src/main/kotlin/lotto/provider/ticket/AutoTicketProvideStrategy.kt index 404bb8fd97..ba58cbfd2a 100644 --- a/src/main/kotlin/lotto/domain/AutoTicketProvideStrategy.kt +++ b/src/main/kotlin/lotto/provider/ticket/AutoTicketProvideStrategy.kt @@ -1,6 +1,8 @@ -package lotto.domain +package lotto.provider.ticket -import lotto.provider.ticket.TicketProvideStrategy +import lotto.domain.LottoNumber +import lotto.domain.LottoTicket +import lotto.domain.LottoTickets object AutoTicketProvideStrategy : TicketProvideStrategy { private val preGeneratedLottoNumbers = (LottoNumber.validNumberRange) diff --git a/src/main/kotlin/lotto/provider/ticket/AutoTicketProvider.kt b/src/main/kotlin/lotto/provider/ticket/AutoTicketProvider.kt index 0189046e12..598cf3366e 100644 --- a/src/main/kotlin/lotto/provider/ticket/AutoTicketProvider.kt +++ b/src/main/kotlin/lotto/provider/ticket/AutoTicketProvider.kt @@ -1,6 +1,5 @@ package lotto.provider.ticket -import lotto.domain.AutoTicketProvideStrategy import lotto.domain.LottoTickets object AutoTicketProvider : LottoTicketsProvider(AutoTicketProvideStrategy) { diff --git a/src/test/kotlin/lotto/LottoAutoTest.kt b/src/test/kotlin/lotto/LottoAutoTest.kt index 9e930a20dc..ef8ee2173c 100644 --- a/src/test/kotlin/lotto/LottoAutoTest.kt +++ b/src/test/kotlin/lotto/LottoAutoTest.kt @@ -5,9 +5,9 @@ import io.kotest.matchers.shouldBe import lotto.domain.LottoNumber import lotto.domain.LottoTicket import lotto.domain.LottoTickets -import lotto.domain.ManualTicketProvideStrategy import lotto.domain.Rank import lotto.domain.WinningNumber +import lotto.provider.ticket.ManualTicketProvideStrategy import lotto.provider.ticket.MockTicketProvider import lotto.view.MockInputView import lotto.view.ResultView diff --git a/src/main/kotlin/lotto/domain/ManualTicketProvideStrategy.kt b/src/test/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt similarity index 70% rename from src/main/kotlin/lotto/domain/ManualTicketProvideStrategy.kt rename to src/test/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt index e38590939f..053d995438 100644 --- a/src/main/kotlin/lotto/domain/ManualTicketProvideStrategy.kt +++ b/src/test/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt @@ -1,6 +1,6 @@ -package lotto.domain +package lotto.provider.ticket -import lotto.provider.ticket.TicketProvideStrategy +import lotto.domain.LottoTickets class ManualTicketProvideStrategy(private val lottoTickets: LottoTickets) : TicketProvideStrategy { override fun provide(ticketCount: Int): LottoTickets = lottoTickets diff --git a/src/test/kotlin/lotto/provider/ticket/MockTicketProvider.kt b/src/test/kotlin/lotto/provider/ticket/MockTicketProvider.kt index 8b3b635e7a..aab73ae88a 100644 --- a/src/test/kotlin/lotto/provider/ticket/MockTicketProvider.kt +++ b/src/test/kotlin/lotto/provider/ticket/MockTicketProvider.kt @@ -1,7 +1,6 @@ package lotto.provider.ticket import lotto.domain.LottoTickets -import lotto.domain.ManualTicketProvideStrategy class MockTicketProvider(ticketProvideStrategy: ManualTicketProvideStrategy) : LottoTicketsProvider(ticketProvideStrategy) { override fun provide(ticketCount: Int): LottoTickets = ticketProvideStrategy.provide(ticketCount) From 097da6dbf7f6f4a54375f3f155fcda30fa3b2494 Mon Sep 17 00:00:00 2001 From: "silvio.oivlis" Date: Fri, 8 Dec 2023 18:26:18 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feature:=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=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoSimulator.kt | 35 +++++++++++++++---- .../lotto/provider/ticket/ActualLottoShop.kt | 8 +++++ .../provider/ticket/AutoTicketProvider.kt | 7 ---- .../kotlin/lotto/provider/ticket/LottoShop.kt | 12 +++++++ .../provider/ticket/LottoTicketsProvider.kt | 11 ------ .../ticket/ManualTicketProvideStrategy.kt | 16 +++++++++ src/main/kotlin/lotto/view/InputView.kt | 6 +++- src/main/kotlin/lotto/view/UserInputView.kt | 20 +++++++++-- src/test/kotlin/lotto/LottoAutoTest.kt | 16 ++++----- ...ategy.kt => ExactTicketProvideStrategy.kt} | 2 +- .../lotto/provider/ticket/MockLottoShop.kt | 8 +++++ .../provider/ticket/MockTicketProvider.kt | 7 ---- src/test/kotlin/lotto/view/MockInputView.kt | 6 +++- 13 files changed, 108 insertions(+), 46 deletions(-) create mode 100644 src/main/kotlin/lotto/provider/ticket/ActualLottoShop.kt delete mode 100644 src/main/kotlin/lotto/provider/ticket/AutoTicketProvider.kt create mode 100644 src/main/kotlin/lotto/provider/ticket/LottoShop.kt delete mode 100644 src/main/kotlin/lotto/provider/ticket/LottoTicketsProvider.kt create mode 100644 src/main/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt rename src/test/kotlin/lotto/provider/ticket/{ManualTicketProvideStrategy.kt => ExactTicketProvideStrategy.kt} (58%) create mode 100644 src/test/kotlin/lotto/provider/ticket/MockLottoShop.kt delete mode 100644 src/test/kotlin/lotto/provider/ticket/MockTicketProvider.kt diff --git a/src/main/kotlin/lotto/LottoSimulator.kt b/src/main/kotlin/lotto/LottoSimulator.kt index 599e8f5d6e..69297537e8 100644 --- a/src/main/kotlin/lotto/LottoSimulator.kt +++ b/src/main/kotlin/lotto/LottoSimulator.kt @@ -3,8 +3,10 @@ package lotto import lotto.domain.LottoPurchaseOrder import lotto.domain.LottoResult import lotto.domain.LottoTicket -import lotto.provider.ticket.AutoTicketProvider -import lotto.provider.ticket.LottoTicketsProvider +import lotto.domain.LottoTickets +import lotto.domain.RankResult +import lotto.provider.ticket.ActualLottoShop +import lotto.provider.ticket.LottoShop import lotto.view.InputView import lotto.view.ResultView import lotto.view.UserInputView @@ -13,16 +15,16 @@ class LottoSimulator( private val inputView: InputView, private val resultView: ResultView, ) { - fun simulate(lottoTicketsProvider: LottoTicketsProvider): LottoResult { + fun simulate(lottoShop: LottoShop): LottoResult { val purchaseOrder = LottoPurchaseOrder( budget = inputView.getBudget(), ticketPrice = LottoTicket.PRICE, ) - val lottoTickets = lottoTicketsProvider.provide(purchaseOrder.ticketCount) - inputView.printPurchasedLotto(lottoTickets) + val lottoTickets = createLottoTickets(lottoShop, purchaseOrder.ticketCount) val winningNumber = inputView.getWinningNumber() + val lottoResult = lottoTickets.getRankResult(winningNumber) val result = LottoResult( @@ -31,9 +33,28 @@ class LottoSimulator( remainder = purchaseOrder.remainder ) + printLottoResult(lottoResult, result) + + return result + } + + private fun printLottoResult(lottoResult: RankResult, result: LottoResult) { resultView.printRankResults(lottoResult) resultView.printResult(result) - return result + } + + private fun createLottoTickets(lottoShop: LottoShop, ticketCount: Int): LottoTickets { + val manualLottoCount = inputView.getManualLottoCount() + + val manualTickets = if (manualLottoCount != 0) { + inputView.printManualLottoInputString() + lottoShop.provideManualTickets(manualLottoCount) + } else LottoTickets(listOf()) + + val autoTickets = lottoShop.provideAutoTickets(ticketCount - manualLottoCount) + inputView.printPurchasedLotto(autoLottoTickets = autoTickets, manualLottoTickets = manualTickets) + + return LottoTickets(manualTickets.lottoTicketList + autoTickets.lottoTicketList) } } @@ -41,5 +62,5 @@ fun main() { LottoSimulator( UserInputView(), ResultView() - ).simulate(lottoTicketsProvider = AutoTicketProvider) + ).simulate(lottoShop = ActualLottoShop) } diff --git a/src/main/kotlin/lotto/provider/ticket/ActualLottoShop.kt b/src/main/kotlin/lotto/provider/ticket/ActualLottoShop.kt new file mode 100644 index 0000000000..edd0455f0b --- /dev/null +++ b/src/main/kotlin/lotto/provider/ticket/ActualLottoShop.kt @@ -0,0 +1,8 @@ +package lotto.provider.ticket + +import lotto.domain.LottoTickets + +object ActualLottoShop : LottoShop { + override fun provideAutoTickets(ticketCount: Int): LottoTickets = AutoTicketProvideStrategy.provide(ticketCount) + override fun provideManualTickets(ticketCount: Int): LottoTickets = ManualTicketProvideStrategy.provide(ticketCount) +} diff --git a/src/main/kotlin/lotto/provider/ticket/AutoTicketProvider.kt b/src/main/kotlin/lotto/provider/ticket/AutoTicketProvider.kt deleted file mode 100644 index 598cf3366e..0000000000 --- a/src/main/kotlin/lotto/provider/ticket/AutoTicketProvider.kt +++ /dev/null @@ -1,7 +0,0 @@ -package lotto.provider.ticket - -import lotto.domain.LottoTickets - -object AutoTicketProvider : LottoTicketsProvider(AutoTicketProvideStrategy) { - override fun provide(ticketCount: Int): LottoTickets = ticketProvideStrategy.provide(ticketCount) -} diff --git a/src/main/kotlin/lotto/provider/ticket/LottoShop.kt b/src/main/kotlin/lotto/provider/ticket/LottoShop.kt new file mode 100644 index 0000000000..90ea10a0c6 --- /dev/null +++ b/src/main/kotlin/lotto/provider/ticket/LottoShop.kt @@ -0,0 +1,12 @@ +package lotto.provider.ticket + +import lotto.domain.LottoTickets + +interface LottoShop { + fun provideAutoTickets(ticketCount: Int): LottoTickets + fun provideManualTickets(ticketCount: Int): LottoTickets +} + +interface TicketProvideStrategy { + fun provide(ticketCount: Int): LottoTickets +} diff --git a/src/main/kotlin/lotto/provider/ticket/LottoTicketsProvider.kt b/src/main/kotlin/lotto/provider/ticket/LottoTicketsProvider.kt deleted file mode 100644 index dc92e8178a..0000000000 --- a/src/main/kotlin/lotto/provider/ticket/LottoTicketsProvider.kt +++ /dev/null @@ -1,11 +0,0 @@ -package lotto.provider.ticket - -import lotto.domain.LottoTickets - -abstract class LottoTicketsProvider(protected val ticketProvideStrategy: TicketProvideStrategy) { - abstract fun provide(ticketCount: Int): LottoTickets -} - -interface TicketProvideStrategy { - fun provide(ticketCount: Int): LottoTickets -} diff --git a/src/main/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt b/src/main/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt new file mode 100644 index 0000000000..08999f74f3 --- /dev/null +++ b/src/main/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt @@ -0,0 +1,16 @@ +package lotto.provider.ticket + +import lotto.domain.LottoNumber +import lotto.domain.LottoTicket +import lotto.domain.LottoTickets + +object ManualTicketProvideStrategy : TicketProvideStrategy { + override fun provide(ticketCount: Int): LottoTickets { + val lottoTicketList = mutableListOf() + repeat(ticketCount) { + val lottoTicket = LottoTicket(readln().trim().split(",").map { it.toInt() }.map { LottoNumber(it) }) + lottoTicketList.add(lottoTicket) + } + return LottoTickets(lottoTicketList) + } +} diff --git a/src/main/kotlin/lotto/view/InputView.kt b/src/main/kotlin/lotto/view/InputView.kt index 0ddd88badc..74d8a224d1 100644 --- a/src/main/kotlin/lotto/view/InputView.kt +++ b/src/main/kotlin/lotto/view/InputView.kt @@ -8,5 +8,9 @@ interface InputView { fun getWinningNumber(): WinningNumber - fun printPurchasedLotto(lottoTickets: LottoTickets) + fun printPurchasedLotto(autoLottoTickets: LottoTickets, manualLottoTickets: LottoTickets) + + fun getManualLottoCount(): Int + + fun printManualLottoInputString() } diff --git a/src/main/kotlin/lotto/view/UserInputView.kt b/src/main/kotlin/lotto/view/UserInputView.kt index 682cb2777e..ef0b2ab8d7 100644 --- a/src/main/kotlin/lotto/view/UserInputView.kt +++ b/src/main/kotlin/lotto/view/UserInputView.kt @@ -24,14 +24,28 @@ class UserInputView : InputView { ) } - override fun printPurchasedLotto(lottoTickets: LottoTickets) { - lottoTickets.lottoTicketList.forEach { ticket -> + override fun printPurchasedLotto(autoLottoTickets: LottoTickets, manualLottoTickets: LottoTickets) { + println("수동으로 ${manualLottoTickets.lottoTicketList.size}, 자동으로 ${autoLottoTickets.lottoTicketList.size} 개를 구매했습니다.") + manualLottoTickets.print() + autoLottoTickets.print() + } + + override fun getManualLottoCount(): Int { + println("수동으로 구매할 로또 수를 입력해 주세요.") + return readln().trim().toInt() + } + + override fun printManualLottoInputString() { + println("수동으로 구매할 번호를 입력해 주세요.") + } + + private fun LottoTickets.print() { + lottoTicketList.forEach { ticket -> println( ticket.lottoNumberList.map { number -> number.value } ) } - println("${lottoTickets.lottoTicketList.size} 개를 구매했습니다.") } } diff --git a/src/test/kotlin/lotto/LottoAutoTest.kt b/src/test/kotlin/lotto/LottoAutoTest.kt index ef8ee2173c..ce110a1f76 100644 --- a/src/test/kotlin/lotto/LottoAutoTest.kt +++ b/src/test/kotlin/lotto/LottoAutoTest.kt @@ -7,8 +7,8 @@ import lotto.domain.LottoTicket import lotto.domain.LottoTickets import lotto.domain.Rank import lotto.domain.WinningNumber -import lotto.provider.ticket.ManualTicketProvideStrategy -import lotto.provider.ticket.MockTicketProvider +import lotto.provider.ticket.ExactTicketProvideStrategy +import lotto.provider.ticket.MockLottoShop import lotto.view.MockInputView import lotto.view.ResultView @@ -25,8 +25,8 @@ class LottoAutoTest : StringSpec({ ), resultView = ResultView(), ).simulate( - lottoTicketsProvider = MockTicketProvider( - ManualTicketProvideStrategy( + lottoShop = MockLottoShop( + ExactTicketProvideStrategy( LottoTickets( listOf( LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }) @@ -48,8 +48,8 @@ class LottoAutoTest : StringSpec({ ), resultView = ResultView(), ).simulate( - lottoTicketsProvider = MockTicketProvider( - ManualTicketProvideStrategy( + lottoShop = MockLottoShop( + ExactTicketProvideStrategy( LottoTickets( listOf( LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }) @@ -71,8 +71,8 @@ class LottoAutoTest : StringSpec({ ), resultView = ResultView(), ).simulate( - lottoTicketsProvider = MockTicketProvider( - ManualTicketProvideStrategy( + lottoShop = MockLottoShop( + ExactTicketProvideStrategy( LottoTickets( listOf( LottoTicket(listOf(1, 2, 3, 4, 5, 19).map { LottoNumber(it) }) diff --git a/src/test/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt b/src/test/kotlin/lotto/provider/ticket/ExactTicketProvideStrategy.kt similarity index 58% rename from src/test/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt rename to src/test/kotlin/lotto/provider/ticket/ExactTicketProvideStrategy.kt index 053d995438..d5ea5710e9 100644 --- a/src/test/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt +++ b/src/test/kotlin/lotto/provider/ticket/ExactTicketProvideStrategy.kt @@ -2,6 +2,6 @@ package lotto.provider.ticket import lotto.domain.LottoTickets -class ManualTicketProvideStrategy(private val lottoTickets: LottoTickets) : TicketProvideStrategy { +class ExactTicketProvideStrategy(private val lottoTickets: LottoTickets) : TicketProvideStrategy { override fun provide(ticketCount: Int): LottoTickets = lottoTickets } diff --git a/src/test/kotlin/lotto/provider/ticket/MockLottoShop.kt b/src/test/kotlin/lotto/provider/ticket/MockLottoShop.kt new file mode 100644 index 0000000000..5292a12e33 --- /dev/null +++ b/src/test/kotlin/lotto/provider/ticket/MockLottoShop.kt @@ -0,0 +1,8 @@ +package lotto.provider.ticket + +import lotto.domain.LottoTickets + +class MockLottoShop(private val ticketProvideStrategy: ExactTicketProvideStrategy) : LottoShop { + override fun provideAutoTickets(ticketCount: Int): LottoTickets = ticketProvideStrategy.provide(ticketCount) + override fun provideManualTickets(ticketCount: Int): LottoTickets = LottoTickets(listOf()) +} diff --git a/src/test/kotlin/lotto/provider/ticket/MockTicketProvider.kt b/src/test/kotlin/lotto/provider/ticket/MockTicketProvider.kt deleted file mode 100644 index aab73ae88a..0000000000 --- a/src/test/kotlin/lotto/provider/ticket/MockTicketProvider.kt +++ /dev/null @@ -1,7 +0,0 @@ -package lotto.provider.ticket - -import lotto.domain.LottoTickets - -class MockTicketProvider(ticketProvideStrategy: ManualTicketProvideStrategy) : LottoTicketsProvider(ticketProvideStrategy) { - override fun provide(ticketCount: Int): LottoTickets = ticketProvideStrategy.provide(ticketCount) -} diff --git a/src/test/kotlin/lotto/view/MockInputView.kt b/src/test/kotlin/lotto/view/MockInputView.kt index 51749b9be5..7ef186aaaf 100644 --- a/src/test/kotlin/lotto/view/MockInputView.kt +++ b/src/test/kotlin/lotto/view/MockInputView.kt @@ -11,5 +11,9 @@ class MockInputView( override fun getWinningNumber(): WinningNumber = winningNumber - override fun printPurchasedLotto(lottoTickets: LottoTickets) = Unit + override fun printPurchasedLotto(autoLottoTickets: LottoTickets, manualLottoTickets: LottoTickets) = Unit + + override fun getManualLottoCount(): Int = 0 + + override fun printManualLottoInputString() = Unit } From a5dd61659e81df561a151cdeb1784d55f928748c Mon Sep 17 00:00:00 2001 From: "silvio.oivlis" Date: Fri, 8 Dec 2023 18:31:39 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20=EB=B0=80=EB=B6=80=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoSimulator.kt | 8 ++++---- .../{provider => generator}/ticket/ActualLottoShop.kt | 6 +++--- .../ticket/AutoTicketGenerator.kt} | 4 ++-- .../lotto/{provider => generator}/ticket/LottoShop.kt | 4 ++-- .../ticket/ManualTicketGenerator.kt} | 4 ++-- src/test/kotlin/lotto/LottoAutoTest.kt | 10 +++++----- .../lotto/generator/ticket/ExactTicketGenerator.kt | 7 +++++++ .../{provider => generator}/ticket/MockLottoShop.kt | 6 +++--- .../provider/ticket/ExactTicketProvideStrategy.kt | 7 ------- 9 files changed, 28 insertions(+), 28 deletions(-) rename src/main/kotlin/lotto/{provider => generator}/ticket/ActualLottoShop.kt (59%) rename src/main/kotlin/lotto/{provider/ticket/AutoTicketProvideStrategy.kt => generator/ticket/AutoTicketGenerator.kt} (86%) rename src/main/kotlin/lotto/{provider => generator}/ticket/LottoShop.kt (78%) rename src/main/kotlin/lotto/{provider/ticket/ManualTicketProvideStrategy.kt => generator/ticket/ManualTicketGenerator.kt} (83%) create mode 100644 src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt rename src/test/kotlin/lotto/{provider => generator}/ticket/MockLottoShop.kt (52%) delete mode 100644 src/test/kotlin/lotto/provider/ticket/ExactTicketProvideStrategy.kt diff --git a/src/main/kotlin/lotto/LottoSimulator.kt b/src/main/kotlin/lotto/LottoSimulator.kt index 69297537e8..d61a4d2a05 100644 --- a/src/main/kotlin/lotto/LottoSimulator.kt +++ b/src/main/kotlin/lotto/LottoSimulator.kt @@ -5,8 +5,8 @@ import lotto.domain.LottoResult import lotto.domain.LottoTicket import lotto.domain.LottoTickets import lotto.domain.RankResult -import lotto.provider.ticket.ActualLottoShop -import lotto.provider.ticket.LottoShop +import lotto.generator.ticket.ActualLottoShop +import lotto.generator.ticket.LottoShop import lotto.view.InputView import lotto.view.ResultView import lotto.view.UserInputView @@ -21,7 +21,7 @@ class LottoSimulator( ticketPrice = LottoTicket.PRICE, ) - val lottoTickets = createLottoTickets(lottoShop, purchaseOrder.ticketCount) + val lottoTickets = generateLottoTickets(lottoShop, purchaseOrder.ticketCount) val winningNumber = inputView.getWinningNumber() @@ -43,7 +43,7 @@ class LottoSimulator( resultView.printResult(result) } - private fun createLottoTickets(lottoShop: LottoShop, ticketCount: Int): LottoTickets { + private fun generateLottoTickets(lottoShop: LottoShop, ticketCount: Int): LottoTickets { val manualLottoCount = inputView.getManualLottoCount() val manualTickets = if (manualLottoCount != 0) { diff --git a/src/main/kotlin/lotto/provider/ticket/ActualLottoShop.kt b/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt similarity index 59% rename from src/main/kotlin/lotto/provider/ticket/ActualLottoShop.kt rename to src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt index edd0455f0b..e5ae1d754d 100644 --- a/src/main/kotlin/lotto/provider/ticket/ActualLottoShop.kt +++ b/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt @@ -1,8 +1,8 @@ -package lotto.provider.ticket +package lotto.generator.ticket import lotto.domain.LottoTickets object ActualLottoShop : LottoShop { - override fun provideAutoTickets(ticketCount: Int): LottoTickets = AutoTicketProvideStrategy.provide(ticketCount) - override fun provideManualTickets(ticketCount: Int): LottoTickets = ManualTicketProvideStrategy.provide(ticketCount) + override fun provideAutoTickets(ticketCount: Int): LottoTickets = AutoTicketGenerator.provide(ticketCount) + override fun provideManualTickets(ticketCount: Int): LottoTickets = ManualTicketGenerator.provide(ticketCount) } diff --git a/src/main/kotlin/lotto/provider/ticket/AutoTicketProvideStrategy.kt b/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt similarity index 86% rename from src/main/kotlin/lotto/provider/ticket/AutoTicketProvideStrategy.kt rename to src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt index ba58cbfd2a..c3524f65f6 100644 --- a/src/main/kotlin/lotto/provider/ticket/AutoTicketProvideStrategy.kt +++ b/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt @@ -1,10 +1,10 @@ -package lotto.provider.ticket +package lotto.generator.ticket import lotto.domain.LottoNumber import lotto.domain.LottoTicket import lotto.domain.LottoTickets -object AutoTicketProvideStrategy : TicketProvideStrategy { +object AutoTicketGenerator : TicketGenerator { private val preGeneratedLottoNumbers = (LottoNumber.validNumberRange) .map { LottoNumber(it) } override fun provide(ticketCount: Int): LottoTickets { diff --git a/src/main/kotlin/lotto/provider/ticket/LottoShop.kt b/src/main/kotlin/lotto/generator/ticket/LottoShop.kt similarity index 78% rename from src/main/kotlin/lotto/provider/ticket/LottoShop.kt rename to src/main/kotlin/lotto/generator/ticket/LottoShop.kt index 90ea10a0c6..c83bd2383e 100644 --- a/src/main/kotlin/lotto/provider/ticket/LottoShop.kt +++ b/src/main/kotlin/lotto/generator/ticket/LottoShop.kt @@ -1,4 +1,4 @@ -package lotto.provider.ticket +package lotto.generator.ticket import lotto.domain.LottoTickets @@ -7,6 +7,6 @@ interface LottoShop { fun provideManualTickets(ticketCount: Int): LottoTickets } -interface TicketProvideStrategy { +interface TicketGenerator { fun provide(ticketCount: Int): LottoTickets } diff --git a/src/main/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt b/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt similarity index 83% rename from src/main/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt rename to src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt index 08999f74f3..aed424f592 100644 --- a/src/main/kotlin/lotto/provider/ticket/ManualTicketProvideStrategy.kt +++ b/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt @@ -1,10 +1,10 @@ -package lotto.provider.ticket +package lotto.generator.ticket import lotto.domain.LottoNumber import lotto.domain.LottoTicket import lotto.domain.LottoTickets -object ManualTicketProvideStrategy : TicketProvideStrategy { +object ManualTicketGenerator : TicketGenerator { override fun provide(ticketCount: Int): LottoTickets { val lottoTicketList = mutableListOf() repeat(ticketCount) { diff --git a/src/test/kotlin/lotto/LottoAutoTest.kt b/src/test/kotlin/lotto/LottoAutoTest.kt index ce110a1f76..f04d9baa0e 100644 --- a/src/test/kotlin/lotto/LottoAutoTest.kt +++ b/src/test/kotlin/lotto/LottoAutoTest.kt @@ -7,8 +7,8 @@ import lotto.domain.LottoTicket import lotto.domain.LottoTickets import lotto.domain.Rank import lotto.domain.WinningNumber -import lotto.provider.ticket.ExactTicketProvideStrategy -import lotto.provider.ticket.MockLottoShop +import lotto.generator.ticket.ExactTicketGenerator +import lotto.generator.ticket.MockLottoShop import lotto.view.MockInputView import lotto.view.ResultView @@ -26,7 +26,7 @@ class LottoAutoTest : StringSpec({ resultView = ResultView(), ).simulate( lottoShop = MockLottoShop( - ExactTicketProvideStrategy( + ExactTicketGenerator( LottoTickets( listOf( LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }) @@ -49,7 +49,7 @@ class LottoAutoTest : StringSpec({ resultView = ResultView(), ).simulate( lottoShop = MockLottoShop( - ExactTicketProvideStrategy( + ExactTicketGenerator( LottoTickets( listOf( LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }) @@ -72,7 +72,7 @@ class LottoAutoTest : StringSpec({ resultView = ResultView(), ).simulate( lottoShop = MockLottoShop( - ExactTicketProvideStrategy( + ExactTicketGenerator( LottoTickets( listOf( LottoTicket(listOf(1, 2, 3, 4, 5, 19).map { LottoNumber(it) }) diff --git a/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt b/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt new file mode 100644 index 0000000000..79bcd1b264 --- /dev/null +++ b/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt @@ -0,0 +1,7 @@ +package lotto.generator.ticket + +import lotto.domain.LottoTickets + +class ExactTicketGenerator(private val lottoTickets: LottoTickets) : TicketGenerator { + override fun provide(ticketCount: Int): LottoTickets = lottoTickets +} diff --git a/src/test/kotlin/lotto/provider/ticket/MockLottoShop.kt b/src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt similarity index 52% rename from src/test/kotlin/lotto/provider/ticket/MockLottoShop.kt rename to src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt index 5292a12e33..e442195a73 100644 --- a/src/test/kotlin/lotto/provider/ticket/MockLottoShop.kt +++ b/src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt @@ -1,8 +1,8 @@ -package lotto.provider.ticket +package lotto.generator.ticket import lotto.domain.LottoTickets -class MockLottoShop(private val ticketProvideStrategy: ExactTicketProvideStrategy) : LottoShop { - override fun provideAutoTickets(ticketCount: Int): LottoTickets = ticketProvideStrategy.provide(ticketCount) +class MockLottoShop(private val ticketGenerateStrategy: ExactTicketGenerator) : LottoShop { + override fun provideAutoTickets(ticketCount: Int): LottoTickets = ticketGenerateStrategy.provide(ticketCount) override fun provideManualTickets(ticketCount: Int): LottoTickets = LottoTickets(listOf()) } diff --git a/src/test/kotlin/lotto/provider/ticket/ExactTicketProvideStrategy.kt b/src/test/kotlin/lotto/provider/ticket/ExactTicketProvideStrategy.kt deleted file mode 100644 index d5ea5710e9..0000000000 --- a/src/test/kotlin/lotto/provider/ticket/ExactTicketProvideStrategy.kt +++ /dev/null @@ -1,7 +0,0 @@ -package lotto.provider.ticket - -import lotto.domain.LottoTickets - -class ExactTicketProvideStrategy(private val lottoTickets: LottoTickets) : TicketProvideStrategy { - override fun provide(ticketCount: Int): LottoTickets = lottoTickets -} From 9a4122a6e652d338dcd0518aaeae737f03cdf43b Mon Sep 17 00:00:00 2001 From: "silvio.oivlis" Date: Fri, 8 Dec 2023 18:40:43 +0900 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20=EB=B0=80=EB=B6=80=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt | 4 ++-- src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt | 2 +- src/main/kotlin/lotto/generator/ticket/LottoShop.kt | 2 +- .../kotlin/lotto/generator/ticket/ManualTicketGenerator.kt | 2 +- .../kotlin/lotto/generator/ticket/ExactTicketGenerator.kt | 2 +- src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt b/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt index e5ae1d754d..dca7966042 100644 --- a/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt +++ b/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt @@ -3,6 +3,6 @@ package lotto.generator.ticket import lotto.domain.LottoTickets object ActualLottoShop : LottoShop { - override fun provideAutoTickets(ticketCount: Int): LottoTickets = AutoTicketGenerator.provide(ticketCount) - override fun provideManualTickets(ticketCount: Int): LottoTickets = ManualTicketGenerator.provide(ticketCount) + override fun provideAutoTickets(ticketCount: Int): LottoTickets = AutoTicketGenerator.create(ticketCount) + override fun provideManualTickets(ticketCount: Int): LottoTickets = ManualTicketGenerator.create(ticketCount) } diff --git a/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt b/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt index c3524f65f6..bdc54096d2 100644 --- a/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt +++ b/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt @@ -7,7 +7,7 @@ import lotto.domain.LottoTickets object AutoTicketGenerator : TicketGenerator { private val preGeneratedLottoNumbers = (LottoNumber.validNumberRange) .map { LottoNumber(it) } - override fun provide(ticketCount: Int): LottoTickets { + override fun create(ticketCount: Int): LottoTickets { val tickets = List(ticketCount) { LottoTicket( preGeneratedLottoNumbers diff --git a/src/main/kotlin/lotto/generator/ticket/LottoShop.kt b/src/main/kotlin/lotto/generator/ticket/LottoShop.kt index c83bd2383e..1d1ce502ad 100644 --- a/src/main/kotlin/lotto/generator/ticket/LottoShop.kt +++ b/src/main/kotlin/lotto/generator/ticket/LottoShop.kt @@ -8,5 +8,5 @@ interface LottoShop { } interface TicketGenerator { - fun provide(ticketCount: Int): LottoTickets + fun create(ticketCount: Int): LottoTickets } diff --git a/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt b/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt index aed424f592..1556487be8 100644 --- a/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt +++ b/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt @@ -5,7 +5,7 @@ import lotto.domain.LottoTicket import lotto.domain.LottoTickets object ManualTicketGenerator : TicketGenerator { - override fun provide(ticketCount: Int): LottoTickets { + override fun create(ticketCount: Int): LottoTickets { val lottoTicketList = mutableListOf() repeat(ticketCount) { val lottoTicket = LottoTicket(readln().trim().split(",").map { it.toInt() }.map { LottoNumber(it) }) diff --git a/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt b/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt index 79bcd1b264..9457ca4199 100644 --- a/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt +++ b/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt @@ -3,5 +3,5 @@ package lotto.generator.ticket import lotto.domain.LottoTickets class ExactTicketGenerator(private val lottoTickets: LottoTickets) : TicketGenerator { - override fun provide(ticketCount: Int): LottoTickets = lottoTickets + override fun create(ticketCount: Int): LottoTickets = lottoTickets } diff --git a/src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt b/src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt index e442195a73..cbcee15102 100644 --- a/src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt +++ b/src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt @@ -3,6 +3,6 @@ package lotto.generator.ticket import lotto.domain.LottoTickets class MockLottoShop(private val ticketGenerateStrategy: ExactTicketGenerator) : LottoShop { - override fun provideAutoTickets(ticketCount: Int): LottoTickets = ticketGenerateStrategy.provide(ticketCount) + override fun provideAutoTickets(ticketCount: Int): LottoTickets = ticketGenerateStrategy.create(ticketCount) override fun provideManualTickets(ticketCount: Int): LottoTickets = LottoTickets(listOf()) } From 1b40de8e71b9fb50390b37618cdb7da8fd1d0d3f Mon Sep 17 00:00:00 2001 From: "silvio.oivlis" Date: Mon, 11 Dec 2023 11:55:17 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20ActualLottoShop=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=A1=9C=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/LottoSimulator.kt | 9 ++++++++- .../kotlin/lotto/generator/ticket/ActualLottoShop.kt | 9 ++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/lotto/LottoSimulator.kt b/src/main/kotlin/lotto/LottoSimulator.kt index d61a4d2a05..3d7f855919 100644 --- a/src/main/kotlin/lotto/LottoSimulator.kt +++ b/src/main/kotlin/lotto/LottoSimulator.kt @@ -6,7 +6,9 @@ import lotto.domain.LottoTicket import lotto.domain.LottoTickets import lotto.domain.RankResult import lotto.generator.ticket.ActualLottoShop +import lotto.generator.ticket.AutoTicketGenerator import lotto.generator.ticket.LottoShop +import lotto.generator.ticket.ManualTicketGenerator import lotto.view.InputView import lotto.view.ResultView import lotto.view.UserInputView @@ -62,5 +64,10 @@ fun main() { LottoSimulator( UserInputView(), ResultView() - ).simulate(lottoShop = ActualLottoShop) + ).simulate( + lottoShop = ActualLottoShop( + autoTicketGenerator = AutoTicketGenerator, + manualTicketGenerator = ManualTicketGenerator, + ) + ) } diff --git a/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt b/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt index dca7966042..0495d93d58 100644 --- a/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt +++ b/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt @@ -2,7 +2,10 @@ package lotto.generator.ticket import lotto.domain.LottoTickets -object ActualLottoShop : LottoShop { - override fun provideAutoTickets(ticketCount: Int): LottoTickets = AutoTicketGenerator.create(ticketCount) - override fun provideManualTickets(ticketCount: Int): LottoTickets = ManualTicketGenerator.create(ticketCount) +class ActualLottoShop( + private val autoTicketGenerator: TicketGenerator, + private val manualTicketGenerator: TicketGenerator, +) : LottoShop { + override fun provideAutoTickets(ticketCount: Int): LottoTickets = autoTicketGenerator.create(ticketCount) + override fun provideManualTickets(ticketCount: Int): LottoTickets = manualTicketGenerator.create(ticketCount) } From 604d93d04be343f13893fa7a62d875054fc79dc9 Mon Sep 17 00:00:00 2001 From: "silvio.oivlis" Date: Mon, 11 Dec 2023 12:01:36 +0900 Subject: [PATCH 6/8] =?UTF-8?q?test:=20ExactTicketGenerator=20input=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EB=B0=98=EC=98=81=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/lotto/LottoAutoTest.kt | 8 ++++---- .../kotlin/lotto/generator/ticket/ExactTicketGenerator.kt | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/test/kotlin/lotto/LottoAutoTest.kt b/src/test/kotlin/lotto/LottoAutoTest.kt index f04d9baa0e..1129fdc0a4 100644 --- a/src/test/kotlin/lotto/LottoAutoTest.kt +++ b/src/test/kotlin/lotto/LottoAutoTest.kt @@ -17,7 +17,7 @@ class LottoAutoTest : StringSpec({ "winning statistics should calculate correct profit" { LottoSimulator( inputView = MockInputView( - budget = 5000, + budget = 1000, winningNumber = WinningNumber( LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }), bonusNumber = LottoNumber(19) @@ -40,7 +40,7 @@ class LottoAutoTest : StringSpec({ "winning statistics should show correct ROI" { LottoSimulator( inputView = MockInputView( - budget = 5000, + budget = 1000, winningNumber = WinningNumber( LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }), bonusNumber = LottoNumber(19) @@ -57,13 +57,13 @@ class LottoAutoTest : StringSpec({ ) ) ), - ).profitRate.shouldBe(400_000) + ).profitRate.shouldBe(2_000_000) } "second place result should be correct" { LottoSimulator( inputView = MockInputView( - budget = 5000, + budget = 1000, winningNumber = WinningNumber( LottoTicket(listOf(1, 2, 3, 4, 5, 9).map { LottoNumber(it) }), bonusNumber = LottoNumber(19) diff --git a/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt b/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt index 9457ca4199..ade442edd5 100644 --- a/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt +++ b/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt @@ -3,5 +3,8 @@ package lotto.generator.ticket import lotto.domain.LottoTickets class ExactTicketGenerator(private val lottoTickets: LottoTickets) : TicketGenerator { - override fun create(ticketCount: Int): LottoTickets = lottoTickets + override fun create(ticketCount: Int): LottoTickets { + require(ticketCount == lottoTickets.lottoTicketList.size) + return lottoTickets + } } From 34849859adf09f7977c9657521823ef4f13e1d29 Mon Sep 17 00:00:00 2001 From: "silvio.oivlis" Date: Mon, 11 Dec 2023 13:44:15 +0900 Subject: [PATCH 7/8] =?UTF-8?q?refactor:=20TicketGenerator=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/LottoSimulator.kt | 7 ++-- .../kotlin/lotto/generator/ActualLottoShop.kt | 14 ++++++++ src/main/kotlin/lotto/generator/LottoShop.kt | 8 +++++ .../lotto/generator/ticket/ActualLottoShop.kt | 11 ------- .../generator/ticket/AutoTicketGenerator.kt | 5 +-- .../lotto/generator/ticket/LottoShop.kt | 12 ------- .../generator/ticket/ManualTicketGenerator.kt | 15 ++++----- src/main/kotlin/lotto/view/InputView.kt | 2 +- src/main/kotlin/lotto/view/UserInputView.kt | 9 +++++- src/test/kotlin/lotto/LottoAutoTest.kt | 32 +++++-------------- .../kotlin/lotto/generator/MockLottoShop.kt | 10 ++++++ .../ticket/AutoTicketGeneratorTest.kt | 14 ++++++++ .../generator/ticket/ExactTicketGenerator.kt | 10 ------ .../ticket/ManualTicketGeneratorTest.kt | 30 +++++++++++++++++ .../lotto/generator/ticket/MockLottoShop.kt | 8 ----- src/test/kotlin/lotto/view/MockInputView.kt | 5 +-- 16 files changed, 109 insertions(+), 83 deletions(-) create mode 100644 src/main/kotlin/lotto/generator/ActualLottoShop.kt create mode 100644 src/main/kotlin/lotto/generator/LottoShop.kt delete mode 100644 src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt delete mode 100644 src/main/kotlin/lotto/generator/ticket/LottoShop.kt create mode 100644 src/test/kotlin/lotto/generator/MockLottoShop.kt create mode 100644 src/test/kotlin/lotto/generator/ticket/AutoTicketGeneratorTest.kt delete mode 100644 src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt create mode 100644 src/test/kotlin/lotto/generator/ticket/ManualTicketGeneratorTest.kt delete mode 100644 src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt diff --git a/src/main/kotlin/lotto/LottoSimulator.kt b/src/main/kotlin/lotto/LottoSimulator.kt index 3d7f855919..90103253a6 100644 --- a/src/main/kotlin/lotto/LottoSimulator.kt +++ b/src/main/kotlin/lotto/LottoSimulator.kt @@ -5,9 +5,9 @@ import lotto.domain.LottoResult import lotto.domain.LottoTicket import lotto.domain.LottoTickets import lotto.domain.RankResult -import lotto.generator.ticket.ActualLottoShop +import lotto.generator.ActualLottoShop +import lotto.generator.LottoShop import lotto.generator.ticket.AutoTicketGenerator -import lotto.generator.ticket.LottoShop import lotto.generator.ticket.ManualTicketGenerator import lotto.view.InputView import lotto.view.ResultView @@ -49,8 +49,7 @@ class LottoSimulator( val manualLottoCount = inputView.getManualLottoCount() val manualTickets = if (manualLottoCount != 0) { - inputView.printManualLottoInputString() - lottoShop.provideManualTickets(manualLottoCount) + lottoShop.provideManualTickets(inputView.getManualNumbers(manualLottoCount)) } else LottoTickets(listOf()) val autoTickets = lottoShop.provideAutoTickets(ticketCount - manualLottoCount) diff --git a/src/main/kotlin/lotto/generator/ActualLottoShop.kt b/src/main/kotlin/lotto/generator/ActualLottoShop.kt new file mode 100644 index 0000000000..38d0b15972 --- /dev/null +++ b/src/main/kotlin/lotto/generator/ActualLottoShop.kt @@ -0,0 +1,14 @@ +package lotto.generator + +import lotto.domain.LottoTickets +import lotto.generator.ticket.AutoTicketGenerator +import lotto.generator.ticket.ManualTicketGenerator + +class ActualLottoShop( + private val autoTicketGenerator: AutoTicketGenerator, + private val manualTicketGenerator: ManualTicketGenerator, +) : LottoShop { + override fun provideAutoTickets(ticketCount: Int): LottoTickets = autoTicketGenerator.create(ticketCount) + override fun provideManualTickets(manualNumbersList: List>): LottoTickets = + manualTicketGenerator.create(manualNumbersList) +} diff --git a/src/main/kotlin/lotto/generator/LottoShop.kt b/src/main/kotlin/lotto/generator/LottoShop.kt new file mode 100644 index 0000000000..b28d9b4841 --- /dev/null +++ b/src/main/kotlin/lotto/generator/LottoShop.kt @@ -0,0 +1,8 @@ +package lotto.generator + +import lotto.domain.LottoTickets + +interface LottoShop { + fun provideAutoTickets(ticketCount: Int): LottoTickets + fun provideManualTickets(manualNumbersList: List>): LottoTickets +} diff --git a/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt b/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt deleted file mode 100644 index 0495d93d58..0000000000 --- a/src/main/kotlin/lotto/generator/ticket/ActualLottoShop.kt +++ /dev/null @@ -1,11 +0,0 @@ -package lotto.generator.ticket - -import lotto.domain.LottoTickets - -class ActualLottoShop( - private val autoTicketGenerator: TicketGenerator, - private val manualTicketGenerator: TicketGenerator, -) : LottoShop { - override fun provideAutoTickets(ticketCount: Int): LottoTickets = autoTicketGenerator.create(ticketCount) - override fun provideManualTickets(ticketCount: Int): LottoTickets = manualTicketGenerator.create(ticketCount) -} diff --git a/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt b/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt index bdc54096d2..9871c49e95 100644 --- a/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt +++ b/src/main/kotlin/lotto/generator/ticket/AutoTicketGenerator.kt @@ -4,10 +4,11 @@ import lotto.domain.LottoNumber import lotto.domain.LottoTicket import lotto.domain.LottoTickets -object AutoTicketGenerator : TicketGenerator { +object AutoTicketGenerator { private val preGeneratedLottoNumbers = (LottoNumber.validNumberRange) .map { LottoNumber(it) } - override fun create(ticketCount: Int): LottoTickets { + + fun create(ticketCount: Int): LottoTickets { val tickets = List(ticketCount) { LottoTicket( preGeneratedLottoNumbers diff --git a/src/main/kotlin/lotto/generator/ticket/LottoShop.kt b/src/main/kotlin/lotto/generator/ticket/LottoShop.kt deleted file mode 100644 index 1d1ce502ad..0000000000 --- a/src/main/kotlin/lotto/generator/ticket/LottoShop.kt +++ /dev/null @@ -1,12 +0,0 @@ -package lotto.generator.ticket - -import lotto.domain.LottoTickets - -interface LottoShop { - fun provideAutoTickets(ticketCount: Int): LottoTickets - fun provideManualTickets(ticketCount: Int): LottoTickets -} - -interface TicketGenerator { - fun create(ticketCount: Int): LottoTickets -} diff --git a/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt b/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt index 1556487be8..c3eede0c89 100644 --- a/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt +++ b/src/main/kotlin/lotto/generator/ticket/ManualTicketGenerator.kt @@ -4,13 +4,12 @@ import lotto.domain.LottoNumber import lotto.domain.LottoTicket import lotto.domain.LottoTickets -object ManualTicketGenerator : TicketGenerator { - override fun create(ticketCount: Int): LottoTickets { - val lottoTicketList = mutableListOf() - repeat(ticketCount) { - val lottoTicket = LottoTicket(readln().trim().split(",").map { it.toInt() }.map { LottoNumber(it) }) - lottoTicketList.add(lottoTicket) - } - return LottoTickets(lottoTicketList) +object ManualTicketGenerator { + fun create(manualNumbersList: List>): LottoTickets { + return LottoTickets( + manualNumbersList.map { list -> + LottoTicket(list.map { LottoNumber(it) }) + } + ) } } diff --git a/src/main/kotlin/lotto/view/InputView.kt b/src/main/kotlin/lotto/view/InputView.kt index 74d8a224d1..14034c611f 100644 --- a/src/main/kotlin/lotto/view/InputView.kt +++ b/src/main/kotlin/lotto/view/InputView.kt @@ -12,5 +12,5 @@ interface InputView { fun getManualLottoCount(): Int - fun printManualLottoInputString() + fun getManualNumbers(manualLottoCount: Int): List> } diff --git a/src/main/kotlin/lotto/view/UserInputView.kt b/src/main/kotlin/lotto/view/UserInputView.kt index ef0b2ab8d7..892101418c 100644 --- a/src/main/kotlin/lotto/view/UserInputView.kt +++ b/src/main/kotlin/lotto/view/UserInputView.kt @@ -35,8 +35,15 @@ class UserInputView : InputView { return readln().trim().toInt() } - override fun printManualLottoInputString() { + override fun getManualNumbers(manualLottoCount: Int): List> { println("수동으로 구매할 번호를 입력해 주세요.") + val lottoTicketNumbers = mutableListOf>() + + repeat(manualLottoCount) { + val lottoTicket = readln().trim().split(",").map { it.toInt() } + lottoTicketNumbers.add(lottoTicket) + } + return lottoTicketNumbers } private fun LottoTickets.print() { diff --git a/src/test/kotlin/lotto/LottoAutoTest.kt b/src/test/kotlin/lotto/LottoAutoTest.kt index 1129fdc0a4..125aa82f99 100644 --- a/src/test/kotlin/lotto/LottoAutoTest.kt +++ b/src/test/kotlin/lotto/LottoAutoTest.kt @@ -4,11 +4,10 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe import lotto.domain.LottoNumber import lotto.domain.LottoTicket -import lotto.domain.LottoTickets import lotto.domain.Rank import lotto.domain.WinningNumber -import lotto.generator.ticket.ExactTicketGenerator -import lotto.generator.ticket.MockLottoShop +import lotto.generator.MockLottoShop +import lotto.generator.ticket.ManualTicketGenerator import lotto.view.MockInputView import lotto.view.ResultView @@ -22,17 +21,12 @@ class LottoAutoTest : StringSpec({ LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }), bonusNumber = LottoNumber(19) ), + manualNumbersList = listOf(listOf(1, 2, 3, 4, 5, 6)) ), resultView = ResultView(), ).simulate( lottoShop = MockLottoShop( - ExactTicketGenerator( - LottoTickets( - listOf( - LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }) - ) - ) - ), + manualTicketGenerator = ManualTicketGenerator ) ).totalPrize shouldBe Rank.FirstPlace.prize } @@ -45,17 +39,12 @@ class LottoAutoTest : StringSpec({ LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }), bonusNumber = LottoNumber(19) ), + manualNumbersList = listOf(listOf(1, 2, 3, 4, 5, 6)) ), resultView = ResultView(), ).simulate( lottoShop = MockLottoShop( - ExactTicketGenerator( - LottoTickets( - listOf( - LottoTicket(listOf(1, 2, 3, 4, 5, 6).map { LottoNumber(it) }) - ) - ) - ) + manualTicketGenerator = ManualTicketGenerator ), ).profitRate.shouldBe(2_000_000) } @@ -68,17 +57,12 @@ class LottoAutoTest : StringSpec({ LottoTicket(listOf(1, 2, 3, 4, 5, 9).map { LottoNumber(it) }), bonusNumber = LottoNumber(19) ), + manualNumbersList = listOf(listOf(1, 2, 3, 4, 5, 19)) ), resultView = ResultView(), ).simulate( lottoShop = MockLottoShop( - ExactTicketGenerator( - LottoTickets( - listOf( - LottoTicket(listOf(1, 2, 3, 4, 5, 19).map { LottoNumber(it) }) - ) - ) - ) + manualTicketGenerator = ManualTicketGenerator ), ).totalPrize shouldBe Rank.SecondPlace.prize } diff --git a/src/test/kotlin/lotto/generator/MockLottoShop.kt b/src/test/kotlin/lotto/generator/MockLottoShop.kt new file mode 100644 index 0000000000..5891c31bb1 --- /dev/null +++ b/src/test/kotlin/lotto/generator/MockLottoShop.kt @@ -0,0 +1,10 @@ +package lotto.generator + +import lotto.domain.LottoTickets +import lotto.generator.ticket.ManualTicketGenerator + +class MockLottoShop(private val manualTicketGenerator: ManualTicketGenerator) : LottoShop { + override fun provideAutoTickets(ticketCount: Int): LottoTickets = LottoTickets(listOf()) + override fun provideManualTickets(manualNumbersList: List>): LottoTickets = + manualTicketGenerator.create(manualNumbersList) +} diff --git a/src/test/kotlin/lotto/generator/ticket/AutoTicketGeneratorTest.kt b/src/test/kotlin/lotto/generator/ticket/AutoTicketGeneratorTest.kt new file mode 100644 index 0000000000..a1f7227aca --- /dev/null +++ b/src/test/kotlin/lotto/generator/ticket/AutoTicketGeneratorTest.kt @@ -0,0 +1,14 @@ +package lotto.generator.ticket + +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe + +class AutoTicketGeneratorTest : BehaviorSpec({ + given("auto ticket generator") { + `when`("creates lotto Tickets") { + then("should provide correct ticket count") { + AutoTicketGenerator.create(3).lottoTicketList.size shouldBe 3 + } + } + } +}) diff --git a/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt b/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt deleted file mode 100644 index ade442edd5..0000000000 --- a/src/test/kotlin/lotto/generator/ticket/ExactTicketGenerator.kt +++ /dev/null @@ -1,10 +0,0 @@ -package lotto.generator.ticket - -import lotto.domain.LottoTickets - -class ExactTicketGenerator(private val lottoTickets: LottoTickets) : TicketGenerator { - override fun create(ticketCount: Int): LottoTickets { - require(ticketCount == lottoTickets.lottoTicketList.size) - return lottoTickets - } -} diff --git a/src/test/kotlin/lotto/generator/ticket/ManualTicketGeneratorTest.kt b/src/test/kotlin/lotto/generator/ticket/ManualTicketGeneratorTest.kt new file mode 100644 index 0000000000..5ed47065a9 --- /dev/null +++ b/src/test/kotlin/lotto/generator/ticket/ManualTicketGeneratorTest.kt @@ -0,0 +1,30 @@ +package lotto.generator.ticket + +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import lotto.domain.LottoNumber +import lotto.domain.LottoTicket + +class ManualTicketGeneratorTest : BehaviorSpec({ + given("manual ticket generator") { + `when`("creates lotto Tickets") { + then("should provide correct tickets") { + val ticketBlueprint1 = listOf(1, 2, 3, 4, 5, 6) + val ticketBlueprint2 = listOf(3, 4, 5, 6, 7, 8) + val ticketBlueprint3 = listOf(5, 6, 7, 8, 9, 13) + + val lottoTickets = ManualTicketGenerator.create( + listOf( + ticketBlueprint1, + ticketBlueprint2, + ticketBlueprint3, + ) + ) + lottoTickets.lottoTicketList.size shouldBe 3 + lottoTickets.lottoTicketList[0] shouldBe LottoTicket(ticketBlueprint1.map { LottoNumber(it) }) + lottoTickets.lottoTicketList[1] shouldBe LottoTicket(ticketBlueprint2.map { LottoNumber(it) }) + lottoTickets.lottoTicketList[2] shouldBe LottoTicket(ticketBlueprint3.map { LottoNumber(it) }) + } + } + } +}) diff --git a/src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt b/src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt deleted file mode 100644 index cbcee15102..0000000000 --- a/src/test/kotlin/lotto/generator/ticket/MockLottoShop.kt +++ /dev/null @@ -1,8 +0,0 @@ -package lotto.generator.ticket - -import lotto.domain.LottoTickets - -class MockLottoShop(private val ticketGenerateStrategy: ExactTicketGenerator) : LottoShop { - override fun provideAutoTickets(ticketCount: Int): LottoTickets = ticketGenerateStrategy.create(ticketCount) - override fun provideManualTickets(ticketCount: Int): LottoTickets = LottoTickets(listOf()) -} diff --git a/src/test/kotlin/lotto/view/MockInputView.kt b/src/test/kotlin/lotto/view/MockInputView.kt index 7ef186aaaf..48dd281e8c 100644 --- a/src/test/kotlin/lotto/view/MockInputView.kt +++ b/src/test/kotlin/lotto/view/MockInputView.kt @@ -6,6 +6,7 @@ import lotto.domain.WinningNumber class MockInputView( private val budget: Int, private val winningNumber: WinningNumber, + private val manualNumbersList: List>, ) : InputView { override fun getBudget(): Int = budget @@ -13,7 +14,7 @@ class MockInputView( override fun printPurchasedLotto(autoLottoTickets: LottoTickets, manualLottoTickets: LottoTickets) = Unit - override fun getManualLottoCount(): Int = 0 + override fun getManualLottoCount(): Int = manualNumbersList.size - override fun printManualLottoInputString() = Unit + override fun getManualNumbers(manualLottoCount: Int): List> = manualNumbersList } From c30e95172c40d83e85e65d6360021d951e20742b Mon Sep 17 00:00:00 2001 From: "silvio.oivlis" Date: Mon, 11 Dec 2023 15:59:22 +0900 Subject: [PATCH 8/8] =?UTF-8?q?refactor:=20autoLottoTickets=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EB=A1=9C=EC=A7=81=20=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/LottoSimulator.kt | 2 +- src/main/kotlin/lotto/generator/ActualLottoShop.kt | 2 +- src/main/kotlin/lotto/generator/LottoShop.kt | 2 +- src/test/kotlin/lotto/generator/MockLottoShop.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/lotto/LottoSimulator.kt b/src/main/kotlin/lotto/LottoSimulator.kt index 90103253a6..b342f6f417 100644 --- a/src/main/kotlin/lotto/LottoSimulator.kt +++ b/src/main/kotlin/lotto/LottoSimulator.kt @@ -52,7 +52,7 @@ class LottoSimulator( lottoShop.provideManualTickets(inputView.getManualNumbers(manualLottoCount)) } else LottoTickets(listOf()) - val autoTickets = lottoShop.provideAutoTickets(ticketCount - manualLottoCount) + val autoTickets = lottoShop.provideAutoTickets(ticketCount, manualLottoCount) inputView.printPurchasedLotto(autoLottoTickets = autoTickets, manualLottoTickets = manualTickets) return LottoTickets(manualTickets.lottoTicketList + autoTickets.lottoTicketList) diff --git a/src/main/kotlin/lotto/generator/ActualLottoShop.kt b/src/main/kotlin/lotto/generator/ActualLottoShop.kt index 38d0b15972..48a611deeb 100644 --- a/src/main/kotlin/lotto/generator/ActualLottoShop.kt +++ b/src/main/kotlin/lotto/generator/ActualLottoShop.kt @@ -8,7 +8,7 @@ class ActualLottoShop( private val autoTicketGenerator: AutoTicketGenerator, private val manualTicketGenerator: ManualTicketGenerator, ) : LottoShop { - override fun provideAutoTickets(ticketCount: Int): LottoTickets = autoTicketGenerator.create(ticketCount) + override fun provideAutoTickets(ticketCount: Int, preGeneratedTicketCount: Int): LottoTickets = autoTicketGenerator.create(ticketCount - preGeneratedTicketCount) override fun provideManualTickets(manualNumbersList: List>): LottoTickets = manualTicketGenerator.create(manualNumbersList) } diff --git a/src/main/kotlin/lotto/generator/LottoShop.kt b/src/main/kotlin/lotto/generator/LottoShop.kt index b28d9b4841..5bcb2e5cf4 100644 --- a/src/main/kotlin/lotto/generator/LottoShop.kt +++ b/src/main/kotlin/lotto/generator/LottoShop.kt @@ -3,6 +3,6 @@ package lotto.generator import lotto.domain.LottoTickets interface LottoShop { - fun provideAutoTickets(ticketCount: Int): LottoTickets + fun provideAutoTickets(ticketCount: Int, preGeneratedTicketCount: Int): LottoTickets fun provideManualTickets(manualNumbersList: List>): LottoTickets } diff --git a/src/test/kotlin/lotto/generator/MockLottoShop.kt b/src/test/kotlin/lotto/generator/MockLottoShop.kt index 5891c31bb1..89e2efe263 100644 --- a/src/test/kotlin/lotto/generator/MockLottoShop.kt +++ b/src/test/kotlin/lotto/generator/MockLottoShop.kt @@ -4,7 +4,7 @@ import lotto.domain.LottoTickets import lotto.generator.ticket.ManualTicketGenerator class MockLottoShop(private val manualTicketGenerator: ManualTicketGenerator) : LottoShop { - override fun provideAutoTickets(ticketCount: Int): LottoTickets = LottoTickets(listOf()) + override fun provideAutoTickets(ticketCount: Int, preGeneratedTicketCount: Int): LottoTickets = LottoTickets(listOf()) override fun provideManualTickets(manualNumbersList: List>): LottoTickets = manualTicketGenerator.create(manualNumbersList) }