Skip to content

Commit aa6b9b1

Browse files
authored
Step1 : 코틀린 DSL 실습 (#581)
1 parent c035759 commit aa6b9b1

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

src/test/kotlin/DslTest.kt

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import io.kotest.matchers.collections.shouldContain
2+
import io.kotest.matchers.collections.shouldContainInOrder
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
6+
class DslTest {
7+
@Test
8+
fun dslTest() {
9+
val person = introduce {
10+
name("greentea.latte")
11+
company("kakao")
12+
skills {
13+
soft("A passion for problem solving")
14+
soft("Good communication skills")
15+
hard("Kotlin")
16+
}
17+
languages {
18+
"Korean" level 5
19+
"English" level 3
20+
}
21+
}
22+
23+
with(person) {
24+
name shouldBe "greentea.latte"
25+
company shouldBe "kakao"
26+
softSkills shouldContainInOrder listOf(
27+
"A passion for problem solving",
28+
"Good communication skills"
29+
)
30+
hardSkills shouldContain "Kotlin"
31+
languageLevels shouldContainInOrder listOf(
32+
"Korean" to 5,
33+
"English" to 3,
34+
)
35+
}
36+
}
37+
38+
}
39+
40+
fun introduce(block: PersonBuilder.() -> Unit): Person {
41+
return PersonBuilder().apply(block).build()
42+
}
43+
44+
class PersonBuilder {
45+
private lateinit var name: String
46+
private lateinit var company: String
47+
48+
private val softSkills = mutableListOf<String>()
49+
private val hardSkills = mutableListOf<String>()
50+
51+
private val languageLevels = mutableListOf<Pair<String, Int>>()
52+
53+
fun name(value: String) {
54+
name = value
55+
}
56+
57+
fun company(value: String) {
58+
company = value
59+
}
60+
61+
fun skills(block: PersonBuilder.() -> Unit): PersonBuilder {
62+
return this.apply(block)
63+
}
64+
65+
fun soft(value: String) {
66+
softSkills.add(value)
67+
}
68+
69+
fun hard(value: String) {
70+
hardSkills.add(value)
71+
}
72+
73+
fun languages(block: PersonBuilder.() -> Unit): PersonBuilder {
74+
return this.apply(block)
75+
}
76+
77+
infix fun String.level(s: Int) {
78+
languageLevels.add(Pair(this, s))
79+
}
80+
81+
fun build(): Person {
82+
return Person(
83+
name,
84+
company,
85+
softSkills,
86+
hardSkills,
87+
languageLevels,
88+
)
89+
}
90+
}
91+
92+
data class Person(
93+
val name: String,
94+
val company: String?,
95+
val softSkills: List<String>,
96+
val hardSkills: List<String>,
97+
val languageLevels: List<Pair<String, Int>>,
98+
)

0 commit comments

Comments
 (0)