Skip to content

Commit 36683cb

Browse files
authored
Merge pull request #3 from hangga/cloning-object-experiment-enum
Cloning object experiment enum
2 parents 5e7c636 + f308bd8 commit 36683cb

File tree

1 file changed

+93
-77
lines changed

1 file changed

+93
-77
lines changed

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

Lines changed: 93 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -7,140 +7,156 @@ data class Address(var street: String, var city: String) : Cloneable {
77

88
public override fun clone(): Address = super.clone() as Address
99

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)
1116
}
1217

1318
data class Person(var name: String, var address: Address) : Cloneable {
1419

1520
public override fun clone() = Person(name, this.address.clone())
1621

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

21-
constructor(person: Person) : this(person.name, person.address.copy())
27+
constructor(person: Person) : this(person.name, Address(person.address))
2228
}
2329

2430
data class Company(var name: String, var industry: String, val ceo: Person, val employees: List<Person>) : Cloneable {
2531

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

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

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),
3645
company.employees.map { Person(it) })
3746
}
3847

3948
data class Organization(var name: String, val headquarters: Address, val companies: List<Company>) : Cloneable {
4049

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

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

50-
constructor(organization: Organization) : this(organization.name, organization.headquarters.copy(),
58+
constructor(organization: Organization) : this(
59+
organization.name,
60+
Address(organization.headquarters),
5161
organization.companies.map { Company(it) })
5262
}
5363

5464
class CloningObjectUnitTest {
5565

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

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

84-
val coustomDeepCopyOrganization = organization.deepCopy()
76+
private val organization = Organization("Bekraf",Address("Jalan Medan Merdeka Selatan",
77+
"Jakarta"),listOf(companyBasen, companyKotagede))
8578

86-
// Modify the original object to verify deep copy
79+
private fun modifyOrganization() {
8780
organization.name = "New Org Name"
8881
organization.headquarters.city = "New City"
8982
organization.companies.first().name = "New Company Name"
9083
organization.companies.first().ceo.name = "New CEO Name"
9184
organization.companies.first().employees.first().name = "New Employee Name"
85+
}
9286

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

97-
assertThat(copiedOrganization.companies.first().name)
98-
.isNotEqualTo("New Company Name")
91+
modifyOrganization()
9992

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)
101100
.isNotEqualTo("New CEO Name")
102-
103-
assertThat(copiedOrganization.companies.first().employees.first().name)
101+
assertThat(clonedOrganization.companies.first().employees.first().name)
104102
.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()
105110

106-
// verify deep copy with clone()
111+
assertThat(clonedOrganization)
112+
.isNotSameAs(organization)
107113
assertThat(clonedOrganization.headquarters.city)
108114
.isNotEqualTo("New City")
109-
110115
assertThat(clonedOrganization.companies.first().name)
111116
.isNotEqualTo("New Company Name")
112-
113117
assertThat(clonedOrganization.companies.first().ceo.name)
114118
.isNotEqualTo("New CEO Name")
115-
116119
assertThat(clonedOrganization.companies.first().employees.first().name)
117120
.isNotEqualTo("New Employee Name")
121+
}
118122

123+
@Test
124+
fun `when cloned object with clone() then proves that deep copy`() {
125+
val clonedOrganization = organization.clone()
119126

120-
// verify deep copy with secondary()
121-
assertThat(clonedSecondaryOrganization.headquarters.city)
122-
.isNotEqualTo("New City")
127+
modifyOrganization()
123128

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)
125134
.isNotEqualTo("New Company Name")
126-
127-
assertThat(clonedSecondaryOrganization.companies.first().ceo.name)
135+
assertThat(clonedOrganization.companies.first().ceo.name)
128136
.isNotEqualTo("New CEO Name")
129-
130-
assertThat(clonedSecondaryOrganization.companies.first().employees.first().name)
137+
assertThat(clonedOrganization.companies.first().employees.first().name)
131138
.isNotEqualTo("New Employee Name")
139+
}
132140

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`() {
136143

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+
})
139148

140-
assertThat(coustomDeepCopyOrganization.companies.first().ceo.name)
141-
.isNotEqualTo("New CEO Name")
149+
modifyOrganization()
142150

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)
144160
.isNotEqualTo("New Employee Name")
145161
}
146162
}

0 commit comments

Comments
 (0)