From 0ff1c697f7fa667eb785e8eff938af5b2e076a55 Mon Sep 17 00:00:00 2001
From: Slowth-KIM <rt.slowth@gmail.com>
Date: Mon, 3 Jul 2023 21:30:33 +0900
Subject: [PATCH 1/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?=
 =?UTF-8?q?=ED=8C=A8=ED=84=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- java to kotlin
---
 .../builder/after/DefaultTourBuilder.kt       | 48 +++++++++++++++++++
 .../gof/pattern/builder/after/TourDirector.kt | 22 +++++++++
 .../pattern/builder/after/TourPlanBuilder.kt  | 13 +++++
 .../gof/pattern/builder/before/DetailPlan.kt  |  8 ++++
 .../gof/pattern/builder/before/TourPlan.kt    | 19 ++++++++
 .../pattern/builder/after/TourDirectorTest.kt | 35 ++++++++++++++
 .../pattern/builder/before/TourPlanTest.kt    | 47 ++++++++++++++++++
 7 files changed, 192 insertions(+)
 create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/DefaultTourBuilder.kt
 create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourDirector.kt
 create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourPlanBuilder.kt
 create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt
 create mode 100644 zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
 create mode 100644 zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt
 create mode 100644 zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt

diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/DefaultTourBuilder.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/DefaultTourBuilder.kt
new file mode 100644
index 0000000..4beef43
--- /dev/null
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/DefaultTourBuilder.kt
@@ -0,0 +1,48 @@
+package com.gof.pattern.builder.after
+
+import com.gof.pattern.builder.before.DetailPlan
+import com.gof.pattern.builder.before.TourPlan
+import java.time.LocalDate
+
+class DefaultTourBuilder : TourPlanBuilder {
+    private var title: String = ""
+    private var nights: Int = 0
+    private var days: Int = 0
+    private var startDate: LocalDate = LocalDate.now()
+    private var whereToStay: String = ""
+    private var plans: MutableList<DetailPlan>? = null
+
+    override fun nightsAndDays(nights: Int, days: Int): TourPlanBuilder {
+        this.nights = nights
+        this.days = days
+        return this
+    }
+
+    override fun title(title: String): TourPlanBuilder {
+        this.title = title
+        return this
+    }
+
+    override fun startDate(localDate: LocalDate): TourPlanBuilder {
+        this.startDate = localDate
+        return this
+    }
+
+    override fun whereToStay(whereToStay: String): TourPlanBuilder {
+        this.whereToStay = whereToStay
+        return this
+    }
+
+    override fun addPlan(day: Int, plan: String): TourPlanBuilder {
+        if (plans == null) {
+            plans = mutableListOf()
+        }
+
+        plans?.add(DetailPlan(day, plan))
+        return this
+    }
+
+    override fun getPlan(): TourPlan {
+        return TourPlan(title, nights, days, startDate, whereToStay, plans ?: emptyList())
+    }
+}
diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourDirector.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourDirector.kt
new file mode 100644
index 0000000..5e796e8
--- /dev/null
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourDirector.kt
@@ -0,0 +1,22 @@
+package com.gof.pattern.builder.after
+
+import com.gof.pattern.builder.before.TourPlan
+import java.time.LocalDate
+
+class TourDirector(private val tourPlanBuilder: TourPlanBuilder) {
+    fun cancunTrip(): TourPlan {
+        return tourPlanBuilder.title("칸쿤 여행")
+            .nightsAndDays(2, 3)
+            .startDate(LocalDate.of(2020, 12, 9))
+            .whereToStay("리조트")
+            .addPlan(0, "체크인하고 짐 풀기")
+            .addPlan(0, "저녁 식사")
+            .getPlan()
+    }
+
+    fun longBeachTrip(): TourPlan {
+        return tourPlanBuilder.title("롱비치")
+            .startDate(LocalDate.of(2021, 7, 15))
+            .getPlan()
+    }
+}
diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourPlanBuilder.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourPlanBuilder.kt
new file mode 100644
index 0000000..03dd10a
--- /dev/null
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/after/TourPlanBuilder.kt
@@ -0,0 +1,13 @@
+package com.gof.pattern.builder.after
+
+import com.gof.pattern.builder.before.TourPlan
+import java.time.LocalDate
+
+interface TourPlanBuilder {
+    fun nightsAndDays(nights: Int, days: Int): TourPlanBuilder
+    fun title(title: String): TourPlanBuilder
+    fun startDate(localDate: LocalDate): TourPlanBuilder
+    fun whereToStay(whereToStay: String): TourPlanBuilder
+    fun addPlan(day: Int, plan: String): TourPlanBuilder
+    fun getPlan(): TourPlan
+}
diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt
new file mode 100644
index 0000000..71ce8bf
--- /dev/null
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt
@@ -0,0 +1,8 @@
+package com.gof.pattern.builder.before
+
+data class DetailPlan(var day: Int, var plan: String){
+
+    override fun toString(): String {
+        return "DetailPlan{ day= $day , plan =  $plan }"
+    }
+}
diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
new file mode 100644
index 0000000..a17e914
--- /dev/null
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
@@ -0,0 +1,19 @@
+package com.gof.pattern.builder.before
+
+import java.time.LocalDate
+
+data class TourPlan(var title: String, var nights: Int, var days: Int,
+                    var startDate: LocalDate, var whereToStay: String,
+                    var plans: List<DetailPlan>,) {
+
+    constructor() : this("", 0, 0, LocalDate.now(), "", listOf())
+
+    override fun toString(): String {
+        return "TourPlan{ title= $title , nights =  $nights, days =  $days , startDate =  $startDate , " +
+                "whereToStay =  $whereToStay , plans =  $plans }"
+    }
+
+    fun addPlan(day: Int, plan: String) {
+        plans = plans + DetailPlan(day, plan)
+    }
+}
diff --git a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt
new file mode 100644
index 0000000..7c3041b
--- /dev/null
+++ b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt
@@ -0,0 +1,35 @@
+package com.gof.pattern.builder.after
+
+import com.gof.pattern.builder.before.DetailPlan
+import com.gof.pattern.builder.before.TourPlan
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+import java.time.LocalDate
+
+class TourDirectorTest{
+    @Test
+    @DisplayName("빌더 패턴이 정상적으로 작동한다")
+    fun builderPatternAfterTest() {
+        // given
+        val director = TourDirector(DefaultTourBuilder())
+
+
+        // when
+        val cancunPlan: TourPlan = director.cancunTrip()
+        val longBeachTrip: TourPlan = director.longBeachTrip()
+
+        // then
+        assertEquals("롱비치", longBeachTrip.title)
+        assertEquals(LocalDate.of(2021, 7, 15), longBeachTrip.startDate)
+
+        assertEquals("칸쿤 여행", cancunPlan.title)
+        assertEquals(2, cancunPlan.nights)
+        assertEquals(3, cancunPlan.days)
+        assertEquals(LocalDate.of(2020, 12, 9), cancunPlan.startDate)
+        assertEquals("리조트", cancunPlan.whereToStay)
+        assertEquals(2, cancunPlan.plans.size)
+        assertEquals(DetailPlan(0, "체크인하고 짐 풀기"), cancunPlan.plans[0])
+        assertEquals(DetailPlan(0, "저녁 식사"), cancunPlan.plans[1])
+    }
+}
diff --git a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt
new file mode 100644
index 0000000..bb1e8d3
--- /dev/null
+++ b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt
@@ -0,0 +1,47 @@
+package com.gof.pattern.builder.before
+
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+import java.time.LocalDate
+
+class TourPlanTest{
+    @Test
+    @DisplayName("빌더패턴 적용 전 테스트가 정상 작동한다.")
+    fun builderPatternBeforeTest() {
+        // given
+        val shortPlan = TourPlan()
+        val tourPlan = TourPlan()
+
+        // when
+        shortPlan.title = "오레곤 롱비치 여행"
+        shortPlan.startDate = LocalDate.of(2021, 7, 15)
+
+        tourPlan.title = "칸쿤 여행"
+        tourPlan.nights = 2
+        tourPlan.days = 3
+        tourPlan.startDate = LocalDate.of(2020, 12, 9)
+        tourPlan.whereToStay = "리조트"
+        tourPlan.addPlan(0, "체크인 이후 짐풀기")
+        tourPlan.addPlan(0, "저녁 식사")
+        tourPlan.addPlan(1, "조식 뷔페에서 식사")
+        tourPlan.addPlan(1, "해변가 산책")
+        tourPlan.addPlan(1, "점심은 수영장 근처에서 먹기")
+        tourPlan.addPlan(1, "리조트 수영장에서 놀기")
+        tourPlan.addPlan(1, "저녁은 BBQ 식당에서 스테이크")
+        tourPlan.addPlan(2, "조식 부페에서 식사")
+        tourPlan.addPlan(2, "체크아웃")
+
+
+        // then
+        assertEquals("오레곤 롱비치 여행", shortPlan.title)
+        assertEquals(LocalDate.of(2021, 7, 15), shortPlan.startDate)
+
+        assertEquals("칸쿤 여행", tourPlan.title)
+        assertEquals(2, tourPlan.nights)
+        assertEquals(3, tourPlan.days)
+        assertEquals(LocalDate.of(2020, 12, 9), tourPlan.startDate)
+        assertEquals("리조트", tourPlan.whereToStay)
+        assertEquals(9, tourPlan.plans.size)
+    }
+}

From 72090225611f0c03ab2952bed2440e63eb180823 Mon Sep 17 00:00:00 2001
From: Slowth-KIM <rt.slowth@gmail.com>
Date: Mon, 3 Jul 2023 21:38:45 +0900
Subject: [PATCH 2/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?=
 =?UTF-8?q?=ED=8C=A8=ED=84=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- ktlint
---
 .../main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt  | 2 +-
 .../main/kotlin/com/gof/pattern/builder/before/TourPlan.kt    | 4 ++--
 .../kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt  | 3 +--
 .../kotlin/com/gof/pattern/builder/before/TourPlanTest.kt     | 3 +--
 4 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt
index 71ce8bf..662cfc7 100644
--- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/DetailPlan.kt
@@ -1,6 +1,6 @@
 package com.gof.pattern.builder.before
 
-data class DetailPlan(var day: Int, var plan: String){
+data class DetailPlan(var day: Int, var plan: String) {
 
     override fun toString(): String {
         return "DetailPlan{ day= $day , plan =  $plan }"
diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
index a17e914..c69e57f 100644
--- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
@@ -2,9 +2,9 @@ package com.gof.pattern.builder.before
 
 import java.time.LocalDate
 
-data class TourPlan(var title: String, var nights: Int, var days: Int,
+data class TourPlan (var title: String, var nights: Int, var days: Int,
                     var startDate: LocalDate, var whereToStay: String,
-                    var plans: List<DetailPlan>,) {
+                    var plans: List<DetailPlan>) {
 
     constructor() : this("", 0, 0, LocalDate.now(), "", listOf())
 
diff --git a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt
index 7c3041b..8404817 100644
--- a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt
+++ b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/after/TourDirectorTest.kt
@@ -7,14 +7,13 @@ import org.junit.jupiter.api.DisplayName
 import org.junit.jupiter.api.Test
 import java.time.LocalDate
 
-class TourDirectorTest{
+class TourDirectorTest {
     @Test
     @DisplayName("빌더 패턴이 정상적으로 작동한다")
     fun builderPatternAfterTest() {
         // given
         val director = TourDirector(DefaultTourBuilder())
 
-
         // when
         val cancunPlan: TourPlan = director.cancunTrip()
         val longBeachTrip: TourPlan = director.longBeachTrip()
diff --git a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt
index bb1e8d3..6d82520 100644
--- a/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt
+++ b/zeri/gof/src/test/kotlin/com/gof/pattern/builder/before/TourPlanTest.kt
@@ -5,7 +5,7 @@ import org.junit.jupiter.api.DisplayName
 import org.junit.jupiter.api.Test
 import java.time.LocalDate
 
-class TourPlanTest{
+class TourPlanTest {
     @Test
     @DisplayName("빌더패턴 적용 전 테스트가 정상 작동한다.")
     fun builderPatternBeforeTest() {
@@ -32,7 +32,6 @@ class TourPlanTest{
         tourPlan.addPlan(2, "조식 부페에서 식사")
         tourPlan.addPlan(2, "체크아웃")
 
-
         // then
         assertEquals("오레곤 롱비치 여행", shortPlan.title)
         assertEquals(LocalDate.of(2021, 7, 15), shortPlan.startDate)

From d9cdee59538c4db4085302cb705b1dfe4a7d5fde Mon Sep 17 00:00:00 2001
From: Slowth-KIM <rt.slowth@gmail.com>
Date: Mon, 3 Jul 2023 21:44:04 +0900
Subject: [PATCH 3/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?=
 =?UTF-8?q?=ED=8C=A8=ED=84=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- ktlint
---
 .../com/gof/pattern/builder/before/TourPlan.kt       | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
index c69e57f..d35379c 100644
--- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
@@ -2,10 +2,14 @@ package com.gof.pattern.builder.before
 
 import java.time.LocalDate
 
-data class TourPlan (var title: String, var nights: Int, var days: Int,
-                    var startDate: LocalDate, var whereToStay: String,
-                    var plans: List<DetailPlan>) {
-
+data class TourPlan (
+    var title: String,
+    var nights: Int,
+    var days: Int,
+    var startDate: LocalDate,
+    var whereToStay: String,
+    var plans: List<DetailPlan>
+) {
     constructor() : this("", 0, 0, LocalDate.now(), "", listOf())
 
     override fun toString(): String {

From cffcf6f168d836480cde9cd7c7275bd782638eb9 Mon Sep 17 00:00:00 2001
From: Slowth-KIM <rt.slowth@gmail.com>
Date: Mon, 3 Jul 2023 21:46:33 +0900
Subject: [PATCH 4/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?=
 =?UTF-8?q?=ED=8C=A8=ED=84=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- ktlint
---
 .../main/kotlin/com/gof/pattern/builder/before/TourPlan.kt | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
index d35379c..555a53a 100644
--- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
@@ -2,19 +2,18 @@ package com.gof.pattern.builder.before
 
 import java.time.LocalDate
 
-data class TourPlan (
+data class TourPlan(
     var title: String,
     var nights: Int,
     var days: Int,
     var startDate: LocalDate,
     var whereToStay: String,
-    var plans: List<DetailPlan>
+    var plans: List<DetailPlan>,
 ) {
     constructor() : this("", 0, 0, LocalDate.now(), "", listOf())
 
     override fun toString(): String {
-        return "TourPlan{ title= $title , nights =  $nights, days =  $days , startDate =  $startDate , " +
-                "whereToStay =  $whereToStay , plans =  $plans }"
+        return "TourPlan{ title= $title , nights =  $nights, days =  $days , startDate =  $startDate , " + "whereToStay =  $whereToStay , plans =  $plans }"
     }
 
     fun addPlan(day: Int, plan: String) {

From e617812ffe8c7b93b469a714087cc856927db2eb Mon Sep 17 00:00:00 2001
From: Slowth-KIM <rt.slowth@gmail.com>
Date: Mon, 3 Jul 2023 21:46:45 +0900
Subject: [PATCH 5/5] =?UTF-8?q?feat(builder):=20=EB=B9=8C=EB=8D=94=20?=
 =?UTF-8?q?=ED=8C=A8=ED=84=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- ktlint
---
 .../src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
index 555a53a..60672f2 100644
--- a/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
+++ b/zeri/gof/src/main/kotlin/com/gof/pattern/builder/before/TourPlan.kt
@@ -13,7 +13,7 @@ data class TourPlan(
     constructor() : this("", 0, 0, LocalDate.now(), "", listOf())
 
     override fun toString(): String {
-        return "TourPlan{ title= $title , nights =  $nights, days =  $days , startDate =  $startDate , " + "whereToStay =  $whereToStay , plans =  $plans }"
+        return "TourPlan{ title= $title , nights =  $nights, days =  $days , startDate =  $startDate , whereToStay =  $whereToStay , plans =  $plans }"
     }
 
     fun addPlan(day: Int, plan: String) {