Przeglądaj źródła

Raise ServerConnected event, track status nicely

tags/v0.3.0
Chris Smith 5 lat temu
rodzic
commit
c6b0471761

+ 3
- 0
CHANGELOG Wyświetl plik

4
     Instead of: client.send(joinMessage("#channel"))
4
     Instead of: client.send(joinMessage("#channel"))
5
     Now use: client.sendJoin("#channel")
5
     Now use: client.sendJoin("#channel")
6
   * Added reply utility to easily send replies to message events
6
   * Added reply utility to easily send replies to message events
7
+  * Server state improvements:
8
+    * Added status field to ServerState
9
+    * ServerConnected event is emitted as soon as the socket is connected
7
 
10
 
8
 v0.2.1
11
 v0.2.1
9
 
12
 

+ 4
- 2
src/main/kotlin/com/dmdirc/ktirc/IrcClient.kt Wyświetl plik

4
 import com.dmdirc.ktirc.io.*
4
 import com.dmdirc.ktirc.io.*
5
 import com.dmdirc.ktirc.messages.*
5
 import com.dmdirc.ktirc.messages.*
6
 import com.dmdirc.ktirc.model.*
6
 import com.dmdirc.ktirc.model.*
7
+import com.dmdirc.ktirc.util.currentTimeProvider
7
 import kotlinx.coroutines.*
8
 import kotlinx.coroutines.*
8
 import kotlinx.coroutines.channels.map
9
 import kotlinx.coroutines.channels.map
9
 import java.util.concurrent.atomic.AtomicBoolean
10
 import java.util.concurrent.atomic.AtomicBoolean
108
         check(!connecting.getAndSet(true))
109
         check(!connecting.getAndSet(true))
109
         connectionJob = scope.launch {
110
         connectionJob = scope.launch {
110
             with(socketFactory(server.host, server.port, server.tls)) {
111
             with(socketFactory(server.host, server.port, server.tls)) {
112
+                // TODO: Proper error handling - what if connect() fails?
111
                 socket = this
113
                 socket = this
112
                 connect()
114
                 connect()
113
-                sendLine("CAP LS 302")
115
+                messageHandler.emitEvent(this@IrcClientImpl, ServerConnected(currentTimeProvider()))
116
+                sendLine("CAP LS 302") // TODO: Stick this in a builder
114
                 server.password?.let { pass -> sendPassword(pass) }
117
                 server.password?.let { pass -> sendPassword(pass) }
115
                 sendNickChange(profile.initialNick)
118
                 sendNickChange(profile.initialNick)
116
                 // TODO: Send correct host
119
                 // TODO: Send correct host
117
                 sendUser(profile.userName, "localhost", server.host, profile.realName)
120
                 sendUser(profile.userName, "localhost", server.host, profile.realName)
118
-                // TODO: This should be elsewhere
119
                 messageHandler.processMessages(this@IrcClientImpl, readLines(scope).map { parser.parse(it) })
121
                 messageHandler.processMessages(this@IrcClientImpl, readLines(scope).map { parser.parse(it) })
120
             }
122
             }
121
         }
123
         }

+ 3
- 4
src/main/kotlin/com/dmdirc/ktirc/events/Events.kt Wyświetl plik

8
 /** Base class for all events. */
8
 /** Base class for all events. */
9
 sealed class IrcEvent(val time: LocalDateTime)
9
 sealed class IrcEvent(val time: LocalDateTime)
10
 
10
 
11
+/** Raised when the connection to the server has been established. The server will not be ready for use yet. */
12
+class ServerConnected(time: LocalDateTime) : IrcEvent(time)
13
+
11
 /** Raised when the server initially welcomes us to the IRC network. */
14
 /** Raised when the server initially welcomes us to the IRC network. */
12
 class ServerWelcome(time: LocalDateTime, val localNick: String) : IrcEvent(time)
15
 class ServerWelcome(time: LocalDateTime, val localNick: String) : IrcEvent(time)
13
 
16
 
