1
+ package com.baeldung.functionAsParameter
2
+
3
+ import com.baeldung.functionAsParameter.Sender.*
4
+ import org.junit.jupiter.api.Test
5
+ import kotlin.test.assertEquals
6
+
7
+ fun joinByOperation (theList : List <String >, operation : (List <String >) -> String ): String {
8
+ return operation(theList)
9
+ }
10
+
11
+
12
+ data class TheMessage (val sender : Sender , val segments : List <String >) {
13
+ fun parse (operation : (List <String >) -> String ): String {
14
+ return " Message From $sender is: ${operation(segments)} "
15
+ }
16
+ }
17
+
18
+ enum class Sender {
19
+ User , RemoteAPI , PartnerApp , CsvSender
20
+ }
21
+
22
+
23
+ class MessageParser {
24
+ fun joinWithoutPlaceholder (segments : List <String >): String {
25
+ return segments.joinToString(separator = " " ).replace(" [SPACE] " , " " )
26
+ }
27
+
28
+ companion object {
29
+ fun simplyJoin (segments : List <String >): String {
30
+ return segments.joinToString(separator = " " )
31
+ }
32
+ }
33
+ }
34
+
35
+
36
+ object ParserInObject {
37
+ fun joinWithoutComma (segments : List <String >): String {
38
+ return segments.joinToString(separator = " " ) { it.replace(" ," , " " ) }
39
+ }
40
+ }
41
+
42
+ fun decrypt (segments : List <String >): String {
43
+ return segments.reversed().joinToString(separator = " " ) { it.reversed() }
44
+ }
45
+
46
+ val messageParser = MessageParser ()
47
+ fun parseMessage (message : TheMessage ): String {
48
+ return when (message.sender) {
49
+ User -> message.parse(MessageParser ::simplyJoin)
50
+ PartnerApp -> message.parse(messageParser::joinWithoutPlaceholder)
51
+ CsvSender -> message.parse(ParserInObject ::joinWithoutComma)
52
+ RemoteAPI -> message.parse(::decrypt)
53
+ }
54
+ }
55
+
56
+ class FunctionAsParameterUnitTest {
57
+
58
+ @Test
59
+ fun `when passing lambda as parameters then get expected result` () {
60
+ val input = listOf (" a b c" , " x y z" , " kotlin" )
61
+ val result1 = joinByOperation(input) { theList ->
62
+ theList.joinToString(separator = " " ) { str -> str.reversed() }.replace(" " , " , " )
63
+ }
64
+ assertEquals(" c, b, a, z, y, x, niltok" , result1)
65
+
66
+ val result2 = joinByOperation(input) { theList ->
67
+ theList.reversed().joinToString(separator = " " ) { str -> str }.uppercase()
68
+ }
69
+ assertEquals(" KOTLIN X Y Z A B C" , result2)
70
+
71
+ }
72
+
73
+ @Test
74
+ fun `when passing existing fun as parameters then get expected result` () {
75
+
76
+
77
+ val msgFromUser = TheMessage (User , listOf (" a b c" , " d e f" , " x y z" ))
78
+ val resultUser = parseMessage(msgFromUser)
79
+ assertEquals(" Message From User is: a b c d e f x y z" , resultUser)
80
+
81
+ val msgFromPartner = TheMessage (PartnerApp , listOf (" a [SPACE] b [SPACE] c" , " d [SPACE] e [SPACE] f" , " x [SPACE] y [SPACE] z" ))
82
+ val resultPartner = parseMessage(msgFromPartner)
83
+ assertEquals(" Message From PartnerApp is: a b c d e f x y z" , resultPartner)
84
+
85
+ val msgFromCsv = TheMessage (CsvSender , listOf (" a, b, c" , " d, e, f" , " x, y, z" ))
86
+ val resultCsv = parseMessage(msgFromCsv)
87
+ assertEquals(" Message From CsvSender is: a b c d e f x y z" , resultCsv)
88
+
89
+ val msgFromAPI = TheMessage (RemoteAPI , listOf (" z y x" , " f e d" , " c b a" ))
90
+ val resultApi = parseMessage(msgFromAPI)
91
+ assertEquals(" Message From RemoteAPI is: a b c d e f x y z" , resultApi)
92
+ }
93
+ }
0 commit comments