Skip to content

Commit 64cf99b

Browse files
committed
update add new object
1 parent 70c8767 commit 64cf99b

File tree

1 file changed

+95
-80
lines changed

1 file changed

+95
-80
lines changed

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

Lines changed: 95 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,48 @@ package com.baeldung.cloningobject
33
import org.assertj.core.api.Assertions.assertThat
44
import org.junit.jupiter.api.Test
55

6+
/***
7+
Class Scheme
8+
============================
9+
10+
Address
11+
├── street: String
12+
└── city: String
13+
14+
Person
15+
├── name: String
16+
└── address: Address
17+
18+
Organization
19+
├── name: String
20+
├── headquarters: Address
21+
└── companies: List<Company>
22+
└── Company
23+
├── name: String
24+
├── industry: String
25+
├── ceo: Person
26+
│ ├── name: String
27+
│ └── address: Address
28+
└── employees: List<Person>
29+
└── Person
30+
├── name: String
31+
└── address: Address
32+
33+
data class Address(var street: String, var city: String)
34+
data class Person(var name: String, var address: Address)
35+
data class Company(var name: String, var industry: String, val ceo: Person, val employees: List<Person>)
36+
data class Organization(var name: String, val headquarters: Address, val companies: List<Company>)
37+
*/
38+
639
data class Address(var street: String, var city: String) : Cloneable {
40+
741
public override fun clone(): Address = super.clone() as Address
42+
43+
// constructor(address: Address) : this(address.street, address.city)
844
}
945