14
 /** Raised when the features supported by the server have changed. This may occur numerous times. */
17
 /** Raised when the features supported by the server have changed. This may occur numerous times. */
15
 class ServerFeaturesUpdated(time: LocalDateTime, val serverFeatures: ServerFeatureMap) : IrcEvent(time)
18
 class ServerFeaturesUpdated(time: LocalDateTime, val serverFeatures: ServerFeatureMap) : IrcEvent(time)
16
 
19
 
17
-/** Raised when the connection to the server has been established, configuration information has been received, etc. */
18
-// TODO: Implement
19
-class ServerConnected(time: LocalDateTime) : IrcEvent(time)
20
-
21
 /** Raised whenever a PING is received from the server. */
20
 /** Raised whenever a PING is received from the server. */
22
 class PingReceived(time: LocalDateTime, val nonce: ByteArray) : IrcEvent(time)
21
 class PingReceived(time: LocalDateTime, val nonce: ByteArray) : IrcEvent(time)
23
 
22
 

+ 10
- 8
src/main/kotlin/com/dmdirc/ktirc/io/MessageHandler.kt Wyświetl plik

2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
 import com.dmdirc.ktirc.events.EventHandler
4
 import com.dmdirc.ktirc.events.EventHandler
5
+import com.dmdirc.ktirc.events.IrcEvent
5
 import com.dmdirc.ktirc.messages.MessageProcessor
6
 import com.dmdirc.ktirc.messages.MessageProcessor
6
 import com.dmdirc.ktirc.model.IrcMessage
7
 import com.dmdirc.ktirc.model.IrcMessage
7
 import com.dmdirc.ktirc.util.logger
8
 import com.dmdirc.ktirc.util.logger
8
 import kotlinx.coroutines.channels.ReceiveChannel
9
 import kotlinx.coroutines.channels.ReceiveChannel
9
-import kotlinx.coroutines.channels.consumeEach
10
 
10
 
