From afc8cca43592d07a89a9b56086f94b2376d07cf9 Mon Sep 17 00:00:00 2001 From: hyemdooly Date: Wed, 19 Apr 2023 00:36:50 +0900 Subject: [PATCH 01/46] =?UTF-8?q?test:=20PriceCalculatorTest=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../movie/domain/PriceCalculatorTest.kt | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 domain/src/test/java/woowacourse/movie/domain/PriceCalculatorTest.kt diff --git a/domain/src/test/java/woowacourse/movie/domain/PriceCalculatorTest.kt b/domain/src/test/java/woowacourse/movie/domain/PriceCalculatorTest.kt new file mode 100644 index 000000000..f600d1ffa --- /dev/null +++ b/domain/src/test/java/woowacourse/movie/domain/PriceCalculatorTest.kt @@ -0,0 +1,37 @@ +package woowacourse.movie.domain + +import junit.framework.TestCase.assertEquals +import org.junit.Test +import woowacourse.movie.domain.policy.MorningPolicy +import woowacourse.movie.domain.policy.MovieDayPolicy +import woowacourse.movie.domain.policy.NightPolicy +import woowacourse.movie.domain.ticket.Price +import woowacourse.movie.domain.ticket.PriceCalculator +import java.time.LocalDate +import java.time.LocalTime + +class PriceCalculatorTest { + @Test + fun `조조에 해당하지만 무비데이면 무비데이 할인이 선적용된다`() { + val policies = listOf( + MovieDayPolicy(), + MorningPolicy() + ) + val calculator = PriceCalculator(policies, Price(13000)) + val actual = calculator.calculate(LocalDate.of(2023, 4, 30), LocalTime.of(9, 0), 1) + val expected = Price(9700) + assertEquals(actual, expected) + } + + @Test + fun `야간에 해당하지만 무비데이면 무비데이 할인이 선적용된다`() { + val policies = listOf( + MovieDayPolicy(), + NightPolicy() + ) + val calculator = PriceCalculator(policies, Price(13000)) + val actual = calculator.calculate(LocalDate.of(2023, 4, 30), LocalTime.of(21, 0), 1) + val expected = Price(9700) + assertEquals(actual, expected) + } +} From 4ca2988aa91493d0f717c311f162eb6d9f0b39f0 Mon Sep 17 00:00:00 2001 From: hyemdooly Date: Wed, 19 Apr 2023 00:37:35 +0900 Subject: [PATCH 02/46] =?UTF-8?q?test:=20TicketTest=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../woowacourse/movie/domain/TicketTest.kt | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/domain/src/test/java/woowacourse/movie/domain/TicketTest.kt b/domain/src/test/java/woowacourse/movie/domain/TicketTest.kt index 88d844778..b9f76f8ed 100644 --- a/domain/src/test/java/woowacourse/movie/domain/TicketTest.kt +++ b/domain/src/test/java/woowacourse/movie/domain/TicketTest.kt @@ -13,33 +13,20 @@ import java.time.LocalTime class TicketTest { @Test - fun `조조에 해당하지만 무비데이면 무비데이 할인이 선적용된다`() { - val policies = listOf( - MovieDayPolicy(), - MorningPolicy() - ) - val actual = Ticket( - policies, LocalDate.of(2023, 4, 30), LocalTime.of(9, 0), - Price() - ).price - val expected = Price(9700) - assertEquals(actual, expected) - } - - @Test - fun `야간에 해당하지만 무비데이면 무비데이 할인이 선적용된다`() { + fun `티켓을 생성하면 정책에 따라 계산한다`() { val policies = listOf( MovieDayPolicy(), + MorningPolicy(), NightPolicy() ) val actual = Ticket( - policies, LocalDate.of(2023, 4, 30), LocalTime.of(21, 0), + policies, LocalDate.of(2023, 4, 30), LocalTime.of(9, 0), Price() ).price - val expected = Price(9700) + val expected = Price(29100) assertEquals(actual, expected) } private fun Ticket(policies: List, playingDate: LocalDate, playingTime: LocalTime, price: Price): Ticket = - Ticket.of(policies, "해리포터와 마법사의 돌", playingDate, playingTime, 1, price) + Ticket.of(policies, "해리포터와 마법사의 돌", playingDate, playingTime, 3, price) } From aaace5875855f989dddc91455f2590f8e7bb9494 Mon Sep 17 00:00:00 2001 From: hyemdooly Date: Wed, 19 Apr 2023 00:38:11 +0900 Subject: [PATCH 03/46] =?UTF-8?q?refactor:=20fold=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=97=AC=20=EC=BD=94=EB=93=9C=20=EB=8B=A8?= =?UTF-8?q?=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../movie/domain/ticket/PriceCalculator.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/domain/src/main/java/woowacourse/movie/domain/ticket/PriceCalculator.kt b/domain/src/main/java/woowacourse/movie/domain/ticket/PriceCalculator.kt index 84ee11f52..51686f80a 100644 --- a/domain/src/main/java/woowacourse/movie/domain/ticket/PriceCalculator.kt +++ b/domain/src/main/java/woowacourse/movie/domain/ticket/PriceCalculator.kt @@ -4,11 +4,17 @@ import woowacourse.movie.domain.policy.DiscountPolicy import java.time.LocalDate import java.time.LocalTime -class PriceCalculator(private val polices: List, private val defaultPrice: Price = Price()) { +class PriceCalculator( + private val policies: List, + private val defaultPrice: Price = Price() +) { fun calculate(playingDate: LocalDate, playingTime: LocalTime, count: Int): Price { - var calculatePrice = defaultPrice - for (policy in polices) { - calculatePrice = policy.calculate(playingDate, playingTime, calculatePrice) + val calculatePrice = policies.fold(defaultPrice) { total, policy -> + policy.calculate( + playingDate, + playingTime, + total + ) } return Price(calculatePrice.price * count) } From 067af6b1f14e1862fe48b3418385e11f1d1e8912 Mon Sep 17 00:00:00 2001 From: hyemdooly Date: Wed, 19 Apr 2023 00:38:47 +0900 Subject: [PATCH 04/46] =?UTF-8?q?refactor:=20PlayingDateTimes=EB=A1=9C=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=AA=85=EA=B3=BC=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../movie/domain/{ => movie}/PlayingDateTimes.kt | 6 +----- .../domain/{PlayingTimesTest.kt => PlayingDateTimesTest.kt} | 3 ++- 2 files changed, 3 insertions(+), 6 deletions(-) rename domain/src/main/java/woowacourse/movie/domain/{ => movie}/PlayingDateTimes.kt (90%) rename domain/src/test/java/woowacourse/movie/domain/{PlayingTimesTest.kt => PlayingDateTimesTest.kt} (92%) diff --git a/domain/src/main/java/woowacourse/movie/domain/PlayingDateTimes.kt b/domain/src/main/java/woowacourse/movie/domain/movie/PlayingDateTimes.kt similarity index 90% rename from domain/src/main/java/woowacourse/movie/domain/PlayingDateTimes.kt rename to domain/src/main/java/woowacourse/movie/domain/movie/PlayingDateTimes.kt index ecb9876b7..f09ef4b80 100644 --- a/domain/src/main/java/woowacourse/movie/domain/PlayingDateTimes.kt +++ b/domain/src/main/java/woowacourse/movie/domain/movie/PlayingDateTimes.kt @@ -1,4 +1,4 @@ -package woowacourse.movie.domain +package woowacourse.movie.domain.movie import java.time.DayOfWeek import java.time.LocalDate @@ -8,10 +8,6 @@ class PlayingDateTimes(startDate: LocalDate, endDate: LocalDate) { // 뷰를 위 private val _times: Map> = makeDates(startDate, endDate).associateWith { date -> makeTimes(date) } val times: Map> get() = _times.toMap() - // val startDate: LocalDate - // get() = times.keys.max() - // val endDate: LocalDate - // get() = times.keys.min() private fun makeDates(startDate: LocalDate, endDate: LocalDate): List { var date = startDate diff --git a/domain/src/test/java/woowacourse/movie/domain/PlayingTimesTest.kt b/domain/src/test/java/woowacourse/movie/domain/PlayingDateTimesTest.kt similarity index 92% rename from domain/src/test/java/woowacourse/movie/domain/PlayingTimesTest.kt rename to domain/src/test/java/woowacourse/movie/domain/PlayingDateTimesTest.kt index 823aa94a1..6b2292c72 100644 --- a/domain/src/test/java/woowacourse/movie/domain/PlayingTimesTest.kt +++ b/domain/src/test/java/woowacourse/movie/domain/PlayingDateTimesTest.kt @@ -2,11 +2,12 @@ package woowacourse.movie.domain import junit.framework.TestCase.assertEquals import org.junit.Test +import woowacourse.movie.domain.movie.PlayingDateTimes import java.time.DayOfWeek import java.time.LocalDate import java.time.LocalTime -class PlayingTimesTest { +class PlayingDateTimesTest { @Test fun `평일 상영일은 오전 10시부터 두 시간 간격으로 상영 시간을 생성한다`() { From f5c4730d3f4440e817556e9acb7d69a28471f5b9 Mon Sep 17 00:00:00 2001 From: hyemdooly Date: Wed, 19 Apr 2023 00:46:47 +0900 Subject: [PATCH 05/46] =?UTF-8?q?refactor:=20package=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/woowacourse/movie/model/MovieMapper.kt | 2 +- domain/src/main/java/woowacourse/movie/domain/movie/Movie.kt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/woowacourse/movie/model/MovieMapper.kt b/app/src/main/java/woowacourse/movie/model/MovieMapper.kt index 86073dc22..c579ca80d 100644 --- a/app/src/main/java/woowacourse/movie/model/MovieMapper.kt +++ b/app/src/main/java/woowacourse/movie/model/MovieMapper.kt @@ -1,8 +1,8 @@ package woowacourse.movie.model import androidx.annotation.DrawableRes -import woowacourse.movie.domain.PlayingDateTimes import woowacourse.movie.domain.movie.Movie +import woowacourse.movie.domain.movie.PlayingDateTimes import java.util.TreeMap fun MovieModel.toDomain(): Movie { diff --git a/domain/src/main/java/woowacourse/movie/domain/movie/Movie.kt b/domain/src/main/java/woowacourse/movie/domain/movie/Movie.kt index 9335c8717..c8b28ff39 100644 --- a/domain/src/main/java/woowacourse/movie/domain/movie/Movie.kt +++ b/domain/src/main/java/woowacourse/movie/domain/movie/Movie.kt @@ -1,6 +1,5 @@ package woowacourse.movie.domain.movie -import woowacourse.movie.domain.PlayingDateTimes import java.time.LocalDate data class Movie( From eeaeb2259293b2273142011b4f54e2b31abee081 Mon Sep 17 00:00:00 2001 From: hyemdooly Date: Wed, 19 Apr 2023 00:47:04 +0900 Subject: [PATCH 06/46] =?UTF-8?q?refactor:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/woowacourse/movie/domain/movie/PlayingDateTimes.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/src/main/java/woowacourse/movie/domain/movie/PlayingDateTimes.kt b/domain/src/main/java/woowacourse/movie/domain/movie/PlayingDateTimes.kt index f09ef4b80..278d9ebb1 100644 --- a/domain/src/main/java/woowacourse/movie/domain/movie/PlayingDateTimes.kt +++ b/domain/src/main/java/woowacourse/movie/domain/movie/PlayingDateTimes.kt @@ -4,7 +4,7 @@ import java.time.DayOfWeek import java.time.LocalDate import java.time.LocalTime -class PlayingDateTimes(startDate: LocalDate, endDate: LocalDate) { // 뷰를 위한 이 데이터 클래스를 만들 것인가? +class PlayingDateTimes(startDate: LocalDate, endDate: LocalDate) { private val _times: Map> = makeDates(startDate, endDate).associateWith { date -> makeTimes(date) } val times: Map> get() = _times.toMap() From d8f91d8178c020772f2b673af794521713a12e91 Mon Sep 17 00:00:00 2001 From: hyemdooly Date: Wed, 19 Apr 2023 00:47:25 +0900 Subject: [PATCH 07/46] =?UTF-8?q?refactor:=20TicketResultActivity=20View?= =?UTF-8?q?=20=EC=84=B8=ED=8C=85=20=EC=BD=94=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ticketresult/TicketResultActivity.kt | 37 +--------------- .../movie/activity/ticketresult/TicketView.kt | 42 +++++++++++++++++++ .../res/layout/activity_ticket_result.xml | 3 +- 3 files changed, 45 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/woowacourse/movie/activity/ticketresult/TicketView.kt diff --git a/app/src/main/java/woowacourse/movie/activity/ticketresult/TicketResultActivity.kt b/app/src/main/java/woowacourse/movie/activity/ticketresult/TicketResultActivity.kt index 55d646f83..4b11b861d 100644 --- a/app/src/main/java/woowacourse/movie/activity/ticketresult/TicketResultActivity.kt +++ b/app/src/main/java/woowacourse/movie/activity/ticketresult/TicketResultActivity.kt @@ -2,16 +2,11 @@ package woowacourse.movie.activity.ticketresult import android.os.Bundle import android.view.MenuItem -import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import woowacourse.movie.R import woowacourse.movie.model.TicketModel import woowacourse.movie.util.getSerializableExtraCompat -import java.text.DecimalFormat -import java.time.LocalDate -import java.time.LocalTime -import java.time.format.DateTimeFormatter class TicketResultActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -27,37 +22,7 @@ class TicketResultActivity : AppCompatActivity() { finish() return } - initTitle(ticket.title) - initPlayingDate(ticket.playingDate, ticket.playingTime) - initCount(ticket.count) - initPricePayment(ticket.price) - } - - private fun initTitle(title: String) { - val titleView = findViewById(R.id.text_title) - titleView.text = title - } - - private fun initPlayingDate(playingDate: LocalDate, playingTime: LocalTime) { - val playingDateView = findViewById(R.id.text_playing_date) - playingDateView.text = getString( - R.string.date_time, - DateTimeFormatter.ofPattern(getString(R.string.date_format)).format(playingDate), - DateTimeFormatter.ofPattern(getString(R.string.time_format)).format(playingTime) - ) - } - - private fun initCount(count: Int) { - val countView = findViewById(R.id.text_person_count) - countView.text = getString(R.string.normal_count, count) - } - - private fun initPricePayment(price: Int) { - val pricePayment = findViewById(R.id.text_price_payment) - pricePayment.text = getString( - R.string.price_payment, - DecimalFormat(getString(R.string.decimal_format)).format(price) - ) + TicketView(findViewById(R.id.layout_ticket)).set(ticket) } override fun onOptionsItemSelected(item: MenuItem): Boolean { diff --git a/app/src/main/java/woowacourse/movie/activity/ticketresult/TicketView.kt b/app/src/main/java/woowacourse/movie/activity/ticketresult/TicketView.kt new file mode 100644 index 000000000..6bea3a105 --- /dev/null +++ b/app/src/main/java/woowacourse/movie/activity/ticketresult/TicketView.kt @@ -0,0 +1,42 @@ +package woowacourse.movie.activity.ticketresult + +import android.view.ViewGroup +import android.widget.TextView +import woowacourse.movie.R +import woowacourse.movie.model.TicketModel +import java.text.DecimalFormat +import java.time.LocalDate +import java.time.LocalTime +import java.time.format.DateTimeFormatter + +class TicketView(private val viewGroup: ViewGroup) { + fun set(ticket: TicketModel) { + initTitle(ticket.title) + initPlayingDate(ticket.playingDate, ticket.playingTime) + initCount(ticket.count) + initPricePayment(ticket.price) + } + + private fun initTitle(title: String) { + viewGroup.findViewById(R.id.text_title).text = title + } + + private fun initPlayingDate(playingDate: LocalDate, playingTime: LocalTime) { + viewGroup.findViewById(R.id.text_playing_date).text = viewGroup.context.getString( + R.string.date_time, + DateTimeFormatter.ofPattern(viewGroup.context.getString(R.string.date_format)).format(playingDate), + DateTimeFormatter.ofPattern(viewGroup.context.getString(R.string.time_format)).format(playingTime) + ) + } + + private fun initCount(count: Int) { + viewGroup.findViewById(R.id.text_person_count).text = viewGroup.context.getString(R.string.normal_count, count) + } + + private fun initPricePayment(price: Int) { + viewGroup.findViewById(R.id.text_price_payment).text = viewGroup.context.getString( + R.string.price_payment, + DecimalFormat(viewGroup.context.getString(R.string.decimal_format)).format(price) + ) + } +} diff --git a/app/src/main/res/layout/activity_ticket_result.xml b/app/src/main/res/layout/activity_ticket_result.xml index a34a55d83..30f39c057 100644 --- a/app/src/main/res/layout/activity_ticket_result.xml +++ b/app/src/main/res/layout/activity_ticket_result.xml @@ -5,7 +5,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context=".activity.ticketresult.TicketResultActivity"> + tools:context=".activity.ticketresult.TicketResultActivity" + android:id="@+id/layout_ticket"> Date: Thu, 20 Apr 2023 11:39:11 +0900 Subject: [PATCH 08/46] =?UTF-8?q?feat:=20SeatSelectActivity=20xml=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 + .../moviedetail/ReservationInfoView.kt | 3 +- .../activity/seatselect/SeatSelectActivity.kt | 12 + .../main/res/layout/activity_seat_select.xml | 322 ++++++++++++++++++ app/src/main/res/values/colors.xml | 5 + app/src/main/res/values/strings.xml | 23 ++ 6 files changed, 367 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/woowacourse/movie/activity/seatselect/SeatSelectActivity.kt create mode 100644 app/src/main/res/layout/activity_seat_select.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f3fdad144..bcdfc5085 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,9 @@ android:supportsRtl="true" android:theme="@style/Theme.Movie" tools:targetApi="31"> + diff --git a/app/src/main/java/woowacourse/movie/activity/moviedetail/ReservationInfoView.kt b/app/src/main/java/woowacourse/movie/activity/moviedetail/ReservationInfoView.kt index 580a24eef..3bd4287cc 100644 --- a/app/src/main/java/woowacourse/movie/activity/moviedetail/ReservationInfoView.kt +++ b/app/src/main/java/woowacourse/movie/activity/moviedetail/ReservationInfoView.kt @@ -8,6 +8,7 @@ import android.widget.Button import android.widget.Spinner import android.widget.TextView import woowacourse.movie.R +import woowacourse.movie.activity.seatselect.SeatSelectActivity import woowacourse.movie.activity.ticketresult.TicketResultActivity import woowacourse.movie.domain.policy.DiscountPolicies import woowacourse.movie.domain.ticket.Price @@ -41,7 +42,7 @@ class ReservationInfoView(private val viewGroup: ViewGroup) { private fun setReserveButton(title: String) { viewGroup.findViewById