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