11
 internal class MessageHandler(private val processors: List<MessageProcessor>, val handlers: MutableList<EventHandler>) {
11
 internal class MessageHandler(private val processors: List<MessageProcessor>, val handlers: MutableList<EventHandler>) {
12
 
12
 
13
     private val log by logger()
13
     private val log by logger()
14
 
14
 
15
     suspend fun processMessages(ircClient: IrcClient, messages: ReceiveChannel<IrcMessage>) {
15
     suspend fun processMessages(ircClient: IrcClient, messages: ReceiveChannel<IrcMessage>) {
16
-        messages.consumeEach {
17
-            it.process().forEach { event ->
18
-                handlers.forEach { handler ->
19
-                    handler.processEvent(ircClient, event)
20
-                }
21
-            }
16
+        for (message in messages) {
17
+            message.toEvents().forEach { event -> emitEvent(ircClient, event) }
22
         }
18
         }
23
     }
19
     }
24
 
20
 
25
-    private fun IrcMessage.process() = this.getProcessor()?.process(this) ?: emptyList()
21
+    fun emitEvent(ircClient: IrcClient, ircEvent: IrcEvent) {
22
+        handlers.forEach { handler ->
23
+            handler.processEvent(ircClient, ircEvent)
24
+        }
25
+    }
26
+
27
+    private fun IrcMessage.toEvents() = this.getProcessor()?.process(this) ?: emptyList()
26
     private fun IrcMessage.getProcessor() = processors.firstOrNull { it.commands.contains(command) } ?: run {
28
     private fun IrcMessage.getProcessor() = processors.firstOrNull { it.commands.contains(command) } ?: run {
27
         log.warning { "No processor found for $command" }
29
         log.warning { "No processor found for $command" }
28
         null
30
         null

+ 2
- 6
src/main/kotlin/com/dmdirc/ktirc/model/IrcMessage.kt Wyświetl plik

1
 package com.dmdirc.ktirc.model
1
 package com.dmdirc.ktirc.model
2
 
2
 
3
+import com.dmdirc.ktirc.util.currentTimeProvider
4
+import com.dmdirc.ktirc.util.currentTimeZoneProvider
3
 import java.time.Instant
5
 import java.time.Instant
4
 import java.time.LocalDateTime
6
 import java.time.LocalDateTime
5
-import java.time.ZoneId
6
 
7
 
7
 class IrcMessage(val tags: Map<MessageTag, String>, val prefix: ByteArray?, val command: String, val params: List<ByteArray>) {
8
 class IrcMessage(val tags: Map<MessageTag, String>, val prefix: ByteArray?, val command: String, val params: List<ByteArray>) {
8
 
9
 
9
-    companion object {
10
-        internal var currentTimeZoneProvider = { ZoneId.systemDefault() }
11
-        internal var currentTimeProvider = { LocalDateTime.now(currentTimeZoneProvider()) }
12
-    }
13
-
14
     val time: LocalDateTime = if (MessageTag.ServerTime in tags) {
10
     val time: LocalDateTime = if (MessageTag.ServerTime in tags) {
15
         LocalDateTime.ofInstant(Instant.parse(tags[MessageTag.ServerTime]), currentTimeZoneProvider())
11
         LocalDateTime.ofInstant(Instant.parse(tags[MessageTag.ServerTime]), currentTimeZoneProvider())
16
     } else {
12
     } else {

+ 26
- 1
src/main/kotlin/com/dmdirc/ktirc/model/ServerState.kt Wyświetl plik

3
 import com.dmdirc.ktirc.io.CaseMapping
3
 import com.dmdirc.ktirc.io.CaseMapping
4
 import kotlin.reflect.KClass
4
 import kotlin.reflect.KClass
5
 
5
 
6
-class ServerState(initialNickname: String) {
6
+/**
7
+ * Contains the current state of a single IRC server.
8
+ */
9
+class ServerState internal constructor(initialNickname: String) {
7
 
10
 
11
+    /** The current status of the server. */
12
+    var status = ServerStatus.Connecting
13
+        internal set
14
+
15
+    /** Our present nickname on the server. */
8
     var localNickname: String = initialNickname
16
     var localNickname: String = initialNickname
17
+        internal set
18
+
19
+    /** The features that the server has declared it supports (from the 005 header). */
9
     val features = ServerFeatureMap()
20
     val features = ServerFeatureMap()
21
+
22
+    /** The capabilities we have negotiated with the server (from IRCv3). */
10
     val capabilities = CapabilitiesState()
23
     val capabilities = CapabilitiesState()
11
 
24
 
12
 }
25
 }
48
 internal val serverFeatures: Map<String, ServerFeature<*>> by lazy {
61
 internal val serverFeatures: Map<String, ServerFeature<*>> by lazy {
49
     ServerFeature::class.nestedClasses.map { it.objectInstance as ServerFeature<*> }.associateBy { it.name }
62
     ServerFeature::class.nestedClasses.map { it.objectInstance as ServerFeature<*> }.associateBy { it.name }
50
 }
63
 }
64
+
65
+/**
66
+ * Enumeration of the possible states of a server.
67
+ */
68
+enum class ServerStatus {
69
+    /** We are attempting to connect to the server. It is not yet ready for use. */
70
+    Connecting,
71
+    /** We are logging in, dealing with capabilities, etc. The server is not yet ready for use. */
72
+    Negotiating,
73
+    /** We are connected and commands can be sent. */
74
+    Ready,
75
+}

+ 7
- 0
src/main/kotlin/com/dmdirc/ktirc/util/Time.kt Wyświetl plik

1
+package com.dmdirc.ktirc.util
2
+
3
+import java.time.LocalDateTime
4
+import java.time.ZoneId
5
+
6
+internal var currentTimeZoneProvider = { ZoneId.systemDefault() }
7
+internal var currentTimeProvider = { LocalDateTime.now(currentTimeZoneProvider()) }

+ 20
- 2
src/test/kotlin/com/dmdirc/ktirc/IrcClientTest.kt Wyświetl plik

1
 package com.dmdirc.ktirc
1
 package com.dmdirc.ktirc
2
 
2
 
3
 import com.dmdirc.ktirc.events.IrcEvent
3
 import com.dmdirc.ktirc.events.IrcEvent
4
+import com.dmdirc.ktirc.events.ServerConnected
4
 import com.dmdirc.ktirc.events.ServerWelcome
5
 import com.dmdirc.ktirc.events.ServerWelcome
5
 import com.dmdirc.ktirc.io.CaseMapping
6
 import com.dmdirc.ktirc.io.CaseMapping
6
 import com.dmdirc.ktirc.io.LineBufferedSocket
7
 import com.dmdirc.ktirc.io.LineBufferedSocket
7
-import com.dmdirc.ktirc.model.*
8
+import com.dmdirc.ktirc.model.Profile
9
+import com.dmdirc.ktirc.model.Server
10
+import com.dmdirc.ktirc.model.ServerFeature
11
+import com.dmdirc.ktirc.model.User
12
+import com.dmdirc.ktirc.util.currentTimeProvider
8
 import com.nhaarman.mockitokotlin2.*
13
 import com.nhaarman.mockitokotlin2.*
9
 import kotlinx.coroutines.GlobalScope
14
 import kotlinx.coroutines.GlobalScope
10
 import kotlinx.coroutines.channels.Channel
15
 import kotlinx.coroutines.channels.Channel
41
 
46
 
42
     @BeforeEach
47
     @BeforeEach
43
     fun setUp() {
48
     fun setUp() {
44
-        IrcMessage.currentTimeProvider = { TestConstants.time }
49
+        currentTimeProvider = { TestConstants.time }
45
     }
50
     }
46
 
51
 
47
     @Test
52
     @Test
73
         }
78
         }
74
     }
79
     }
75
 
80
 
81
+    @Test
82
+    fun `IrcClientImpl emits connected event with local time`() = runBlocking {
83
+        currentTimeProvider = { TestConstants.time }
84
+        val client = IrcClientImpl(Server(HOST, PORT), Profile(NICK, REAL_NAME, USER_NAME))
85
+        client.socketFactory = mockSocketFactory
86
+        client.onEvent(mockEventHandler)
87
+        client.connect()
88
+
89
+        val captor = argumentCaptor<ServerConnected>()
90
+        verify(mockEventHandler, timeout(500)).invoke(captor.capture())
91
+        assertEquals(TestConstants.time, captor.firstValue.time)
92
+    }
93
+
76
     @Test
94
     @Test
77
     fun `IrcClientImpl sends basic connection strings`() = runBlocking {
95
     fun `IrcClientImpl sends basic connection strings`() = runBlocking {
78
         val client = IrcClientImpl(Server(HOST, PORT), Profile(NICK, REAL_NAME, USER_NAME))
96
         val client = IrcClientImpl(Server(HOST, PORT), Profile(NICK, REAL_NAME, USER_NAME))

+ 13
- 4
src/test/kotlin/com/dmdirc/ktirc/io/MessageHandlerTest.kt Wyświetl plik

25
     }
25
     }
26
 
26
 
27
     @Test
27
     @Test
28
-    fun `MessageHandler passes message on to correct processor`() = runBlocking {
28
+    fun `MessageHandler passes message on to correct processor`() = runBlocking<Unit> {
29
         val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf())
29
         val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf())
30
         val message = IrcMessage(emptyMap(), null, "JOIN", emptyList())
30
         val message = IrcMessage(emptyMap(), null, "JOIN", emptyList())
31
 
31
 
36
         }
36
         }
37
 
37
 
38
         verify(joinProcessor).process(message)
38
         verify(joinProcessor).process(message)
39
-        Unit
40
     }
39
     }