1046
data class Person(var name: String, var address: Address) : Cloneable {
47+
1148
public override fun clone() = Person(name, this.address.clone())
1249

1350
fun deepCopy(name: String = this.name, address: Address = this.address.copy()): Person {
@@ -18,101 +55,47 @@ data class Person(var name: String, var address: Address) : Cloneable {
1855
}
1956

2057
data class Company(var name: String, var industry: String, val ceo: Person, val employees: List<Person>) : Cloneable {
58+
59+
fun deepCopy(name: String = this.name, industry: String = this.industry, ceo: Person = this.ceo.deepCopy(),
60+
employees: List<Person> = this.employees.map { it.deepCopy() }): Company{
61+
return Company(name, industry, ceo, employees)
62+
}
63+
2164
public override fun clone(): Company {
2265
return Company(name, industry, ceo.clone(), employees.map { it.clone() })
2366
}
24-
}
2567

26-
data class Organization(var name: String, val headquarters: Address, val companies: List<Company>) : Cloneable {
27-
public override fun clone(): Organization {
28-
return Organization(name, headquarters.clone(), companies.map { it.clone() })
29-
}
68+
constructor(company: Company) : this(company.name, company.industry, Person(company.ceo),
69+
company.employees.map { Person(it) })
3070
}
3171

32-
class CloningObjectUnitTest {
33-
34-
private val address = Address("Jln. Kemasan", "Yogyakarta")
35-
private val person = Person("Hangga Aji Sayekti", address)
36-
37-
@Test
38-
fun `when using secondary constructor then proves that shallow copy`() {
39-
val clonedPerson = Person(person)
40-
assertThat(clonedPerson).isNotSameAs(person)
41-
42-
person.address.city = "Surabaya"
43-
person.address.street = "Jln. Ahmad Yani"
44-
45-
assertThat(clonedPerson.address.city)
46-
.isNotEqualTo("Surabaya")
72+
data class Organization(var name: String, val headquarters: Address, val companies: List<Company>) : Cloneable {
4773

48-
assertThat(clonedPerson.address.street)
49-
.isNotEqualTo("Jln. Ahmad Yani")
74+
fun deepCopy(name: String = this.name, headquarters: Address = this.headquarters.copy(),
75+
companies: List<Company> = this.companies.map { it.deepCopy() }) : Organization{
76+
return Organization(name, headquarters, companies)
5077
}
5178

52-
@Test
53-
fun `when using copy then proves that shallow copy or deep copy`() {
54-
val clonedPerson = person.copy()
55-
assertThat(clonedPerson).isNotSameAs(person)
56-
57-
person.address.city = "Jakarta"
58-
person.address.street = "Jln. Abdul Muis"
59-
60-
assertThat(clonedPerson.address.city)
61-
.isEqualTo("Jakarta")
62-
63-
assertThat(clonedPerson.address.street)
64-
.isEqualTo("Jln. Abdul Muis")
65-
66-
val deepClonedPerson = person.copy(address = address.copy())
67-
assertThat(deepClonedPerson).isNotSameAs(person)
68-
69-
person.address.city = "Banda Aceh"
70-
person.address.street = "Jln. Cut Nyak Dhien"
71-
72-
assertThat(deepClonedPerson.address.city)
73-
.isNotEqualTo("Banda Aceh")
74-
75-
assertThat(deepClonedPerson.address.street)
76-
.isNotEqualTo("Jln. Cut Nyak Dhien")
79+
public override fun clone(): Organization {
80+
return Organization(name, headquarters.clone(), companies.map { it.clone() })
7781
}
7882

79-
@Test
80-
fun `when using clone then proves that shallow copy`() {
81-
val clonedPerson = person.clone()
82-
assertThat(clonedPerson).isNotSameAs(person)
83-
84-
person.address.city = "Palembang"
85-
person.address.street = "Jln. Abi Hasan"
86-
87-
assertThat(clonedPerson.address.city)
88-
.isNotEqualTo("Palembang")
83+
constructor(organization: Organization) : this(organization.name, organization.headquarters.copy(),
84+
organization.companies.map { Company(it) })
85+
}
8986

90-
assertThat(clonedPerson.address.street)
91-
.isNotEqualTo("Jln. Abi Hasan")
92-
}
87+
class CloningObjectUnitTest {
9388

9489
@Test
95-
fun `when own function then proves that deep copy`() {
96-
val clonedPerson = person.deepCopy()
97-
assertThat(clonedPerson).isNotSameAs(person)
98-
99-
person.address.city = "Bandung"
100-
person.address.street = "Jln. Siliwangi"
101-
102-
assertThat(clonedPerson.address.city)
103-
.isNotEqualTo("Bandung")
90+
fun `when cloned object then proves that deep copy`(){
91+
val address = Address("Jln. Kemasan No 53", "Yogyakarta")
10492

105-
assertThat(clonedPerson.address.street)
106-
.isNotEqualTo("Jln. Siliwangi")
107-
}
93+
val ceo = Person("Hangga Aji Sayekti", address)
94+
val john = Person("John Doe", address)
95+
val layla = Person("Layla Hinchcliffe", address)
10896

109-
@Test
110-
fun `deep copy with copy`(){
111-
val address = Address("Jln. Kemasan No 53", "Yogyakarta")
112-
val person = Person("Hangga Aji Sayekti", address)
113-
val company = Company("Basen Software", "Tech", person, listOf(person))
97+
val company = Company("Basen Software", "Tech", ceo, listOf(john, layla))
11498
val organization = Organization("Bekraf", address, listOf(company))
115-
11699
val copiedOrganization = organization.copy(
117100
headquarters = organization.headquarters.copy(),
118101
companies = organization.companies.map { company ->
@@ -125,13 +108,18 @@ class CloningObjectUnitTest {
125108

126109
val clonedOrganization = organization.clone()
127110

128-
// Modify the copied organization to verify deep copy
111+
val clonedSecondaryOrganization = Organization(organization)
112+
113+
val coustomDeepCopyOrganization = organization.deepCopy()
114+
115+
// Modify the original object to verify deep copy
129116
organization.name = "New Org Name"
130117
organization.headquarters.city = "New City"
131118
organization.companies.first().name = "New Company Name"
132119
organization.companies.first().ceo.name = "New CEO Name"
133120
organization.companies.first().employees.first().name = "New Employee Name"
134121

122+
// verify deep copy with copy()
135123
assertThat(copiedOrganization.headquarters.city)
136124
.isNotEqualTo("New City")
137125

@@ -144,7 +132,7 @@ class CloningObjectUnitTest {
144132
assertThat(copiedOrganization.companies.first().employees.first().name)
145133
.isNotEqualTo("New Employee Name")
146134

147-
135+
// verify deep copy with clone()
148136
assertThat(clonedOrganization.headquarters.city)
149137
.isNotEqualTo("New City")
150138

@@ -156,5 +144,32 @@ class CloningObjectUnitTest {
156144

157145
assertThat(clonedOrganization.companies.first().employees.first().name)
158146
.isNotEqualTo("New Employee Name")
147+
148+
149+
// verify deep copy with secondary()
150+
assertThat(clonedSecondaryOrganization.headquarters.city)
151+
.isNotEqualTo("New City")
152+
153+
assertThat(clonedSecondaryOrganization.companies.first().name)
154+
.isNotEqualTo("New Company Name")
155+
156+
assertThat(clonedSecondaryOrganization.companies.first().ceo.name)
157+
.isNotEqualTo("New CEO Name")
158+
159+
assertThat(clonedSecondaryOrganization.companies.first().employees.first().name)
160+
.isNotEqualTo("New Employee Name")
161+
162+
// deep copy
163+
assertThat(coustomDeepCopyOrganization.headquarters.city)
164+
.isNotEqualTo("New City")
165+
166+
assertThat(coustomDeepCopyOrganization.companies.first().name)
167+
.isNotEqualTo("New Company Name")
168+
169+
assertThat(coustomDeepCopyOrganization.companies.first().ceo.name)
170+
.isNotEqualTo("New CEO Name")
171+
172+
assertThat(coustomDeepCopyOrganization.companies.first().employees.first().name)
173+
.isNotEqualTo("New Employee Name")
159174
}
160175
}

0 commit comments

Comments
 (0)