@@ -4,94 +4,185 @@ import org.assertj.core.api.Assertions.assertThat
4
4
import org.junit.jupiter.api.Test
5
5
6
6
data class Address (var street : String , var city : String ) : Cloneable {
7
- public override fun clone (): Address = super .clone() as Address
8
- }
9
7
10
- data class Person (var name : String , var address : Address ) : Cloneable {
11
- public override fun clone () = Person (name, this .address.clone())
8
+ public override fun clone () = Address (this .street, this .city)
12
9
13
- fun deepCopy (name : String = this.name, address : Address = this.address.copy()): Person {
14
- return Person (name, address)
15
- }
10
+ constructor (address: Address ) : this (address.street, address.city)
16
11
17
- constructor (person: Person ) : this (person.name, person.address.copy())
12
+ fun deepCopy (
13
+ street : String = this.street,
14
+ city : String = this.city,
15
+ ) = Address (street, city)
18
16
}
19
17
20
- class CloningObjectUnitTest {
18
+ data class Person ( var name : String , var address : Address ) : Cloneable {
21
19
22
- private val address = Address (" Jln. Kemasan" , " Yogyakarta" )
23
- private val person = Person (" Hangga Aji Sayekti" , address)
20
+ public override fun clone () = Person (name, this .address.clone())
24
21
25
- @Test
26
- fun `when using secondary constructor then proves that shallow copy` () {
27
- val clonedPerson = Person (person)
28
- assertThat(clonedPerson).isNotSameAs(person)
22
+ constructor (person: Person ) : this (person.name, Address (person.address))
29
23
30
- person.address.city = " Surabaya"
31
- person.address.street = " Jln. Ahmad Yani"
24
+ fun deepCopy (
25
+ name : String = this.name,
26
+ address : Address = this.address.deepCopy(),
27
+ ) = Person (name, address)
28
+ }
32
29
33
- assertThat(clonedPerson.address.city)
34
- .isNotEqualTo(" Surabaya" )
30
+ data class Company (var name : String , var industry : String , val ceo : Person , val employees : List <Person >) : Cloneable {
35
31
36
- assertThat(clonedPerson.address.street)
37
- .isNotEqualTo(" Jln. Ahmad Yani" )
38
- }
32
+ public override fun clone () = Company (name, industry, ceo.clone(), employees.map { it.clone() })
39
33
40
- @Test
41
- fun `when using copy then proves that shallow copy or deep copy` () {
42
- val clonedPerson = person.copy()
43
- assertThat(clonedPerson).isNotSameAs(person )
34
+ constructor (company : Company ) : this (company.name,
35
+ company.industry,
36
+ Person (company.ceo),
37
+ company.employees.map { Person (it) } )
44
38
45
- person.address.city = " Jakarta"
46
- person.address.street = " Jln. Abdul Muis"
39
+ fun deepCopy (
40
+ name : String = this.name,
41
+ industry : String = this.industry,
42
+ ceo : Person = this.ceo.deepCopy(),
43
+ employees : List <Person > = this.employees.map { it.deepCopy() },
44
+ ) = Company (name, industry, ceo, employees)
45
+ }
47
46
48
- assertThat(clonedPerson.address.city)
49
- .isEqualTo(" Jakarta" )
47
+ data class Organization (var name : String , val headquarters : Address , val companies : List <Company >) : Cloneable {
50
48
51
- assertThat(clonedPerson.address.street)
52
- .isEqualTo(" Jln. Abdul Muis" )
49
+ public override fun clone () = Organization (name, headquarters.clone(), companies.map { it.clone() })
53
50
54
- val deepClonedPerson = person.copy(address = address.copy())
55
- assertThat(deepClonedPerson).isNotSameAs(person)
51
+ constructor (organization: Organization ) : this (organization.name,
52
+ Address (organization.headquarters),
53
+ organization.companies.map { Company (it) })
56
54
57
- person.address.city = " Banda Aceh"
58
- person.address.street = " Jln. Cut Nyak Dhien"
55
+ fun deepCopy (
56
+ name : String = this.name,
57
+ headquarters : Address = this.headquarters.deepCopy(),
58
+ companies : List <Company > = this.companies.map { it.deepCopy() },
59
+ ) = Organization (name, headquarters, companies)
60
+ }
59
61
60
- assertThat(deepClonedPerson.address.city)
61
- .isNotEqualTo(" Banda Aceh" )
62
+ class CloningObjectUnitTest {
62
63
63
- assertThat(deepClonedPerson.address.street)
64
- .isNotEqualTo(" Jln. Cut Nyak Dhien" )
64
+ private val personHangga = Person (" Hangga Aji Sayekti" , Address (" Jln. Kemasan No 53" , " Yogyakarta" ))
65
+ private val personRaihan = Person (" Raihan Kusumo" , Address (" Jln. Cikapayang No. 508" , " Medan" ))
66
+ private val personLayla = Person (" Layla Hinchcliffe" , Address (" Collins Street" , " Melbourne" ))
67
+ private val companyBasen = Company (" Basen Software" , " Tech" , personHangga, listOf (personRaihan, personLayla))
68
+
69
+ private val personBima = Person (" Bima Arya" , Address (" Jl. Colombo No. 7" , " Yogyakarta" ))
70
+ private val personDina = Person (" Dina Fitriani" , Address (" Jl. Kaliurang No. 12" , " Yogyakarta" ))
71
+ private val personCindy = Person (" Cindy Claudia" , Address (" Jl. Atmosukarto No. 1" , " Yogyakarta" ))
72
+ private val companyKotagede = Company (" Kotagede Software" , " Tech" , personBima, listOf (personCindy, personDina))
73
+
74
+ private val organization = Organization (" Bekraf" , Address (" Jalan Medan Merdeka Selatan" , " Jakarta" ), listOf (companyBasen, companyKotagede))
75
+
76
+ private fun modifyOrganization () {
77
+ organization.name = " New Org Name"
78
+ organization.headquarters.city = " New City"
79
+ organization.companies.first().name = " New Company Name"
80
+ organization.companies.first().ceo.name = " New CEO Name"
81
+ organization.companies.first().ceo.address.city = " New CEO Address City Name"
82
+ organization.companies.first().employees.first().name = " New Employee Name"
83
+ organization.companies.first().employees.first().address.city = " New Employee Address City Name"
65
84
}
66
85
67
86
@Test
68
- fun `when using clone then proves that shallow copy` () {
69
- val clonedPerson = person.clone()
70
- assertThat(clonedPerson).isNotSameAs(person)
71
-
72
- person.address.city = " Palembang"
73
- person.address.street = " Jln. Abi Hasan"
74
-
75
- assertThat(clonedPerson.address.city)
76
- .isNotEqualTo(" Palembang" )
77
-
78
- assertThat(clonedPerson.address.street)
79
- .isNotEqualTo(" Jln. Abi Hasan" )
87
+ fun `when cloned object with secondary constructor then proves that deep copy` () {
88
+ val clonedOrganization = Organization (organization)
89
+
90
+ modifyOrganization()
91
+
92
+ assertThat(clonedOrganization)
93
+ .isNotSameAs(organization)
94
+ assertThat(clonedOrganization.headquarters.city)
95
+ .isNotEqualTo(" New City" )
96
+ assertThat(clonedOrganization.companies.first().name)
97
+ .isNotEqualTo(" New Company Name" )
98
+ assertThat(clonedOrganization.companies.first().ceo.name)
99
+ .isNotEqualTo(" New CEO Name" )
100
+ assertThat(clonedOrganization.companies.first().ceo.address.city)
101
+ .isNotEqualTo(" New CEO Address City Name" )
102
+ assertThat(clonedOrganization.companies.first().employees.first().name)
103
+ .isNotEqualTo(" New Employee Name" )
104
+ assertThat(clonedOrganization.companies.first().employees.first().address.city)
105
+ .isNotEqualTo(" New Employee Address City Name" )
80
106
}
81
107
82
108
@Test
83
- fun `when own function then proves that deep copy` () {
84
- val clonedPerson = person.deepCopy()
85
- assertThat(clonedPerson).isNotSameAs(person)
86
-
87
- person.address.city = " Bandung"
88
- person.address.street = " Jln. Siliwangi"
89
-
90
- assertThat(clonedPerson.address.city)
91
- .isNotEqualTo(" Bandung" )
109
+ fun `when cloned object with deepCopy() then proves that deep copy` () {
110
+ val clonedOrganization = organization.deepCopy()
111
+
112
+ modifyOrganization()
113
+
114
+ assertThat(clonedOrganization)
115
+ .isNotSameAs(organization)
116
+ assertThat(clonedOrganization.headquarters.city)
117
+ .isNotEqualTo(" New City" )
118
+ assertThat(clonedOrganization.companies.first().name)
119
+ .isNotEqualTo(" New Company Name" )
120
+ assertThat(clonedOrganization.companies.first().ceo.name)
121
+ .isNotEqualTo(" New CEO Name" )
122
+ assertThat(clonedOrganization.companies.first().ceo.address.city)
123
+ .isNotEqualTo(" New CEO Address City Name" )
124
+ assertThat(clonedOrganization.companies.first().employees.first().name)
125
+ .isNotEqualTo(" New Employee Name" )
126
+ assertThat(clonedOrganization.companies.first().employees.first().address.city)
127
+ .isNotEqualTo(" New Employee Address City Name" )
128
+ }
92
129
93
- assertThat(clonedPerson.address.street)
94
- .isNotEqualTo(" Jln. Siliwangi" )
130
+ @Test
131
+ fun `when cloned object with clone() then proves that deep copy` () {
132
+ val clonedOrganization = organization.clone()
133
+
134
+ modifyOrganization()
135
+
136
+ assertThat(clonedOrganization)
137
+ .isNotSameAs(organization)
138
+ assertThat(clonedOrganization.headquarters.city)
139
+ .isNotEqualTo(" New City" )
140
+ assertThat(clonedOrganization.companies.first().name)
141
+ .isNotEqualTo(" New Company Name" )
142
+ assertThat(clonedOrganization.companies.first().ceo.name)
143
+ .isNotEqualTo(" New CEO Name" )
144
+ assertThat(clonedOrganization.companies.first().ceo.address.city)
145
+ .isNotEqualTo(" New CEO Address City Name" )
146
+ assertThat(clonedOrganization.companies.first().employees.first().name)
147
+ .isNotEqualTo(" New Employee Name" )
148
+ assertThat(clonedOrganization.companies.first().employees.first().address.city)
149
+ .isNotEqualTo(" New Employee Address City Name" )
95
150
}
96
151
152
+ @Test
153
+ fun `when cloned object with copy() then proves that deep copy` () {
154
+
155
+ val clonedOrganization = organization.copy(
156
+ headquarters = organization.headquarters.copy(),
157
+ companies = organization.companies.map { company ->
158
+ company.copy(
159
+ ceo = company.ceo.copy(
160
+ address = company.ceo.address.copy()
161
+ ),
162
+ employees = company.employees.map { employee ->
163
+ employee.copy(
164
+ address = employee.address.copy()
165
+ )
166
+ }
167
+ )
168
+ }
169
+ )
170
+
171
+ modifyOrganization()
172
+
173
+ assertThat(clonedOrganization)
174
+ .isNotSameAs(organization)
175
+ assertThat(clonedOrganization.headquarters.city)
176
+ .isNotEqualTo(" New City" )
177
+ assertThat(clonedOrganization.companies.first().name)
178
+ .isNotEqualTo(" New Company Name" )
179
+ assertThat(clonedOrganization.companies.first().ceo.name)
180
+ .isNotEqualTo(" New CEO Name" )
181
+ assertThat(clonedOrganization.companies.first().ceo.address.city)
182
+ .isNotEqualTo(" New CEO Address City Name" )
183
+ assertThat(clonedOrganization.companies.first().employees.first().name)
184
+ .isNotEqualTo(" New Employee Name" )
185
+ assertThat(clonedOrganization.companies.first().employees.first().address.city)
186
+ .isNotEqualTo(" New Employee Address City Name" )
187
+ }
97
188
}
0 commit comments