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