Skip to content

Commit ff5f2e6

Browse files
authored
KTLN-437 - Extension Fields in Kotlin (#1039)
* skip * skip * update sample * update example * simplify * remove id * remove default constructor * add fun example * add not allowed way * update sample getter * add not allowed sample * add sample * cleanup * update * [update] sample part 1 * add decorated person * add properties only * add function test * remove extra lines * add new sample * add car * add sample * remove address * add address * ;2C;2C;2C fiel\d * update sample ageInDecade * apply baeldung formatter * formatted * formatted
1 parent 0fdd5d3 commit ff5f2e6

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import org.junit.jupiter.api.Test
2+
import java.util.*
3+
import kotlin.test.assertEquals
4+
5+
class ExtensionFieldsAlternativesUnitTest {
6+
7+
fun String.toTitleCase(): String = this.split(" ").joinToString(" ") { it.capitalize() }
8+
9+
private val String.firstChar: Char
10+
get() = this.first()
11+
12+
@Test
13+
fun `test using extension functions`() {
14+
val word = "baeldung kotlin"
15+
assertEquals("Baeldung Kotlin", word.toTitleCase())
16+
assertEquals('b', word.firstChar)
17+
}
18+
19+
class Car {
20+
var model: String = "Toyota Supra"
21+
}
22+
23+
open class Person(var name: String, var age: Int)
24+
25+
val Person.isAdult: Boolean
26+
get() = this.age >= 18
27+
28+
val Person.details: String
29+
get() = "Name: ${this.name}, Age: ${this.age}, isAdult: ${this.isAdult}"
30+
31+
var Person.ageInDecades: Int
32+
get() = this.age / 10
33+
set(value) {
34+
this.age = value * 10
35+
}
36+
37+
val externalMap = mutableMapOf<Person, String>()
38+
39+
var Person.address: String
40+
get() = externalMap[this] ?: ""
41+
set(value) {
42+
externalMap[this] = value
43+
}
44+
45+
@Test
46+
fun `test using external Map`() {
47+
val person = Person("Hangga Aji Sayekti", 35)
48+
person.address = "Jln. Kemasan Kotagede"
49+
assertEquals("Jln. Kemasan Kotagede", person.address)
50+
51+
person.address = "Jln. Kalasan Sleman"
52+
assertEquals("Jln. Kalasan Sleman", person.address)
53+
}
54+
55+
@Test
56+
fun `test using properties`() {
57+
val car = Car()
58+
assertEquals("Toyota Supra", car.model)
59+
60+
val person = Person("Hangga Aji Sayekti", 35)
61+
assertEquals("Name: Hangga Aji Sayekti, Age: 35, isAdult: true", person.details)
62+
63+
person.ageInDecades = 1
64+
assertEquals("Name: Hangga Aji Sayekti, Age: 10, isAdult: false", person.details)
65+
}
66+
67+
interface PersonDecorator {
68+
var address: String
69+
var person: Person
70+
fun getDetails(): String
71+
}
72+
73+
class PersonWithAddress(override var person: Person) : PersonDecorator {
74+
private var _address: String = ""
75+
76+
override var address: String
77+
get() = _address
78+
set(value) {
79+
_address = value
80+
}
81+
82+
override fun getDetails(): String {
83+
return "Name: ${person.name}, Age: ${person.age}, Address: $address"
84+
}
85+
}
86+
87+
@Test
88+
fun `test using decorator`() {
89+
val person = Person("Hangga Aji Sayekti", 35)
90+
91+
val personWithAddress = PersonWithAddress(person)
92+
personWithAddress.address = "Jln. Kemasan Kotagede"
93+
assertEquals("Name: Hangga Aji Sayekti, Age: 35, Address: Jln. Kemasan Kotagede", personWithAddress.getDetails())
94+
95+
personWithAddress.address = "Jln. Kalasan Sleman"
96+
assertEquals("Name: Hangga Aji Sayekti, Age: 35, Address: Jln. Kalasan Sleman", personWithAddress.getDetails())
97+
}
98+
99+
class PersonExtended(name: String, age: Int) : Person(name, age) {
100+
var jobtitle: String = ""
101+
}
102+
103+
@Test
104+
fun `test using inheritance`() {
105+
val personExtended = PersonExtended("Hangga Aji Sayekti", 35)
106+
personExtended.jobtitle = "Software Engineer"
107+
assertEquals("Software Engineer", personExtended.jobtitle)
108+
109+
personExtended.jobtitle = "Data Scientist"
110+
assertEquals("Data Scientist", personExtended.jobtitle)
111+
112+
personExtended.jobtitle = "Mathematicians"
113+
assertEquals("Mathematicians", personExtended.jobtitle)
114+
}
115+
}

0 commit comments

Comments
 (0)