Skip to content

Commit 1d4efd8

Browse files
committed
deep copy test
1 parent a58616b commit 1d4efd8

File tree

1 file changed

+54
-40
lines changed

1 file changed

+54
-40
lines changed
Lines changed: 54 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
package com.baeldung.cloningobject
22

3-
4-
import org.junit.jupiter.api.Assertions.*
3+
import org.assertj.core.api.Assertions.assertThat
54
import org.junit.jupiter.api.Test
65

7-
data class Address(val street: String, val city: String)
6+
data class Address(var street: String, var city: String)
87

9-
data class Person(val name: String, val address: Address): Cloneable {
8+
data class Person(var name: String, var address: Address) : Cloneable {
109
public override fun clone(): Person {
1110
return Person(name, address)
1211
}
1312

13+
fun deepCopy(name: String = this.name, address: Address = this.address.copy()): Person {
14+
return Person(name, address)
15+
}
16+
1417
constructor(person: Person) : this(person.name, person.address)
1518
}
1619

1720
class CloningObjectUnitTest {
1821

19-
private val address = Address("Jalan Kemasan", "Yogyakarta")
22+
private val address = Address("Jln. Kemasan", "Yogyakarta")
2023
private val person = Person("Hangga", address)
2124

2225
private fun serializePerson(person: Person): String {
@@ -32,56 +35,67 @@ class CloningObjectUnitTest {
3235
}
3336

3437
@Test
35-
fun `when using secondary constructor then proves that shallow copy`(){
38+
fun `when using secondary constructor then proves that shallow copy`() {
3639
val clonedPerson = Person(person)
37-
38-
// original object and cloned object should have the same values
39-
assertEquals(person.name, clonedPerson.name)
40-
assertEquals(person.address, clonedPerson.address)
41-
42-
// But they should not refer to the same object
43-
assertNotSame(person, clonedPerson)
44-
assertSame(person.address, clonedPerson.address)
40+
clonedPerson.address.city = "Surabaya"
41+
clonedPerson.address.street = "Jln. Ahmad Yani"
42+
println("clonedPerson.address.city -> " + clonedPerson.address.city)
43+
println("person.address.city -> " + person.address.city)
44+
assertThat(clonedPerson).isNotSameAs(person)
45+
assertThat(clonedPerson.address.city).isEqualTo(person.address.city)
46+
assertThat(clonedPerson.address.street).isEqualTo(person.address.street)
4547
}
4648

4749
@Test
4850
fun `when using copy then proves that shallow copy`() {
4951
val clonedPerson = person.copy()
50-
51-
// original object and cloned object should have the same values
52-
assertEquals(person.name, clonedPerson.name)
53-
assertEquals(person.address, clonedPerson.address)
54-
55-
// But they should not refer to the same object
56-
assertNotSame(person, clonedPerson)
57-
assertSame(person.address, clonedPerson.address)
52+
clonedPerson.address.city = "Palembang"
53+
clonedPerson.address.street = "Jln. Abi Hasan"
54+
println("clonedPerson.address.city -> " + clonedPerson.address.city)
55+
println("person.address.city -> " + person.address.city)
56+
assertThat(clonedPerson).isNotSameAs(person)
57+
assertThat(clonedPerson.address.city).isEqualTo(person.address.city)
58+
assertThat(clonedPerson.address.street).isEqualTo(person.address.street)
5859
}
5960

6061
@Test
61-
fun `with using clone then proves that shallow copy`(){
62+
fun `with using clone then proves that shallow copy`() {
6263
val clonedPerson = person.clone()
64+
clonedPerson.address.city = "Palembang"
65+
clonedPerson.address.street = "Jln. Abi Hasan"
66+
println("clonedPerson.address.street -> " + clonedPerson.address.street)
67+
println("person.address.street -> " + person.address.street)
68+
assertThat(clonedPerson).isNotSameAs(person)
69+
assertThat(clonedPerson.address.city).isEqualTo(person.address.city)
70+
assertThat(clonedPerson.address.street).isEqualTo(person.address.street)
71+
}
6372

64-
// original object and cloned object should have the same values
65-
assertEquals(person.name, clonedPerson.name)
66-
assertEquals(person.address, clonedPerson.address)
67-
68-
// But they should not refer to the same object
69-
assertNotSame(person, clonedPerson)
70-
assertSame(person.address, clonedPerson.address)
73+
@Test
74+
fun `with own function then proves that deep copy`() {
75+
val clonedPerson = person.deepCopy()
76+
clonedPerson.address.city = "Bandung"
77+
clonedPerson.address.street = "Jln. Siliwangi"
78+
println("clonedPerson.address.city -> " + clonedPerson.address.city)
79+
println("clonedPerson.address.street -> " + clonedPerson.address.street)
80+
println("person.address.city -> " + person.address.city)
81+
println("person.address.street -> " + person.address.street)
82+
assertThat(clonedPerson).isNotSameAs(person)
83+
assertThat(clonedPerson.address.city).isNotEqualTo(person.address.city)
84+
assertThat(clonedPerson.address.street).isNotEqualTo(person.address.street)
7185
}
7286

7387
@Test
74-
fun `when using serialize then proves that deep copy`() {
88+
fun `when using serialize then proves that shallow copy`() {
7589
val serializedPerson = serializePerson(person)
7690
val clonedPerson = deserializePerson(serializedPerson)
77-
78-
// original object and cloned object should have the same values
79-
assertEquals(person.name, clonedPerson.name)
80-
assertEquals(person.address.street, clonedPerson.address.street)
81-
assertEquals(person.address.city, clonedPerson.address.city)
82-
83-
// But they should not refer to the same objects
84-
assertNotSame(person, clonedPerson)
85-
assertNotSame(person.address, clonedPerson.address)
91+
clonedPerson.address.city = "Palembang"
92+
clonedPerson.address.street = "Jln. Abi Hasan"
93+
println("clonedPerson -> " + clonedPerson.address.city)
94+
println("person -> " + person.address.city)
95+
assertThat(clonedPerson).isNotSameAs(person)
96+
assertThat(clonedPerson.address.city).isNotEqualTo(person.address.city)
97+
assertThat(clonedPerson.address.city).isNotSameAs(person.address.city)
98+
assertThat(clonedPerson.address.street).isNotEqualTo(person.address.street)
8699
}
100+
87101
}

0 commit comments

Comments
 (0)