41
 
40
 
42
     @Test
41
     @Test
43
-    fun `MessageHandler reads multiple messages`() = runBlocking {
42
+    fun `MessageHandler reads multiple messages`() = runBlocking<Unit> {
44
         val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf())
43
         val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf())
45
         val joinMessage = IrcMessage(emptyMap(), null, "JOIN", emptyList())
44
         val joinMessage = IrcMessage(emptyMap(), null, "JOIN", emptyList())
46
         val nickMessage = IrcMessage(emptyMap(), null, "NICK", emptyList())
45
         val nickMessage = IrcMessage(emptyMap(), null, "NICK", emptyList())
58
             verify(joinProcessor).process(joinMessage)
57
             verify(joinProcessor).process(joinMessage)
59
             verify(nickProcessor).process(nickMessage)
58
             verify(nickProcessor).process(nickMessage)
60
         }
59
         }
61
-        Unit
62
     }
60
     }
63
 
61
 
64
     @Test
62
     @Test
81
         verify(eventHandler2).processEvent(same(ircClient), isA<ServerWelcome>())
79
         verify(eventHandler2).processEvent(same(ircClient), isA<ServerWelcome>())
82
     }
80
     }
83
 
81
 
82
+    @Test
83
+    fun `MessageHandler emits custom events to all handlers`() = runBlocking {
84
+        val eventHandler1 = mock<EventHandler>()
85
+        val eventHandler2 = mock<EventHandler>()
86
+        val handler = MessageHandler(emptyList(), mutableListOf(eventHandler1, eventHandler2))
87
+        handler.emitEvent(ircClient, ServerWelcome(TestConstants.time, "abc"))
88
+
89
+        verify(eventHandler1).processEvent(same(ircClient), isA<ServerWelcome>())
90
+        verify(eventHandler2).processEvent(same(ircClient), isA<ServerWelcome>())
91
+    }
92
+
84
 }
