Преглед на файлове

Pass events back from processors

tags/v0.1.0
Chris Smith преди 5 години
родител
ревизия
c8eb193bde

+ 4
- 0
src/main/kotlin/com/dmdirc/ktirc/events/Events.kt Целия файл

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 Целия файл

1
 package com.dmdirc.ktirc.io
1
 package com.dmdirc.ktirc.io
2
 
2
 
3
+import com.dmdirc.ktirc.events.IrcEvent
3
 import com.dmdirc.ktirc.messages.MessageProcessor
4
 import com.dmdirc.ktirc.messages.MessageProcessor
4
 import kotlinx.coroutines.channels.ReceiveChannel
5
 import kotlinx.coroutines.channels.ReceiveChannel
5
 import kotlinx.coroutines.channels.consumeEach
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
     suspend fun processMessages(messages: ReceiveChannel<IrcMessage>) {
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
     private fun IrcMessage.getProcessor() = processors.firstOrNull { it.commands.contains(this.command) }
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 Целия файл

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

+ 2
- 1
src/main/kotlin/com/dmdirc/ktirc/messages/MessageProcessor.kt Целия файл

1
 package com.dmdirc.ktirc.messages
1
 package com.dmdirc.ktirc.messages
2
 
2
 
3
+import com.dmdirc.ktirc.events.IrcEvent
3
 import com.dmdirc.ktirc.io.IrcMessage
4
 import com.dmdirc.ktirc.io.IrcMessage
4
 
5
 
5
 interface MessageProcessor {
6
 interface MessageProcessor {
12
     /**
13
     /**
13
      * Processes the given message.
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 Целия файл

1
 package com.dmdirc.ktirc.messages
1
 package com.dmdirc.ktirc.messages
2
 
2
 
3
+import com.dmdirc.ktirc.events.IrcEvent
3
 import com.dmdirc.ktirc.io.IrcMessage
4
 import com.dmdirc.ktirc.io.IrcMessage
4
 import com.dmdirc.ktirc.state.ServerState
5
 import com.dmdirc.ktirc.state.ServerState
5
 
6
 
7
 
8
 
8
     override val commands = arrayOf("001")
9
     override val commands = arrayOf("001")
9
 
10
 
10
-    override fun process(message: IrcMessage) {
11
+    override fun process(message: IrcMessage): List<IrcEvent> {
11
         serverState.localNickname = String(message.params[0])
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 Целия файл

1
 package com.dmdirc.ktirc.io
1
 package com.dmdirc.ktirc.io
2
 
2
 
3
+import com.dmdirc.ktirc.events.IrcEvent
4
+import com.dmdirc.ktirc.events.ServerConnected
3
 import com.dmdirc.ktirc.messages.MessageProcessor
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
 import kotlinx.coroutines.channels.Channel
7
 import kotlinx.coroutines.channels.Channel
9
 import kotlinx.coroutines.runBlocking
8
 import kotlinx.coroutines.runBlocking
10
 import org.junit.jupiter.api.Test
9
 import org.junit.jupiter.api.Test
21
 
20
 
22
     @Test
21
     @Test
23
     fun `MessageHandler passes message on to correct processor`() = runBlocking {
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
         val message = IrcMessage(null, null, "JOIN", emptyList())
24
         val message = IrcMessage(null, null, "JOIN", emptyList())
26
 
25
 
27
         with(Channel<IrcMessage>(1)) {
26
         with(Channel<IrcMessage>(1)) {
31
         }
30
         }
32
 
31
 
33
         verify(joinProcessor).process(message)
32
         verify(joinProcessor).process(message)
33
+        Unit
34
     }
34
     }
35
 
35
 
36
     @Test
36
     @Test
37
     fun `MessageHandler reads multiple messages`() = runBlocking {
37
     fun `MessageHandler reads multiple messages`() = runBlocking {
38
-        val handler = MessageHandler(listOf(joinProcessor, nickProcessor))
38
+        val handler = MessageHandler(listOf(joinProcessor, nickProcessor)) {}
39
         val joinMessage = IrcMessage(null, null, "JOIN", emptyList())
39
         val joinMessage = IrcMessage(null, null, "JOIN", emptyList())
40
         val nickMessage = IrcMessage(null, null, "NICK", emptyList())
40
         val nickMessage = IrcMessage(null, null, "NICK", emptyList())
41
         val otherMessage = IrcMessage(null, null, "OTHER", emptyList())
41
         val otherMessage = IrcMessage(null, null, "OTHER", emptyList())
52
             verify(joinProcessor).process(joinMessage)
52
             verify(joinProcessor).process(joinMessage)
53
             verify(nickProcessor).process(nickMessage)
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…
Отказ
Запис