Browse Source

Handle mode events

Move numerics into constants
Tidy up how IrcMessage params are made in tests
tags/v0.5.0
Chris Smith 5 years ago
parent
commit
11405a4a38

+ 11
- 6
CHANGELOG View File

@@ -1,12 +1,17 @@
1 1
 vNEXT (in development)
2 2
 
3
- * Added MotdFinished event
4
- * Added UserAccountChanged event
3
+ * Server state:
4
+    * Added ServerConnecting and ServerDisconnected events
5
+    * Server status now starts as Disconnected rather than Connecting
6
+    * Improved error message when features are of an unexpected type
7
+ * Channel modes:
8
+    * CHANMODES feature is now stored as an array, not a single comma-separated string
9
+    * Added ChanModeType enum, and method in ServerState to get the type of a mode
10
+    * Added ModeChanged event, for user and channel mode changes and discovery
11
+ * Other new events:
12
+    * Added MotdFinished event
13
+    * Added UserAccountChanged event
5 14
  * Improved some documentation
6
- * Added ServerConnecting and ServerDisconnected events
7
- * Server status now starts as Disconnected rather than Connecting
8
- * CHANMODES feature is now stored as an array, not a single comma-separated string
9
- * Improved error message when features are of an unexpected type
10 15
 
11 16
 v0.4.0
12 17
 

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

@@ -74,3 +74,12 @@ class ServerCapabilitiesFinished(time: LocalDateTime) : IrcEvent(time)
74 74
 
75 75
 /** Raised when a Message Of the Day has completed. */
76 76
 class MotdFinished(time: LocalDateTime, val missing: Boolean = false): IrcEvent(time)
77
+
78
+/**
79
+ * Raised when a mode change occurs.
80
+ *
81
+ * If [discovered] is true then the event is in response to the server providing the full set of modes on the target,
82
+ * and the given modes are thus exhaustive. Otherwise, the modes are a sequence of changes to apply to the existing
83
+ * state.
84
+ */
85
+class ModeChanged(time: LocalDateTime, val target: String, val modes: String, val arguments: Array<String>, val discovered: Boolean = false): IrcEvent(time)

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