93
 }

+ 2
- 1
src/test/kotlin/com/dmdirc/ktirc/messages/JoinProcessorTest.kt Wyświetl plik

3
 import com.dmdirc.ktirc.TestConstants
3
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.model.IrcMessage
4
 import com.dmdirc.ktirc.model.IrcMessage
5
 import com.dmdirc.ktirc.model.User
5
 import com.dmdirc.ktirc.model.User
6
+import com.dmdirc.ktirc.util.currentTimeProvider
6
 import org.junit.jupiter.api.Assertions.assertEquals
7
 import org.junit.jupiter.api.Assertions.assertEquals
7
 import org.junit.jupiter.api.BeforeEach
8
 import org.junit.jupiter.api.BeforeEach
8
 import org.junit.jupiter.api.Test
9
 import org.junit.jupiter.api.Test
11
 
12
 
12
     @BeforeEach
13
     @BeforeEach
13
     fun setUp() {
14
     fun setUp() {
14
-        IrcMessage.currentTimeProvider = { TestConstants.time }
15
+        currentTimeProvider = { TestConstants.time }
15
     }
16
     }
16
 
17
 
17
     @Test
18
     @Test

+ 2
- 1
src/test/kotlin/com/dmdirc/ktirc/messages/PartProcessorTest.kt Wyświetl plik

3
 import com.dmdirc.ktirc.TestConstants
3
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.model.IrcMessage
4
 import com.dmdirc.ktirc.model.IrcMessage
5
 import com.dmdirc.ktirc.model.User
5
 import com.dmdirc.ktirc.model.User
6
+import com.dmdirc.ktirc.util.currentTimeProvider
6
 import org.junit.jupiter.api.Assertions.assertEquals
7
 import org.junit.jupiter.api.Assertions.assertEquals
7
 import org.junit.jupiter.api.BeforeEach
8
 import org.junit.jupiter.api.BeforeEach
8
 import org.junit.jupiter.api.Test
9
 import org.junit.jupiter.api.Test
11
 
12
 
12
     @BeforeEach
13
     @BeforeEach
13
     fun setUp() {
14
     fun setUp() {
14
-        IrcMessage.currentTimeProvider = { TestConstants.time }
15
+        currentTimeProvider = { TestConstants.time }
15
     }
16
     }
