@@ -4,93 +4,159 @@ 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 = super .clone() as Address
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 (
35
+ company.name,
36
+ company.industry,
37
+ Person (company.ceo),
38
+ company.employees.map { Person (it) })
44
39
45
- person.address.city = " Jakarta"
46
- person.address.street = " Jln. Abdul Muis"
40
+ fun deepCopy (
41
+ name : String = this.name,
42
+ industry : String = this.industry,
43
+ ceo : Person = this.ceo.deepCopy(),
44
+ employees : List <Person > = this.employees.map { it.deepCopy() },
45
+ ) = Company (name, industry, ceo, employees)
46
+ }
47
47
48
- assertThat(clonedPerson.address.city)
49
- .isEqualTo(" Jakarta" )
48
+ data class Organization (var name : String , val headquarters : Address , val companies : List <Company >) : Cloneable {
50
49
51
- assertThat(clonedPerson.address.street)
52
- .isEqualTo(" Jln. Abdul Muis" )
50
+ public override fun clone () = Organization (name, headquarters.clone(), companies.map { it.clone() })
53
51
54
- val deepClonedPerson = person.copy(address = address.copy())
55
- assertThat(deepClonedPerson).isNotSameAs(person)
52
+ constructor (organization: Organization ) : this (
53
+ organization.name,
54
+ Address (organization.headquarters),
55
+ organization.companies.map { Company (it) })
56
56
57
- person.address.city = " Banda Aceh"
58
- person.address.street = " Jln. Cut Nyak Dhien"
57
+ fun deepCopy (
58
+ name : String = this.name,
59
+ headquarters : Address = this.headquarters.deepCopy(),
60
+ companies : List <Company > = this.companies.map { it.deepCopy() },
61
+ ) = Organization (name, headquarters, companies)
62
+ }
59
63
60
- assertThat(deepClonedPerson.address.city)
61
- .isNotEqualTo(" Banda Aceh" )
64
+ class CloningObjectUnitTest {
62
65
63
- assertThat(deepClonedPerson.address.street)
64
- .isNotEqualTo(" Jln. Cut Nyak Dhien" )
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))
70
+
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))
75
+
76
+ private val organization = Organization (" Bekraf" ,Address (" Jalan Medan Merdeka Selatan" ,
77
+ " Jakarta" ),listOf (companyBasen, companyKotagede))
78
+
79
+ private fun modifyOrganization () {
80
+ organization.name = " New Org Name"
81
+ organization.headquarters.city = " New City"
82
+ organization.companies.first().name = " New Company Name"
83
+ organization.companies.first().ceo.name = " New CEO Name"
84
+ organization.companies.first().employees.first().name = " New Employee Name"
65
85
}
66
86
67
87
@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" )
88
+ fun `when cloned object with secondary constructor then proves that deep copy` () {
89
+ val clonedOrganization = Organization (organization)
90
+
91
+ modifyOrganization()
92
+
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)
100
+ .isNotEqualTo(" New CEO Name" )
101
+ assertThat(clonedOrganization.companies.first().employees.first().name)
102
+ .isNotEqualTo(" New Employee Name" )
80
103
}
81
104
82
105
@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"
106
+ fun `when cloned object with deepCopy() then proves that deep copy` () {
107
+ val clonedOrganization = organization.deepCopy()
108
+
109
+ modifyOrganization()
110
+
111
+ assertThat(clonedOrganization)
112
+ .isNotSameAs(organization)
113
+ assertThat(clonedOrganization.headquarters.city)
114
+ .isNotEqualTo(" New City" )
115
+ assertThat(clonedOrganization.companies.first().name)
116
+ .isNotEqualTo(" New Company Name" )
117
+ assertThat(clonedOrganization.companies.first().ceo.name)
118
+ .isNotEqualTo(" New CEO Name" )
119
+ assertThat(clonedOrganization.companies.first().employees.first().name)
120
+ .isNotEqualTo(" New Employee Name" )
121
+ }
89
122
90
- assertThat(clonedPerson.address.city)
91
- .isNotEqualTo(" Bandung" )
123
+ @Test
124
+ fun `when cloned object with clone() then proves that deep copy` () {
125
+ val clonedOrganization = organization.clone()
126
+
127
+ modifyOrganization()
128
+
129
+ assertThat(clonedOrganization)
130
+ .isNotSameAs(organization)
131
+ assertThat(clonedOrganization.headquarters.city)
132
+ .isNotEqualTo(" New City" )
133
+ assertThat(clonedOrganization.companies.first().name)
134
+ .isNotEqualTo(" New Company Name" )
135
+ assertThat(clonedOrganization.companies.first().ceo.name)
136
+ .isNotEqualTo(" New CEO Name" )
137
+ assertThat(clonedOrganization.companies.first().employees.first().name)
138
+ .isNotEqualTo(" New Employee Name" )
139
+ }
92
140
93
- assertThat(clonedPerson.address.street)
94
- .isNotEqualTo(" Jln. Siliwangi" )
141
+ @Test
142
+ fun `when cloned object with copy() then proves that deep copy` () {
143
+
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
+ })
148
+
149
+ modifyOrganization()
150
+
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)
160
+ .isNotEqualTo(" New Employee Name" )
95
161
}
96
162
}
0 commit comments