Skip to content

Commit 7f9ba76

Browse files
committed
add modified
2 parents 164b437 + 6214b87 commit 7f9ba76

File tree

1 file changed

+154
-63
lines changed

1 file changed

+154
-63
lines changed

core-kotlin-modules/core-kotlin-10/src/test/kotlin/com/baeldung/cloningobject/CloningObjectUnitTest.kt

Lines changed: 154 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -4,94 +4,185 @@ import org.assertj.core.api.Assertions.assertThat
44
import org.junit.jupiter.api.Test
55

66
data class Address(var street: String, var city: String) : Cloneable {
7-
public override fun clone(): Address = super.clone() as Address
8-
}
97

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)
129

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)
1611

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)
1816
}
1917

20-
class CloningObjectUnitTest {
18+
data class Person(var name: String, var address: Address) : Cloneable {
2119

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())
2421

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))
2923

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+
}
3229

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 {
3531

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() })
3933

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) })
4438

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+
}
4746

48-
assertThat(clonedPerson.address.city)
49-
.isEqualTo("Jakarta")
47+
data class Organization(var name: String, val headquarters: Address, val companies: List<Company>) : Cloneable {
5048

51-
assertThat(clonedPerson.address.street)
52-
.isEqualTo("Jln. Abdul Muis")
49+
public override fun clone() = Organization(name, headquarters.clone(), companies.map { it.clone() })
5350

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) })
5654

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+
}
5961

60-
assertThat(deepClonedPerson.address.city)
61-
.isNotEqualTo("Banda Aceh")
62+
class CloningObjectUnitTest {
6263

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"
6584
}
6685

6786
@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")
80106
}
81107

82108
@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+
}
92129

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")
95150
}
96151

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+
}
97188
}

0 commit comments

Comments
 (0)