16
 
17
 
17
     @Test
18
     @Test

+ 2
- 1
src/test/kotlin/com/dmdirc/ktirc/messages/PrivmsgProcessorTest.kt Wyświetl plik

3
 import com.dmdirc.ktirc.TestConstants
3
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.model.IrcMessage
4
 import com.dmdirc.ktirc.model.IrcMessage
5
 import com.dmdirc.ktirc.model.User
5
 import com.dmdirc.ktirc.model.User
6
+import com.dmdirc.ktirc.util.currentTimeProvider
6
 import org.junit.jupiter.api.Assertions.assertEquals
7
 import org.junit.jupiter.api.Assertions.assertEquals
7
 import org.junit.jupiter.api.BeforeEach
8
 import org.junit.jupiter.api.BeforeEach
8
 import org.junit.jupiter.api.Test
9
 import org.junit.jupiter.api.Test
11
 
12
 
12
     @BeforeEach
13
     @BeforeEach
13
     fun setUp() {
14
     fun setUp() {
14
-        IrcMessage.currentTimeProvider = { TestConstants.time }
15
+        currentTimeProvider = { TestConstants.time }
15
     }
16
     }
16
 
17
 
17
     @Test
18
     @Test

+ 2
- 1
src/test/kotlin/com/dmdirc/ktirc/messages/QuitProcessorTest.kt Wyświetl plik

3
 import com.dmdirc.ktirc.TestConstants
3
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.model.IrcMessage
4
 import com.dmdirc.ktirc.model.IrcMessage
5
 import com.dmdirc.ktirc.model.User
5
 import com.dmdirc.ktirc.model.User
6
+import com.dmdirc.ktirc.util.currentTimeProvider
6
 import org.junit.jupiter.api.Assertions.assertEquals
7
 import org.junit.jupiter.api.Assertions.assertEquals
7
 import org.junit.jupiter.api.BeforeEach
8
 import org.junit.jupiter.api.BeforeEach
8
 import org.junit.jupiter.api.Test
9
 import org.junit.jupiter.api.Test
11
 
12
 
12
     @BeforeEach
13
     @BeforeEach
13
     fun setUp() {
14
     fun setUp() {
14
-        IrcMessage.currentTimeProvider = { TestConstants.time }
15
+        currentTimeProvider = { TestConstants.time }
15
     }
16
     }
16
 
17
 
17
     @Test
18
     @Test

+ 2
- 1
src/test/kotlin/com/dmdirc/ktirc/messages/WelcomeProcessorTest.kt Wyświetl plik

2
 
2
 
3
 import com.dmdirc.ktirc.TestConstants
3
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.model.IrcMessage
4
 import com.dmdirc.ktirc.model.IrcMessage
5
+import com.dmdirc.ktirc.util.currentTimeProvider
5
 import org.junit.jupiter.api.Assertions.assertEquals
6
 import org.junit.jupiter.api.Assertions.assertEquals
6
 import org.junit.jupiter.api.Assertions.assertTrue
7
 import org.junit.jupiter.api.Assertions.assertTrue
7
 import org.junit.jupiter.api.BeforeEach
8
 import org.junit.jupiter.api.BeforeEach
13
 
14
 
14
     @BeforeEach
15
     @BeforeEach
15
     fun setUp() {
16
     fun setUp() {
16
-        IrcMessage.currentTimeProvider = { TestConstants.time }
17
+        currentTimeProvider = { TestConstants.time }
17
     }
18
     }
18
 
19
 
19
     @Test
20
     @Test

+ 5
- 3
src/test/kotlin/com/dmdirc/ktirc/model/IrcMessageTest.kt Wyświetl plik

1
 package com.dmdirc.ktirc.model
1
 package com.dmdirc.ktirc.model
2
 
2
 
3
 import com.dmdirc.ktirc.TestConstants
3
 import com.dmdirc.ktirc.TestConstants