@@ -13,7 +13,7 @@ internal class ISupportProcessor : MessageProcessor {
13 13
 
14 14
     private val log by logger()
15 15
 
16
-    override val commands = arrayOf("005")
16
+    override val commands = arrayOf(RPL_ISUPPORT)
17 17
 
18 18
     override fun process(message: IrcMessage) = listOf(ServerFeaturesUpdated(message.time, ServerFeatureMap().apply {
19 19
         // Ignore the first (nickname) and last ("are supported by this server") params

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

@@ -22,6 +22,7 @@ internal val messageProcessors = setOf(
22 22
         CapabilityProcessor(),
23 23
         ISupportProcessor(),
24 24
         JoinProcessor(),
25
+        ModeProcessor(),
25 26
         MotdProcessor(),
26 27
         NamesProcessor(),
27 28
         PartProcessor(),

+ 21
- 0
src/main/kotlin/com/dmdirc/ktirc/messages/ModeProcessor.kt View File

@@ -0,0 +1,21 @@
1
+package com.dmdirc.ktirc.messages
2
+
3
+import com.dmdirc.ktirc.events.ModeChanged
4
+import com.dmdirc.ktirc.model.IrcMessage
5
+
6
+internal class ModeProcessor : MessageProcessor {
7
+
8
+    override val commands = arrayOf(RPL_CHANNELMODEIS, RPL_UMODEIS, "MODE")
9
+
10
+    override fun process(message: IrcMessage): List<ModeChanged> {
11
+        val isDiscovery = message.command == RPL_CHANNELMODEIS || message.command == RPL_UMODEIS
12
+        val paramOffset = if (message.command == RPL_CHANNELMODEIS) 1 else 0
13
+        return listOf(ModeChanged(
14
+                message.time,
15
+                target = String(message.params[paramOffset]),
16
+                modes = String(message.params[paramOffset + 1]),
17
+                arguments = message.params.takeLast(message.params.size - paramOffset - 2).map { String(it) }.toTypedArray(),
18
+                discovered = isDiscovery))
19
+    }
20
+
21
+}

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

@@ -5,12 +5,12 @@ import com.dmdirc.ktirc.model.IrcMessage
5 5
 
6 6
 internal class MotdProcessor : MessageProcessor {
7 7
 
8
-    override val commands = arrayOf("422", "376")
8
+    override val commands = arrayOf(ERR_NOMOTD, RPL_ENDOFMOTD)
9 9
 
10 10
     override fun process(message: IrcMessage) = sequence {
11 11
         when (message.command) {
12
-            "422" -> yield(MotdFinished(message.time, missing = true))
13
-            "376" -> yield(MotdFinished(message.time))
12
+            ERR_NOMOTD -> yield(MotdFinished(message.time, missing = true))
13
+            RPL_ENDOFMOTD -> yield(MotdFinished(message.time))
14 14
         }
15 15
     }.toList()
16 16
 

+ 11
- 0
src/main/kotlin/com/dmdirc/ktirc/messages/NumericConstants.kt View File

@@ -0,0 +1,11 @@
1
+package com.dmdirc.ktirc.messages
2
+
3
+internal const val RPL_WELCOME = "001"
4
+internal const val RPL_ISUPPORT = "005"
5
+
6
+internal const val RPL_UMODEIS = "221"
7
+
8
+internal const val RPL_CHANNELMODEIS = "324"
9
+internal const val RPL_ENDOFMOTD = "376"
10
+
11
+internal const val ERR_NOMOTD = "422"

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

@@ -5,9 +5,10 @@ import com.dmdirc.ktirc.model.IrcMessage
5 5
 
6 6
 internal class WelcomeProcessor : MessageProcessor {
7 7
 
8
-    override val commands = arrayOf("001")
8
+    override val commands = arrayOf(RPL_WELCOME)
9 9
 
10 10
     override fun process(message: IrcMessage) = listOf(ServerWelcome(message.time, message.serverName(), String(message.params[0])))
11 11
 
12 12
     private fun IrcMessage.serverName() = prefix?.let { String(it) } ?: ""
13
+
13 14
 }

+ 3
- 0
src/test/kotlin/com/dmdirc/ktirc/TestUtils.kt View File

@@ -0,0 +1,3 @@
1
+package com.dmdirc.ktirc
2
+
3
+internal fun params(vararg args: String) = args.map { it.toByteArray() }

+ 4
- 3
src/test/kotlin/com/dmdirc/ktirc/messages/AccountProcessorTest.kt View File

@@ -3,6 +3,7 @@ package com.dmdirc.ktirc.messages
3 3
 import com.dmdirc.ktirc.TestConstants
4 4
 import com.dmdirc.ktirc.model.IrcMessage
5 5
 import com.dmdirc.ktirc.model.User
6
+import com.dmdirc.ktirc.params
6 7
 import com.dmdirc.ktirc.util.currentTimeProvider
7 8
 import org.junit.jupiter.api.Assertions.assertEquals
8 9
 import org.junit.jupiter.api.BeforeEach
@@ -18,7 +19,7 @@ internal class AccountProcessorTest {
18 19
     @Test
19 20
     fun `AccountProcessor raises account changed event with account name`() {
20 21
         val events = AccountProcessor().process(
21
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "ACCOUNT", listOf("acidBurn".toByteArray())))
22
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "ACCOUNT", params("acidBurn")))
22 23
         assertEquals(1, events.size)
23 24
 
24 25
         assertEquals(TestConstants.time, events[0].time)
@@ -29,7 +30,7 @@ internal class AccountProcessorTest {
29 30
     @Test
30 31
     fun `AccountProcessor raises account changed event when account removed`() {
31 32
         val events = AccountProcessor().process(
32
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "ACCOUNT", listOf("*".toByteArray())))
33
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "ACCOUNT", params("*")))
33 34
         assertEquals(1, events.size)
34 35
 
35 36
         assertEquals(TestConstants.time, events[0].time)
@@ -40,7 +41,7 @@ internal class AccountProcessorTest {
40 41
     @Test
41 42
     fun `AccountProcessor does nothing if prefix missing`() {
42 43
         val events = AccountProcessor().process(
43
-                IrcMessage(emptyMap(), null, "ACCOUNT", listOf("*".toByteArray())))
44
+                IrcMessage(emptyMap(), null, "ACCOUNT", params("*")))
44 45
         assertEquals(0, events.size)
45 46
     }
46 47
 

+ 9
- 8
src/test/kotlin/com/dmdirc/ktirc/messages/CapabilityProcessorTest.kt View File

@@ -5,6 +5,7 @@ import com.dmdirc.ktirc.events.ServerCapabilitiesFinished
5 5
 import com.dmdirc.ktirc.events.ServerCapabilitiesReceived
6 6
 import com.dmdirc.ktirc.model.Capability
7 7
 import com.dmdirc.ktirc.model.IrcMessage
8
+import com.dmdirc.ktirc.params
8 9
 import org.junit.jupiter.api.Assertions.assertEquals
9 10
 import org.junit.jupiter.api.Assertions.assertTrue
10 11
 import org.junit.jupiter.api.Test
@@ -15,14 +16,14 @@ internal class CapabilityProcessorTest {
15 16
 
16 17
     @Test
17 18
     fun `CapabilityProcessor does nothing for unknown subcommand`() {
18
-        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", listOf("*".toByteArray(), "FOO".toByteArray())))
19
+        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", params("*", "FOO")))
19 20
 
20 21
         assertTrue(events.isEmpty())
21 22
     }
22 23
 
23 24
     @Test
24 25
     fun `CapabilityProcessor raises ServerCapabilitiesReceived event given no capabilities`() {
25
-        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", listOf("*", "LS", "").map { it.toByteArray() }))
26
+        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", params("*", "LS", "")))
26 27
 
27 28
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
28 29
         assertEquals(0, receivedEvent.capabilities.size)
@@ -31,7 +32,7 @@ internal class CapabilityProcessorTest {
31 32
 
32 33
     @Test
33 34
     fun `CapabilityProcessor raises ServerCapabilitiesReceived event with known capabilities`() {
34
-        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", listOf("*", "LS", "chghost extended-join invalid").map { it.toByteArray() }))
35
+        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", params("*", "LS", "chghost extended-join invalid")))
35 36
 
36 37
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
37 38
         assertEquals(2, receivedEvent.capabilities.size)
@@ -41,7 +42,7 @@ internal class CapabilityProcessorTest {
41 42
 
42 43
     @Test
43 44
     fun `CapabilityProcessor raises ServerCapabilitiesReceived event with values for capabilities`() {
44
-        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", listOf("*", "LS", "chghost=test123 extended-join=abc=def invalid").map { it.toByteArray() }))
45
+        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", params("*", "LS", "chghost=test123 extended-join=abc=def invalid")))
45 46
 
46 47
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
47 48
         assertEquals(2, receivedEvent.capabilities.size)
@@ -51,7 +52,7 @@ internal class CapabilityProcessorTest {
51 52
 
52 53
     @Test
53 54
     fun `CapabilityProcessor overwrites earlier values with later ones for identical capabilities`() {
54
-        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", listOf("*", "LS", "chghost=test123 chghost chghost=456").map { it.toByteArray() }))
55
+        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", params("*", "LS", "chghost=test123 chghost chghost=456")))
55 56
 
56 57
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
57 58
         assertEquals(1, receivedEvent.capabilities.size)
@@ -61,7 +62,7 @@ internal class CapabilityProcessorTest {
61 62
 
62 63
     @Test
63 64
     fun `CapabilityProcessor raises ServerCapabilitiesReceived event with known capabilities for multi-line responses`() {
64
-        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", listOf("*", "LS", "*", "chghost extended-join invalid").map { it.toByteArray() }))
65
+        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", params("*", "LS", "*", "chghost extended-join invalid")))
65 66
 
66 67
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
67 68
         assertEquals(2, receivedEvent.capabilities.size)
@@ -71,7 +72,7 @@ internal class CapabilityProcessorTest {
71 72
 
72 73
     @Test
73 74
     fun `CapabilityProcessor raises ServerCapabilitiesFinished event for final LS responses`() {
74
-        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", listOf("*", "LS", "chghost extended-join invalid").map { it.toByteArray() }))
75
+        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", params("*", "LS", "chghost extended-join invalid")))
75 76
 
76 77
         assertEquals(2, events.size)
77 78
         assertTrue(events[1] is ServerCapabilitiesFinished)
@@ -79,7 +80,7 @@ internal class CapabilityProcessorTest {
79 80
 
80 81
     @Test
81 82
     fun `CapabilityProcessor raises ServerCapabilitiesAcknowledged event`() {
82
-        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", listOf("*", "ACK", "chghost=test123 extended-join=abc=def invalid").map { it.toByteArray() }))
83
+        val events = processor.process(IrcMessage(emptyMap(), "the.gibson".toByteArray(), "CAP", params("*", "ACK", "chghost=test123 extended-join=abc=def invalid")))
83 84
 
84 85
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesAcknowledged>()[0]
85 86
         assertEquals(2, receivedEvent.capabilities.size)

+ 9
- 8
src/test/kotlin/com/dmdirc/ktirc/messages/ISupportProcessorTest.kt View File

@@ -5,6 +5,7 @@ import com.dmdirc.ktirc.model.IrcMessage
5 5
 import com.dmdirc.ktirc.model.ModePrefixMapping
6 6
 import com.dmdirc.ktirc.model.ServerFeature
7 7
 import com.dmdirc.ktirc.model.ServerFeatureMap
8
+import com.dmdirc.ktirc.params
8 9
 import org.junit.jupiter.api.Assertions.*
9 10
 import org.junit.jupiter.api.Test
10 11
 
@@ -20,7 +21,7 @@ internal class ISupportProcessorTest {
20 21
     @Test
21 22
     fun `ISupportProcessor handles multiple numeric arguments`() {
22 23
         val events = processor.process(IrcMessage(emptyMap(), "server.com".toByteArray(), "005",
23
-                listOf("nickname", "MAXCHANNELS=123", "CHANNELLEN=456", "are supported blah blah").map { it.toByteArray() }))
24
+                params("nickname", "MAXCHANNELS=123", "CHANNELLEN=456", "are supported blah blah")))
24 25
 
25 26
         assertEquals(123, events[0].serverFeatures[ServerFeature.MaximumChannels])
26 27
         assertEquals(456, events[0].serverFeatures[ServerFeature.MaximumChannelNameLength])
@@ -29,7 +30,7 @@ internal class ISupportProcessorTest {
29 30
     @Test
30 31
     fun `ISupportProcessor handles string arguments`() {
31 32
         val events = processor.process(IrcMessage(emptyMap(), "server.com".toByteArray(), "005",
32
-                listOf("nickname", "NETWORK=abcd", "are supported blah blah").map { it.toByteArray() }))
33
+                params("nickname", "NETWORK=abcd", "are supported blah blah")))
33 34
 
34 35
         assertEquals("abcd", events[0].serverFeatures[ServerFeature.Network])
35 36
     }
@@ -37,7 +38,7 @@ internal class ISupportProcessorTest {
37 38
     @Test
38 39
     fun `ISupportProcessor handles string array arguments`() {
39 40
         val events = processor.process(IrcMessage(emptyMap(), "server.com".toByteArray(), "005",
40
-                listOf("nickname", "CHANMODES=abcd,efg,,hij", "are supported blah blah").map { it.toByteArray() }))
41
+                params("nickname", "CHANMODES=abcd,efg,,hij", "are supported blah blah")))
41 42
 
42 43
         val modes = events[0].serverFeatures[ServerFeature.ChannelModes]!!
43 44
         assertEquals("abcd", modes[0])
@@ -49,7 +50,7 @@ internal class ISupportProcessorTest {
49 50
     @Test
50 51
     fun `ISupportProcessor handles resetting arguments`() {
51 52
         val events = processor.process(IrcMessage(emptyMap(), "server.com".toByteArray(), "005",
52
-                listOf("nickname", "-CHANMODES", "are supported blah blah").map { it.toByteArray() }))
53
+                params("nickname", "-CHANMODES", "are supported blah blah")))
53 54
 
54 55
         val oldFeatures = ServerFeatureMap()
55 56
         oldFeatures[ServerFeature.ChannelModes] = arrayOf("abc")
@@ -60,7 +61,7 @@ internal class ISupportProcessorTest {
60 61
     @Test
61 62
     fun `ISupportProcessor handles case mapping arguments`() {
62 63
         val events = processor.process(IrcMessage(emptyMap(), "server.com".toByteArray(), "005",
63
-                listOf("nickname", "CASEMAPPING=rfc1459-strict", "are supported blah blah").map { it.toByteArray() }))
64
+                params("nickname", "CASEMAPPING=rfc1459-strict", "are supported blah blah")))
64 65
 
65 66
         assertEquals(CaseMapping.RfcStrict, events[0].serverFeatures[ServerFeature.ServerCaseMapping])
66 67
     }
@@ -68,7 +69,7 @@ internal class ISupportProcessorTest {
68 69
     @Test
69 70
     fun `ISupportProcessor handles mode prefix arguments`() {
70 71
         val events = processor.process(IrcMessage(emptyMap(), "server.com".toByteArray(), "005",
71
-                listOf("nickname", "PREFIX=(ovd)@+%", "are supported blah blah").map { it.toByteArray() }))
72
+                params("nickname", "PREFIX=(ovd)@+%", "are supported blah blah")))
72 73
 
73 74
         assertEquals(ModePrefixMapping("ovd", "@+%"), events[0].serverFeatures[ServerFeature.ModePrefixes])
74 75
     }
@@ -76,7 +77,7 @@ internal class ISupportProcessorTest {
76 77
     @Test
77 78
     fun `ISupportProcessor handles network arguments`() {
78 79
         val events = processor.process(IrcMessage(emptyMap(), "server.com".toByteArray(), "005",
79
-                listOf("nickname", "NETWORK=gibson", "are supported blah blah").map { it.toByteArray() }))
80
+                params("nickname", "NETWORK=gibson", "are supported blah blah")))
80 81
 
81 82
         assertEquals("gibson", events[0].serverFeatures[ServerFeature.Network])
82 83
     }
@@ -84,7 +85,7 @@ internal class ISupportProcessorTest {
84 85
     @Test
85 86
     fun `ISupportProcessor handles boolean features with no arguments`() {
86 87
         val events = processor.process(IrcMessage(emptyMap(), "server.com".toByteArray(), "005",
87
-                listOf("nickname", "WHOX", "are supported blah blah").map { it.toByteArray() }))
88
+                params("nickname", "WHOX", "are supported blah blah")))
88 89
 
89 90
         assertEquals(true, events[0].serverFeatures[ServerFeature.WhoxSupport])
90 91
     }

+ 5
- 4
src/test/kotlin/com/dmdirc/ktirc/messages/JoinProcessorTest.kt View File

@@ -3,6 +3,7 @@ package com.dmdirc.ktirc.messages
3 3
 import com.dmdirc.ktirc.TestConstants
4 4
 import com.dmdirc.ktirc.model.IrcMessage
5 5
 import com.dmdirc.ktirc.model.User
6
+import com.dmdirc.ktirc.params
6 7
 import com.dmdirc.ktirc.util.currentTimeProvider
7 8
 import org.junit.jupiter.api.Assertions.assertEquals
8 9
 import org.junit.jupiter.api.BeforeEach
@@ -18,7 +19,7 @@ internal class JoinProcessorTest {
18 19
     @Test
19 20
     fun `JoinProcessor raises join event`() {
20 21
         val events = JoinProcessor().process(
21
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "JOIN", listOf("#crashandburn".toByteArray())))
22
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "JOIN", params("#crashandburn")))
22 23
         assertEquals(1, events.size)
23 24
 
24 25
         assertEquals(TestConstants.time, events[0].time)
@@ -29,14 +30,14 @@ internal class JoinProcessorTest {
29 30
     @Test
30 31
     fun `JoinProcessor does nothing if prefix missing`() {
31 32
         val events = JoinProcessor().process(
32
-                IrcMessage(emptyMap(), null, "JOIN", listOf("#crashandburn".toByteArray())))
33
+                IrcMessage(emptyMap(), null, "JOIN", params("#crashandburn")))
33 34
         assertEquals(0, events.size)
34 35
     }
35 36
 
36 37
     @Test
37 38
     fun `JoinProcessor adds real name and account from extended join`() {
38 39
         val events = JoinProcessor().process(
39
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "JOIN", listOf("#crashandburn", "acidBurn", "Libby").map { it.toByteArray() }))
40
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "JOIN", params("#crashandburn", "acidBurn", "Libby")))
40 41
         assertEquals(1, events.size)
41 42
 
42 43
         assertEquals(TestConstants.time, events[0].time)
@@ -47,7 +48,7 @@ internal class JoinProcessorTest {
47 48
     @Test
48 49
     fun `JoinProcessor ignores account if the user is not authed`() {
49 50
         val events = JoinProcessor().process(
50
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "JOIN", listOf("#crashandburn", "*", "Libby").map { it.toByteArray() }))
51
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "JOIN", params("#crashandburn", "*", "Libby")))
51 52
         assertEquals(1, events.size)
52 53
 
53 54
         assertEquals(TestConstants.time, events[0].time)

+ 130
- 0
src/test/kotlin/com/dmdirc/ktirc/messages/ModeProcessorTest.kt View File

@@ -0,0 +1,130 @@
1
+package com.dmdirc.ktirc.messages
2
+
3
+import com.dmdirc.ktirc.TestConstants
4
+import com.dmdirc.ktirc.model.IrcMessage
5
+import com.dmdirc.ktirc.params
6
+import com.dmdirc.ktirc.util.currentTimeProvider
7
+import org.junit.jupiter.api.Assertions.*
8
+import org.junit.jupiter.api.BeforeEach
9
+import org.junit.jupiter.api.Test
10
+
11
+internal class ModeProcessorTest {
12
+
13
+    @BeforeEach
14
+    fun setUp() {
15
+        currentTimeProvider = { TestConstants.time }
16
+    }
17
+
18
+    @Test
19
+    fun `raises event for user mode discovery with no params`() {
20
+        val events = ModeProcessor().process(
21
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "221", params("acidBurn", "+hax")))
22
+        assertEquals(1, events.size)
23
+
24
+        assertEquals(TestConstants.time, events[0].time)
25
+        assertEquals("acidBurn", events[0].target)
26
+        assertEquals("+hax", events[0].modes)
27
+        assertEquals(0, events[0].arguments.size)
28
+        assertTrue(events[0].discovered)
29
+    }
30
+
31
+    @Test
32
+    fun `raises event for user mode discovery with params`() {
33
+        val events = ModeProcessor().process(
34
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "221", params("acidBurn", "+hax", "123", "467")))
35
+        assertEquals(1, events.size)
36
+
37
+        assertEquals(TestConstants.time, events[0].time)
38
+        assertEquals("acidBurn", events[0].target)
39
+        assertEquals("+hax", events[0].modes)
40
+        assertEquals(2, events[0].arguments.size)
41
+        assertEquals("123", events[0].arguments[0])
42
+        assertEquals("467", events[0].arguments[1])
43
+        assertTrue(events[0].discovered)
44
+    }
45
+
46
+    @Test
47
+    fun `raises event for user mode change with no params`() {
48
+        val events = ModeProcessor().process(
49
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "MODE", params("acidBurn", "+hax")))
50
+        assertEquals(1, events.size)
51
+
52
+        assertEquals(TestConstants.time, events[0].time)
53
+        assertEquals("acidBurn", events[0].target)
54
+        assertEquals("+hax", events[0].modes)
55
+        assertEquals(0, events[0].arguments.size)
56
+        assertFalse(events[0].discovered)
57
+    }
58
+
59
+    @Test
60
+    fun `raises event for user mode change with params`() {
61
+        val events = ModeProcessor().process(
62
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "MODE", params("acidBurn", "+hax", "123", "467")))
63
+        assertEquals(1, events.size)
64
+
65
+        assertEquals(TestConstants.time, events[0].time)
66
+        assertEquals("acidBurn", events[0].target)
67
+        assertEquals("+hax", events[0].modes)
68
+        assertEquals(2, events[0].arguments.size)
69
+        assertEquals("123", events[0].arguments[0])
70
+        assertEquals("467", events[0].arguments[1])
71
+        assertFalse(events[0].discovered)
72
+    }
73
+
74
+    @Test
75
+    fun `raises event for channel mode discovery with no params`() {
76
+        val events = ModeProcessor().process(
77
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "324", params("acidBurn", "#thegibson", "+hax")))
78
+        assertEquals(1, events.size)
79
+
80
+        assertEquals(TestConstants.time, events[0].time)
81
+        assertEquals("#thegibson", events[0].target)
82
+        assertEquals("+hax", events[0].modes)
83
+        assertEquals(0, events[0].arguments.size)
84
+        assertTrue(events[0].discovered)
85
+    }
86
+
87
+    @Test
88
+    fun `raises event for channel mode discovery with params`() {
89
+        val events = ModeProcessor().process(
90
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "324", params("acidBurn", "#thegibson", "+hax", "123", "467")))
91
+        assertEquals(1, events.size)
92
+
93
+        assertEquals(TestConstants.time, events[0].time)
94
+        assertEquals("#thegibson", events[0].target)
95
+        assertEquals("+hax", events[0].modes)
96
+        assertEquals(2, events[0].arguments.size)
97
+        assertEquals("123", events[0].arguments[0])
98
+        assertEquals("467", events[0].arguments[1])
99
+        assertTrue(events[0].discovered)
100
+    }
101
+
102
+    @Test
103
+    fun `raises event for channel mode change with no params`() {
104
+        val events = ModeProcessor().process(
105
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "MODE", params("#thegibson", "+hax")))
106
+        assertEquals(1, events.size)
107
+
108
+        assertEquals(TestConstants.time, events[0].time)
109
+        assertEquals("#thegibson", events[0].target)
110
+        assertEquals("+hax", events[0].modes)
111
+        assertEquals(0, events[0].arguments.size)
112
+        assertFalse(events[0].discovered)
113
+    }
114
+
115
+    @Test
116
+    fun `raises event for channel mode change with params`() {
117
+        val events = ModeProcessor().process(
118
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "MODE", params("#thegibson", "+hax", "123", "467")))
119
+        assertEquals(1, events.size)
120
+
121
+        assertEquals(TestConstants.time, events[0].time)
122
+        assertEquals("#thegibson", events[0].target)
123
+        assertEquals("+hax", events[0].modes)
124
+        assertEquals(2, events[0].arguments.size)
125
+        assertEquals("123", events[0].arguments[0])
126
+        assertEquals("467", events[0].arguments[1])
127
+        assertFalse(events[0].discovered)
128
+    }
129
+
130
+}

+ 3
- 2
src/test/kotlin/com/dmdirc/ktirc/messages/MotdProcessorTest.kt View File

@@ -3,6 +3,7 @@ package com.dmdirc.ktirc.messages
3 3
 import com.dmdirc.ktirc.TestConstants
4 4
 import com.dmdirc.ktirc.events.MotdFinished
5 5
 import com.dmdirc.ktirc.model.IrcMessage
6
+import com.dmdirc.ktirc.params
6 7
 import com.dmdirc.ktirc.util.currentTimeProvider
7 8
 import org.junit.jupiter.api.Assertions.*
8 9
 import org.junit.jupiter.api.BeforeEach
@@ -18,7 +19,7 @@ internal class MotdProcessorTest {
18 19
     @Test
19 20
     fun `MotdProcessor raises motdFinished when not found numeric received`() {
20 21
         val events = MotdProcessor().process(
21
-                IrcMessage(emptyMap(), "the.gibson".toByteArray(), "422", listOf("MOTD missing".toByteArray())))
22
+                IrcMessage(emptyMap(), "the.gibson".toByteArray(), "422", params("MOTD missing")))
22 23
         assertEquals(1, events.size)
23 24
 
24 25
         val event = events[0] as MotdFinished
@@ -29,7 +30,7 @@ internal class MotdProcessorTest {
29 30
     @Test
30 31
     fun `MotdProcessor raises motdFinished when MOTD finishes normally`() {
31 32
         val events = MotdProcessor().process(
32
-                IrcMessage(emptyMap(), "the.gibson".toByteArray(), "376", listOf("acidBurn".toByteArray(), "End of /MOTD command.".toByteArray())))
33
+                IrcMessage(emptyMap(), "the.gibson".toByteArray(), "376", params("acidBurn", "End of /MOTD command.")))
33 34
         assertEquals(1, events.size)
34 35
 
35 36
         val event = events[0] as MotdFinished

+ 3
- 2
src/test/kotlin/com/dmdirc/ktirc/messages/NamesProcessorTest.kt View File

@@ -3,6 +3,7 @@ package com.dmdirc.ktirc.messages
3 3
 import com.dmdirc.ktirc.events.ChannelNamesFinished
4 4
 import com.dmdirc.ktirc.events.ChannelNamesReceived
5 5
 import com.dmdirc.ktirc.model.IrcMessage
6
+import com.dmdirc.ktirc.params
6 7
 import org.junit.jupiter.api.Assertions.assertEquals
7 8
 import org.junit.jupiter.api.Test
8 9
 
@@ -12,7 +13,7 @@ internal class NamesProcessorTest {
12 13
 
13 14
     @Test
14 15
     fun `NamesProcessor handles end of names reply`() {
15
-        val events = processor.process(IrcMessage(emptyMap(), ":the.gibson".toByteArray(), "366", listOf("AcidBurn", "#root", "End of /NAMES list").map { it.toByteArray() }))
16
+        val events = processor.process(IrcMessage(emptyMap(), ":the.gibson".toByteArray(), "366", params("AcidBurn", "#root", "End of /NAMES list")))
16 17
 
17 18
         assertEquals(1, events.size)
18 19
         assertEquals("#root", (events[0] as ChannelNamesFinished).channel)
@@ -20,7 +21,7 @@ internal class NamesProcessorTest {
20 21
 
21 22
     @Test
22 23
     fun `NamesProcessor handles names reply`() {
23
-        val events = processor.process(IrcMessage(emptyMap(), ":the.gibson".toByteArray(), "353", listOf("AcidBurn", "@", "#root", "AcidBurn @ZeroCool +ThePlague").map { it.toByteArray() }))
24
+        val events = processor.process(IrcMessage(emptyMap(), ":the.gibson".toByteArray(), "353", params("AcidBurn", "@", "#root", "AcidBurn @ZeroCool +ThePlague")))
24 25
 
25 26
         assertEquals(1, events.size)
26 27
         val event = events[0] as ChannelNamesReceived

+ 4
- 3
src/test/kotlin/com/dmdirc/ktirc/messages/PartProcessorTest.kt View File

@@ -3,6 +3,7 @@ package com.dmdirc.ktirc.messages
3 3
 import com.dmdirc.ktirc.TestConstants
4 4
 import com.dmdirc.ktirc.model.IrcMessage
5 5
 import com.dmdirc.ktirc.model.User
6
+import com.dmdirc.ktirc.params
6 7
 import com.dmdirc.ktirc.util.currentTimeProvider
7 8
 import org.junit.jupiter.api.Assertions.assertEquals
8 9
 import org.junit.jupiter.api.BeforeEach
@@ -18,7 +19,7 @@ internal class PartProcessorTest {
18 19
     @Test
19 20
     fun `PartProcessor raises part event without message`() {
20 21
         val events = PartProcessor().process(
21
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PART", listOf("#crashandburn".toByteArray())))
22
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PART", params("#crashandburn")))
22 23
         assertEquals(1, events.size)
23 24
 
24 25
         assertEquals(TestConstants.time, events[0].time)
@@ -30,7 +31,7 @@ internal class PartProcessorTest {
30 31
     @Test
31 32
     fun `PartProcessor raises part event with message`() {
32 33
         val events = PartProcessor().process(
33
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PART", listOf("#crashandburn".toByteArray(), "Hack the planet!".toByteArray())))
34
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PART", params("#crashandburn", "Hack the planet!")))
34 35
         assertEquals(1, events.size)
35 36
 
36 37
         assertEquals(TestConstants.time, events[0].time)
@@ -42,7 +43,7 @@ internal class PartProcessorTest {
42 43
     @Test
43 44
     fun `PartProcessor does nothing if prefix missing`() {
44 45
         val events = PartProcessor().process(
45
-                IrcMessage(emptyMap(), null, "PART", listOf("#crashandburn".toByteArray())))
46
+                IrcMessage(emptyMap(), null, "PART", params("#crashandburn")))
46 47
         assertEquals(0, events.size)
47 48
     }
48 49
 

+ 8
- 7
src/test/kotlin/com/dmdirc/ktirc/messages/PrivmsgProcessorTest.kt View File

@@ -6,6 +6,7 @@ import com.dmdirc.ktirc.events.CtcpReceived
6 6
 import com.dmdirc.ktirc.events.MessageReceived
7 7
 import com.dmdirc.ktirc.model.IrcMessage
8 8
 import com.dmdirc.ktirc.model.User
9
+import com.dmdirc.ktirc.params
9 10
 import com.dmdirc.ktirc.util.currentTimeProvider
10 11
 import org.junit.jupiter.api.Assertions.assertEquals
11 12
 import org.junit.jupiter.api.BeforeEach
@@ -21,7 +22,7 @@ internal class PrivmsgProcessorTest {
21 22
     @Test
22 23
     fun `PrivsgProcessor raises message received event`() {
23 24
         val events = PrivmsgProcessor().process(
24
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", listOf("#crashandburn".toByteArray(), "hack the planet!".toByteArray())))
25
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", params("#crashandburn", "hack the planet!")))
25 26
         assertEquals(1, events.size)
26 27
 
27 28
         val event = events[0] as MessageReceived
@@ -34,7 +35,7 @@ internal class PrivmsgProcessorTest {
34 35
     @Test
35 36
     fun `PrivsgProcessor raises action received event with content`() {
36 37
         val events = PrivmsgProcessor().process(
37
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", listOf("#crashandburn".toByteArray(), "\u0001ACTION hacks the planet\u0001".toByteArray())))
38
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", params("#crashandburn", "\u0001ACTION hacks the planet\u0001")))
38 39
         assertEquals(1, events.size)
39 40
 
40 41
         val event = events[0] as ActionReceived
@@ -47,7 +48,7 @@ internal class PrivmsgProcessorTest {
47 48
     @Test
48 49
     fun `PrivsgProcessor raises action received event without content`() {
49 50
         val events = PrivmsgProcessor().process(
50
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", listOf("#crashandburn".toByteArray(), "\u0001ACTION\u0001".toByteArray())))
51
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", params("#crashandburn", "\u0001ACTION\u0001")))
51 52
         assertEquals(1, events.size)
52 53
 
53 54
         val event = events[0] as ActionReceived
@@ -60,7 +61,7 @@ internal class PrivmsgProcessorTest {
60 61
     @Test
61 62
     fun `PrivsgProcessor raises action received event with lowercase type`() {
62 63
         val events = PrivmsgProcessor().process(
63
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", listOf("#crashandburn".toByteArray(), "\u0001action hacks the planet\u0001".toByteArray())))
64
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", params("#crashandburn", "\u0001action hacks the planet\u0001")))
64 65
         assertEquals(1, events.size)
65 66
 
66 67
         val event = events[0] as ActionReceived
@@ -73,7 +74,7 @@ internal class PrivmsgProcessorTest {
73 74
     @Test
74 75
     fun `PrivsgProcessor raises CTCP received event with content`() {
75 76
         val events = PrivmsgProcessor().process(
76
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", listOf("#crashandburn".toByteArray(), "\u0001PING 12345\u0001".toByteArray())))
77
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", params("#crashandburn", "\u0001PING 12345\u0001")))
77 78
         assertEquals(1, events.size)
78 79
 
79 80
         val event = events[0] as CtcpReceived
@@ -87,7 +88,7 @@ internal class PrivmsgProcessorTest {
87 88
     @Test
88 89
     fun `PrivsgProcessor raises CTCP received event without content`() {
89 90
         val events = PrivmsgProcessor().process(
90
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", listOf("#crashandburn".toByteArray(), "\u0001PING\u0001".toByteArray())))
91
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", params("#crashandburn", "\u0001PING\u0001")))
91 92
         assertEquals(1, events.size)
92 93
 
93 94
         val event = events[0] as CtcpReceived
@@ -101,7 +102,7 @@ internal class PrivmsgProcessorTest {
101 102
     @Test
102 103
     fun `PrivsgProcessor does nothing if prefix missing`() {
103 104
         val events = PrivmsgProcessor().process(
104
-                IrcMessage(emptyMap(), null, "PRIVMSG", listOf("#crashandburn".toByteArray(), "hack the planet!".toByteArray())))
105
+                IrcMessage(emptyMap(), null, "PRIVMSG", params("#crashandburn", "hack the planet!")))
105 106
         assertEquals(0, events.size)
106 107
     }
107 108
 }

+ 3
- 2
src/test/kotlin/com/dmdirc/ktirc/messages/QuitProcessorTest.kt View File

@@ -3,6 +3,7 @@ package com.dmdirc.ktirc.messages
3 3
 import com.dmdirc.ktirc.TestConstants
4 4
 import com.dmdirc.ktirc.model.IrcMessage
5 5
 import com.dmdirc.ktirc.model.User
6
+import com.dmdirc.ktirc.params
6 7
 import com.dmdirc.ktirc.util.currentTimeProvider
7 8
 import org.junit.jupiter.api.Assertions.assertEquals
8 9
 import org.junit.jupiter.api.BeforeEach
@@ -29,7 +30,7 @@ internal class QuitProcessorTest {
29 30
     @Test
30 31
     fun `QuitProcessor raises quit event with message`() {
31 32
         val events = QuitProcessor().process(
32
-                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "QUIT", listOf("Hack the planet!".toByteArray())))
33
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "QUIT", params("Hack the planet!")))
33 34
         assertEquals(1, events.size)
34 35
 
35 36
         assertEquals(TestConstants.time, events[0].time)
@@ -40,7 +41,7 @@ internal class QuitProcessorTest {
40 41
     @Test
41 42
     fun `QuitProcessor does nothing if prefix missing`() {
42 43
         val events = QuitProcessor().process(
43
-                IrcMessage(emptyMap(), null, "QUIT", listOf("Hack the planet!".toByteArray())))
44
+                IrcMessage(emptyMap(), null, "QUIT", params("Hack the planet!")))
44 45
         assertEquals(0, events.size)
45 46
     }
46 47
 

+ 3
- 9
src/test/kotlin/com/dmdirc/ktirc/messages/WelcomeProcessorTest.kt View File

@@ -2,9 +2,9 @@ package com.dmdirc.ktirc.messages
2 2
 
3 3
 import com.dmdirc.ktirc.TestConstants
4 4
 import com.dmdirc.ktirc.model.IrcMessage
5
+import com.dmdirc.ktirc.params
5 6
 import com.dmdirc.ktirc.util.currentTimeProvider
6 7
 import org.junit.jupiter.api.Assertions.assertEquals
7
-import org.junit.jupiter.api.Assertions.assertTrue
8 8
 import org.junit.jupiter.api.BeforeEach
9 9
 import org.junit.jupiter.api.Test
10 10
 
@@ -17,16 +17,10 @@ internal class WelcomeProcessorTest {
17 17
         currentTimeProvider = { TestConstants.time }
18 18
     }
19 19
 
20
-    @Test
21
-    fun `WelcomeProcessor can handle 001s`() {
22
-        assertTrue(processor.commands.contains("001")) { "WelcomeProcessor should handle 001 messages" }
23
-    }
24
-
25 20
     @Test
26 21
     fun `WelcomeProcessor returns server welcome event`() {
27
-        val events = processor.process(IrcMessage(emptyMap(), "thegibson.com".toByteArray(), "001", listOf(
28
-                "acidBurn".toByteArray(),
29
-                "Welcome to the Internet Relay Network, acidBurn!burn@hacktheplanet.com".toByteArray())))
22
+        val events = processor.process(IrcMessage(emptyMap(), "thegibson.com".toByteArray(), "001", params(
23
+                "acidBurn", "Welcome to the Internet Relay Network, acidBurn!burn@hacktheplanet.com")))
30 24
         assertEquals(1, events.size)
31 25
         assertEquals(TestConstants.time, events[0].time)
32 26
         assertEquals("acidBurn", events[0].localNick)

Loading…
Cancel
Save