Browse Source

Pass events back from processors

tags/v0.1.0
Chris Smith 5 years ago
parent
commit
c8eb193bde

+ 4
- 0
src/main/kotlin/com/dmdirc/ktirc/events/Events.kt View File

@@ -0,0 +1,4 @@
1
+package com.dmdirc.ktirc.events
2
+
3
+sealed class IrcEvent
4
+object ServerConnected : IrcEvent()

+ 4
- 3
src/main/kotlin/com/dmdirc/ktirc/io/MessageHandler.kt View File

@@ -1,16 +1,17 @@
1 1
 package com.dmdirc.ktirc.io
2 2
 
3
+import com.dmdirc.ktirc.events.IrcEvent
3 4
 import com.dmdirc.ktirc.messages.MessageProcessor
4 5
 import kotlinx.coroutines.channels.ReceiveChannel
5 6
 import kotlinx.coroutines.channels.consumeEach
6 7
 
7
-class MessageHandler(private val processors: Collection<MessageProcessor>) {
8
+class MessageHandler(private val processors: Collection<MessageProcessor>, private val eventHandler: (IrcEvent) -> Unit) {
8 9
 
9 10
     suspend fun processMessages(messages: ReceiveChannel<IrcMessage>) {
10
-        messages.consumeEach { it.process() }
11
+        messages.consumeEach { it.process().forEach(eventHandler) }
11 12
     }
12 13
 
13
-    private fun IrcMessage.process() = this.getProcessor()?.process(this)
14
+    private fun IrcMessage.process() = this.getProcessor()?.process(this) ?: emptyList()
14 15
     private fun IrcMessage.getProcessor() = processors.firstOrNull { it.commands.contains(this.command) }
15 16
 
16 17
 }

+ 3
- 1
src/main/kotlin/com/dmdirc/ktirc/messages/ISupportProcessor.kt View File

@@ -1,5 +1,6 @@
1 1
 package com.dmdirc.ktirc.messages
2 2
 
3
+import com.dmdirc.ktirc.events.IrcEvent
3 4
 import com.dmdirc.ktirc.io.CaseMapping
4 5
 import com.dmdirc.ktirc.io.IrcMessage
5 6
 import com.dmdirc.ktirc.state.ServerState
@@ -10,11 +11,12 @@ class ISupportProcessor(val serverState: ServerState) : MessageProcessor {
10 11
 
11 12
     override val commands = arrayOf("005")
12 13
 
13
-    override fun process(message: IrcMessage) {
14
+    override fun process(message: IrcMessage): List<IrcEvent> {
14 15
         // Ignore the first (nickname) and last ("are supported by this server") params
15 16
         for (i in 1 until message.params.size - 1) {
16 17
             parseParam(message.params[i])
17 18
         }
19
+        return emptyList()
18 20
     }
19 21
 
20 22
     private fun parseParam(param: ByteArray) = when (param[0]) {

+ 2
- 1
src/main/kotlin/com/dmdirc/ktirc/messages/MessageProcessor.kt View File

@@ -1,5 +1,6 @@
1 1
 package com.dmdirc.ktirc.messages
2 2
 
3
+import com.dmdirc.ktirc.events.IrcEvent
3 4
 import com.dmdirc.ktirc.io.IrcMessage
4 5
 
5 6
 interface MessageProcessor {
@@ -12,6 +13,6 @@ interface MessageProcessor {
12 13
     /**
13 14
      * Processes the given message.
14 15
      */
15
-    fun process(message: IrcMessage)
16
+    fun process(message: IrcMessage): List<IrcEvent>
16 17
 
17 18
 }

+ 3
- 1
src/main/kotlin/com/dmdirc/ktirc/messages/WelcomeProcessor.kt View File

@@ -1,5 +1,6 @@
1 1
 package com.dmdirc.ktirc.messages
2 2
 
3
+import com.dmdirc.ktirc.events.IrcEvent
3 4
 import com.dmdirc.ktirc.io.IrcMessage
4 5
 import com.dmdirc.ktirc.state.ServerState
5 6
 
@@ -7,8 +8,9 @@ class WelcomeProcessor(private val serverState: ServerState) : MessageProcessor
7 8
 
8 9
     override val commands = arrayOf("001")
9 10
 
10
-    override fun process(message: IrcMessage) {
11
+    override fun process(message: IrcMessage): List<IrcEvent> {
11 12
         serverState.localNickname = String(message.params[0])
13
+        return emptyList()
12 14
     }
13 15
 
14 16
 }

+ 23
- 6
src/test/kotlin/com/dmdirc/ktirc/io/MessageHandlerTest.kt View File

@@ -1,10 +1,9 @@
1 1
 package com.dmdirc.ktirc.io
2 2
 
3
+import com.dmdirc.ktirc.events.IrcEvent
4
+import com.dmdirc.ktirc.events.ServerConnected
3 5
 import com.dmdirc.ktirc.messages.MessageProcessor
4
-import com.nhaarman.mockitokotlin2.doReturn
5
-import com.nhaarman.mockitokotlin2.inOrder
6
-import com.nhaarman.mockitokotlin2.mock
7
-import com.nhaarman.mockitokotlin2.verify
6
+import com.nhaarman.mockitokotlin2.*
8 7
 import kotlinx.coroutines.channels.Channel
9 8
 import kotlinx.coroutines.runBlocking
10 9
 import org.junit.jupiter.api.Test
@@ -21,7 +20,7 @@ internal class MessageHandlerTest {
21 20
 
22 21
     @Test
23 22
     fun `MessageHandler passes message on to correct processor`() = runBlocking {
24
-        val handler = MessageHandler(listOf(joinProcessor, nickProcessor))
23
+        val handler = MessageHandler(listOf(joinProcessor, nickProcessor)) {}
25 24
         val message = IrcMessage(null, null, "JOIN", emptyList())
26 25
 
27 26
         with(Channel<IrcMessage>(1)) {
@@ -31,11 +30,12 @@ internal class MessageHandlerTest {
31 30
         }
32 31
 
33 32
         verify(joinProcessor).process(message)
33
+        Unit
34 34
     }
35 35
 
36 36
     @Test
37 37
     fun `MessageHandler reads multiple messages`() = runBlocking {
38
-        val handler = MessageHandler(listOf(joinProcessor, nickProcessor))
38
+        val handler = MessageHandler(listOf(joinProcessor, nickProcessor)) {}
39 39
         val joinMessage = IrcMessage(null, null, "JOIN", emptyList())
40 40
         val nickMessage = IrcMessage(null, null, "NICK", emptyList())
41 41
         val otherMessage = IrcMessage(null, null, "OTHER", emptyList())
@@ -52,6 +52,23 @@ internal class MessageHandlerTest {
52 52
             verify(joinProcessor).process(joinMessage)
53 53
             verify(nickProcessor).process(nickMessage)
54 54
         }
55
+        Unit
56
+    }
57
+
58
+    @Test
59
+    fun `MessageHandler invokes event handler with returned events`() = runBlocking {
60
+        val eventHandler = mock<(IrcEvent) -> Unit>()
61
+        val handler = MessageHandler(listOf(joinProcessor, nickProcessor), eventHandler)
62
+        val joinMessage = IrcMessage(null, null, "JOIN", emptyList())
63
+        whenever(joinProcessor.process(any())).thenReturn(listOf(ServerConnected))
64
+
65
+        with(Channel<IrcMessage>(1)) {
66
+            send(joinMessage)
67
+            close()
68
+            handler.processMessages(this)
69
+        }
70
+
71
+        verify(eventHandler).invoke(ServerConnected)
55 72
     }
56 73
 
57 74
 }

Loading…
Cancel
Save