You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ServerStateTest.kt 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.dmdirc.ktirc.model
  2. import com.dmdirc.ktirc.TestConstants
  3. import com.dmdirc.ktirc.events.EventMetadata
  4. import com.dmdirc.ktirc.events.IrcEvent
  5. import kotlinx.coroutines.channels.Channel
  6. import org.junit.jupiter.api.Assertions.*
  7. import org.junit.jupiter.api.Test
  8. internal class ServerStateTest {
  9. @Test
  10. fun `ServerState should use the initial nickname as local nickname`() {
  11. val serverState = ServerState("acidBurn", "")
  12. assertEquals("acidBurn", serverState.localNickname)
  13. }
  14. @Test
  15. fun `ServerState should use the initial name as server name`() {
  16. val serverState = ServerState("", "the.gibson")
  17. assertEquals("the.gibson", serverState.serverName)
  18. }
  19. @Test
  20. fun `ServerState should default status to disconnected`() {
  21. val serverState = ServerState("acidBurn", "")
  22. assertEquals(ServerStatus.Disconnected, serverState.status)
  23. }
  24. @Test
  25. fun `returns mode type for known channel mode`() {
  26. val serverState = ServerState("acidBurn", "")
  27. serverState.features[ServerFeature.ChannelModes] = arrayOf("ab", "cd", "ef", "gh")
  28. assertEquals(ChannelModeType.List, serverState.channelModeType('a'))
  29. assertEquals(ChannelModeType.SetUnsetParameter, serverState.channelModeType('d'))
  30. assertEquals(ChannelModeType.SetParameter, serverState.channelModeType('e'))
  31. assertEquals(ChannelModeType.NoParameter, serverState.channelModeType('g'))
  32. }
  33. @Test
  34. fun `returns whether a mode is a channel user mode or not`() {
  35. val serverState = ServerState("acidBurn", "")
  36. serverState.features[ServerFeature.ModePrefixes] = ModePrefixMapping("oqv", "@~+")
  37. assertTrue(serverState.isChannelUserMode('o'))
  38. assertTrue(serverState.isChannelUserMode('q'))
  39. assertTrue(serverState.isChannelUserMode('v'))
  40. assertFalse(serverState.isChannelUserMode('@'))
  41. assertFalse(serverState.isChannelUserMode('!'))
  42. assertFalse(serverState.isChannelUserMode('z'))
  43. }
  44. @Test
  45. fun `returns NoParameter for unknown channel mode`() {
  46. val serverState = ServerState("acidBurn", "")
  47. serverState.features[ServerFeature.ChannelModes] = arrayOf("ab", "cd", "ef", "gh")
  48. assertEquals(ChannelModeType.NoParameter, serverState.channelModeType('z'))
  49. }
  50. @Test
  51. fun `returns NoParameter for channel modes if feature doesn't exist`() {
  52. val serverState = ServerState("acidBurn", "")
  53. assertEquals(ChannelModeType.NoParameter, serverState.channelModeType('b'))
  54. }
  55. @Test
  56. fun `indicates labels are enabled when cap is present`() {
  57. val serverState = ServerState("acidBurn", "")
  58. serverState.capabilities.enabledCapabilities[Capability.LabeledResponse] = ""
  59. assertTrue(serverState.asyncResponseState.supportsLabeledResponses)
  60. }
  61. @Test
  62. fun `indicates labels are not enabled when cap is absent`() {
  63. val serverState = ServerState("acidBurn", "")
  64. assertFalse(serverState.asyncResponseState.supportsLabeledResponses)
  65. }
  66. @Test
  67. fun `reset clears all state`() = with(ServerState("acidBurn", "")) {
  68. receivedWelcome = true
  69. status = ServerStatus.Connecting
  70. localNickname = "acidBurn3"
  71. serverName = "root.the.gibson"
  72. features[ServerFeature.Network] = "gibson"
  73. capabilities.advertisedCapabilities["sasl"] = "sure"
  74. sasl.saslBuffer = "in progress"
  75. batches["batch"] = Batch("type", emptyList(), EventMetadata(TestConstants.time))
  76. asyncResponseState.labelCounter.set(100)
  77. asyncResponseState.pendingResponses["#thegibson"] = Pair<Channel<IrcEvent>, (IrcEvent) -> Boolean>(Channel(1)) { false }
  78. reset()
  79. assertFalse(receivedWelcome)
  80. assertEquals(ServerStatus.Disconnected, status)
  81. assertEquals("acidBurn", localNickname)
  82. assertEquals("", serverName)
  83. assertTrue(features.isEmpty())
  84. assertTrue(capabilities.advertisedCapabilities.isEmpty())
  85. assertEquals("", sasl.saslBuffer)
  86. assertTrue(batches.isEmpty())
  87. assertEquals(0, asyncResponseState.labelCounter.get())
  88. assertTrue(asyncResponseState.pendingResponses.isEmpty())
  89. }
  90. }
  91. internal class ModePrefixMappingTest {
  92. @Test
  93. fun `ModePrefixMapping identifies which chars are prefixes`() {
  94. val mapping = ModePrefixMapping("oav", "+@-")
  95. assertTrue(mapping.isPrefix('+'))
  96. assertTrue(mapping.isPrefix('@'))
  97. assertFalse(mapping.isPrefix('!'))
  98. assertFalse(mapping.isPrefix('o'))
  99. }
  100. @Test
  101. fun `ModePrefixMapping identifies which chars are modes`() {
  102. val mapping = ModePrefixMapping("oav", "+@-")
  103. assertFalse(mapping.isMode('+'))
  104. assertFalse(mapping.isMode('@'))
  105. assertFalse(mapping.isMode('!'))
  106. assertTrue(mapping.isMode('o'))
  107. }
  108. @Test
  109. fun `ModePrefixMapping maps prefixes to modes`() {
  110. val mapping = ModePrefixMapping("oav", "+@-")
  111. assertEquals('o', mapping.getMode('+'))
  112. assertEquals('a', mapping.getMode('@'))
  113. assertEquals('v', mapping.getMode('-'))
  114. }
  115. @Test
  116. fun `ModePrefixMapping maps prefix strings to modes`() {
  117. val mapping = ModePrefixMapping("oav", "+@-")
  118. assertEquals("oa", mapping.getModes("+@"))
  119. assertEquals("o", mapping.getModes("+"))
  120. assertEquals("", mapping.getModes(""))
  121. assertEquals("vao", mapping.getModes("-@+"))
  122. }
  123. }