4
+import com.dmdirc.ktirc.util.currentTimeProvider
5
+import com.dmdirc.ktirc.util.currentTimeZoneProvider
4
 import org.junit.jupiter.api.Assertions.assertEquals
6
 import org.junit.jupiter.api.Assertions.assertEquals
5
 import org.junit.jupiter.api.Assertions.assertNull
7
 import org.junit.jupiter.api.Assertions.assertNull
6
 import org.junit.jupiter.api.Test
8
 import org.junit.jupiter.api.Test
11
 
13
 
12
     @Test
14
     @Test
13
     fun `Gets UTC time from ServerTime tag if present`() {
15
     fun `Gets UTC time from ServerTime tag if present`() {
14
-        IrcMessage.currentTimeZoneProvider = { ZoneId.of("Z") }
16
+        currentTimeZoneProvider = { ZoneId.of("Z") }
15
         val message = IrcMessage(hashMapOf(MessageTag.ServerTime to "1995-09-15T09:00:00.0000Z"), null, "", emptyList())
17
         val message = IrcMessage(hashMapOf(MessageTag.ServerTime to "1995-09-15T09:00:00.0000Z"), null, "", emptyList())
16
         assertEquals(LocalDateTime.parse("1995-09-15T09:00:00"), message.time)
18
         assertEquals(LocalDateTime.parse("1995-09-15T09:00:00"), message.time)
17
     }
19
     }
18
 
20
 
19
     @Test
21
     @Test
20
     fun `Converts time in ServerTime tag to local timezone`() {
22
     fun `Converts time in ServerTime tag to local timezone`() {
21
-        IrcMessage.currentTimeZoneProvider = { ZoneId.of("America/New_York") }
23
+        currentTimeZoneProvider = { ZoneId.of("America/New_York") }
22
         val message = IrcMessage(hashMapOf(MessageTag.ServerTime to "1995-09-15T09:00:00.0000Z"), null, "", emptyList())
24
         val message = IrcMessage(hashMapOf(MessageTag.ServerTime to "1995-09-15T09:00:00.0000Z"), null, "", emptyList())
23
         assertEquals(LocalDateTime.parse("1995-09-15T05:00:00"), message.time)
25
         assertEquals(LocalDateTime.parse("1995-09-15T05:00:00"), message.time)
24
     }
26
     }
25
 
27
 
26
     @Test
28
     @Test
27
     fun `Uses current local time if no tag present`() {
29
     fun `Uses current local time if no tag present`() {
28
-        IrcMessage.currentTimeProvider = { TestConstants.time }
30
+        currentTimeProvider = { TestConstants.time }
29
         val message = IrcMessage(emptyMap(), null, "", emptyList())
31
         val message = IrcMessage(emptyMap(), null, "", emptyList())
30
         assertEquals(LocalDateTime.parse("1995-09-15T09:00:00"), message.time)
32
         assertEquals(LocalDateTime.parse("1995-09-15T09:00:00"), message.time)
31
     }
33
     }

+ 7
- 1
src/test/kotlin/com/dmdirc/ktirc/model/ServerStateTest.kt Wyświetl plik

6
 internal class ServerStateTest {
6
 internal class ServerStateTest {
7
 
7
 
8
     @Test
8
     @Test
9
-    fun `IrcServerState should use the initial nickname as local nickname`() {
9
+    fun `ServerState should use the initial nickname as local nickname`() {
10
         val serverState = ServerState("acidBurn")
10
         val serverState = ServerState("acidBurn")
11
         assertEquals("acidBurn", serverState.localNickname)
11
         assertEquals("acidBurn", serverState.localNickname)
12
     }
12
     }
13
 
13
 
14
+    @Test
15
+    fun `ServerState should default status to connecting`() {
16
+        val serverState = ServerState("acidBurn")
17
+        assertEquals(ServerStatus.Connecting, serverState.status)
18
+    }
19
+
14
 }
20
 }
15
 
21
 
16
 internal class ModePrefixMappingTest {
22
 internal class ModePrefixMappingTest {

Ładowanie…
Anuluj
Zapisz