Skip to content

Commit 6214b87

Browse files
authored
Merge pull request #4 from hangga/cloning-object-experiment
new sample
2 parents 62bf595 + d2158cb commit 6214b87

File tree

1 file changed

+128
-62
lines changed

1 file changed

+128
-62
lines changed

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

Lines changed: 128 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -4,93 +4,159 @@ 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 = super.clone() as Address
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(
35+
company.name,
36+
company.industry,
37+
Person(company.ceo),
38+
company.employees.map { Person(it) })
4439

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

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

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

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

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

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

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"
6585
}
6686

6787
@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")
80103
}
81104

82105
@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+
}
89122

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

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")
95161
}
96162
}

0 commit comments

Comments
 (0)