@@ -17,6 +17,18 @@ data class Person(var name: String, var address: Address) : Cloneable {
17
17
constructor (person: Person ) : this (person.name, person.address.copy())
18
18
}
19
19
20
+ data class Company (var name : String , var industry : String , val ceo : Person , val employees : List <Person >) : Cloneable {
21
+ public override fun clone (): Company {
22
+ return Company (name, industry, ceo.clone(), employees.map { it.clone() })
23
+ }
24
+ }
25
+
26
+ data class Organization (var name : String , val headquarters : Address , val companies : List <Company >) : Cloneable {
27
+ public override fun clone (): Organization {
28
+ return Organization (name, headquarters.clone(), companies.map { it.clone() })
29
+ }
30
+ }
31
+
20
32
class CloningObjectUnitTest {
21
33
22
34
private val address = Address (" Jln. Kemasan" , " Yogyakarta" )
@@ -93,4 +105,56 @@ class CloningObjectUnitTest {
93
105
assertThat(clonedPerson.address.street)
94
106
.isNotEqualTo(" Jln. Siliwangi" )
95
107
}
108
+
109
+ @Test
110
+ fun `deep copy with copy` (){
111
+ val address = Address (" Jln. Kemasan No 53" , " Yogyakarta" )
112
+ val person = Person (" Hangga Aji Sayekti" , address)
113
+ val company = Company (" Basen Software" , " Tech" , person, listOf (person))
114
+ val organization = Organization (" Bekraf" , address, listOf (company))
115
+
116
+ val copiedOrganization = organization.copy(
117
+ headquarters = organization.headquarters.copy(),
118
+ companies = organization.companies.map { company ->
119
+ company.copy(
120
+ ceo = company.ceo.copy(),
121
+ employees = company.employees.map { it.copy() }
122
+ )
123
+ }
124
+ )
125
+
126
+ val clonedOrganization = organization.clone()
127
+
128
+ // Modify the copied organization to verify deep copy
129
+ organization.name = " New Org Name"
130
+ organization.headquarters.city = " New City"
131
+ organization.companies.first().name = " New Company Name"
132
+ organization.companies.first().ceo.name = " New CEO Name"
133
+ organization.companies.first().employees.first().name = " New Employee Name"
134
+
135
+ assertThat(copiedOrganization.headquarters.city)
136
+ .isNotEqualTo(" New City" )
137
+
138
+ assertThat(copiedOrganization.companies.first().name)
139
+ .isNotEqualTo(" New Company Name" )
140
+
141
+ assertThat(copiedOrganization.companies.first().ceo.name)
142
+ .isNotEqualTo(" New CEO Name" )
143
+
144
+ assertThat(copiedOrganization.companies.first().employees.first().name)
145
+ .isNotEqualTo(" New Employee Name" )
146
+
147
+
148
+ assertThat(clonedOrganization.headquarters.city)
149
+ .isNotEqualTo(" New City" )
150
+
151
+ assertThat(clonedOrganization.companies.first().name)
152
+ .isNotEqualTo(" New Company Name" )
153
+
154
+ assertThat(clonedOrganization.companies.first().ceo.name)
155
+ .isNotEqualTo(" New CEO Name" )
156
+
157
+ assertThat(clonedOrganization.companies.first().employees.first().name)
158
+ .isNotEqualTo(" New Employee Name" )
159
+ }
96
160
}
0 commit comments