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.

modes_test.go 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // Copyright (c) 2018 Shivaram Lingamneni
  2. // released under the MIT license
  3. package modes
  4. import (
  5. "reflect"
  6. "strings"
  7. "testing"
  8. )
  9. func assertEqual(supplied, expected interface{}, t *testing.T) {
  10. if !reflect.DeepEqual(supplied, expected) {
  11. t.Errorf("expected %v but got %v", expected, supplied)
  12. }
  13. }
  14. func TestIssue874(t *testing.T) {
  15. emptyUnknown := make(map[rune]bool)
  16. modes, unknown := ParseChannelModeChanges("+k")
  17. assertEqual(unknown, emptyUnknown, t)
  18. assertEqual(modes, ModeChanges{}, t)
  19. modes, unknown = ParseChannelModeChanges("+k", "beer")
  20. assertEqual(unknown, emptyUnknown, t)
  21. assertEqual(modes, ModeChanges{ModeChange{Op: Add, Mode: Key, Arg: "beer"}}, t)
  22. modes, unknown = ParseChannelModeChanges("-k")
  23. assertEqual(unknown, emptyUnknown, t)
  24. assertEqual(modes, ModeChanges{ModeChange{Op: Remove, Mode: Key, Arg: "*"}}, t)
  25. modes, unknown = ParseChannelModeChanges("-k", "beer")
  26. assertEqual(unknown, emptyUnknown, t)
  27. assertEqual(modes, ModeChanges{ModeChange{Op: Remove, Mode: Key, Arg: "*"}}, t)
  28. modes, unknown = ParseChannelModeChanges("+kb", "beer")
  29. assertEqual(unknown, emptyUnknown, t)
  30. assertEqual(modes, ModeChanges{
  31. ModeChange{Op: Add, Mode: Key, Arg: "beer"},
  32. ModeChange{Op: List, Mode: BanMask, Arg: ""},
  33. }, t)
  34. modes, unknown = ParseChannelModeChanges("-kb", "beer")
  35. assertEqual(unknown, emptyUnknown, t)
  36. assertEqual(modes, ModeChanges{
  37. ModeChange{Op: Remove, Mode: Key, Arg: "*"},
  38. ModeChange{Op: List, Mode: BanMask, Arg: ""},
  39. }, t)
  40. // "beer" is the ban arg, +k with no arg should be ignored
  41. modes, unknown = ParseChannelModeChanges("+bk", "beer")
  42. assertEqual(unknown, emptyUnknown, t)
  43. assertEqual(modes, ModeChanges{
  44. ModeChange{Op: Add, Mode: BanMask, Arg: "beer"},
  45. }, t)
  46. // "beer" is the ban arg again
  47. modes, unknown = ParseChannelModeChanges("-bk", "beer")
  48. assertEqual(unknown, emptyUnknown, t)
  49. assertEqual(modes, ModeChanges{
  50. ModeChange{Op: Remove, Mode: BanMask, Arg: "beer"},
  51. ModeChange{Op: Remove, Mode: Key, Arg: "*"},
  52. }, t)
  53. modes, unknown = ParseChannelModeChanges("+bk", "shivaram", "beer")
  54. assertEqual(unknown, emptyUnknown, t)
  55. assertEqual(modes, ModeChanges{
  56. ModeChange{Op: Add, Mode: BanMask, Arg: "shivaram"},
  57. ModeChange{Op: Add, Mode: Key, Arg: "beer"},
  58. }, t)
  59. modes, unknown = ParseChannelModeChanges("+kb", "beer", "shivaram")
  60. assertEqual(unknown, emptyUnknown, t)
  61. assertEqual(modes, ModeChanges{
  62. ModeChange{Op: Add, Mode: Key, Arg: "beer"},
  63. ModeChange{Op: Add, Mode: BanMask, Arg: "shivaram"},
  64. }, t)
  65. modes, unknown = ParseChannelModeChanges("-bk", "shivaram", "beer")
  66. assertEqual(unknown, emptyUnknown, t)
  67. assertEqual(modes, ModeChanges{
  68. ModeChange{Op: Remove, Mode: BanMask, Arg: "shivaram"},
  69. ModeChange{Op: Remove, Mode: Key, Arg: "*"},
  70. }, t)
  71. modes, unknown = ParseChannelModeChanges("-kb", "beer", "shivaram")
  72. assertEqual(unknown, emptyUnknown, t)
  73. assertEqual(modes, ModeChanges{
  74. ModeChange{Op: Remove, Mode: Key, Arg: "*"},
  75. ModeChange{Op: Remove, Mode: BanMask, Arg: "shivaram"},
  76. }, t)
  77. }
  78. func TestParseChannelModeChanges(t *testing.T) {
  79. modes, unknown := ParseChannelModeChanges("+h", "wrmsr")
  80. if len(unknown) > 0 {
  81. t.Errorf("unexpected unknown mode change: %v", unknown)
  82. }
  83. expected := ModeChange{
  84. Op: Add,
  85. Mode: Halfop,
  86. Arg: "wrmsr",
  87. }
  88. if len(modes) != 1 || modes[0] != expected {
  89. t.Errorf("unexpected mode change: %v", modes)
  90. }
  91. modes, unknown = ParseChannelModeChanges("-v", "shivaram")
  92. if len(unknown) > 0 {
  93. t.Errorf("unexpected unknown mode change: %v", unknown)
  94. }
  95. expected = ModeChange{
  96. Op: Remove,
  97. Mode: Voice,
  98. Arg: "shivaram",
  99. }
  100. if len(modes) != 1 || modes[0] != expected {
  101. t.Errorf("unexpected mode change: %v", modes)
  102. }
  103. modes, unknown = ParseChannelModeChanges("+tx")
  104. if len(unknown) != 1 || !unknown['x'] {
  105. t.Errorf("expected that x is an unknown mode, instead: %v", unknown)
  106. }
  107. expected = ModeChange{
  108. Op: Add,
  109. Mode: OpOnlyTopic,
  110. Arg: "",
  111. }
  112. if len(modes) != 1 || modes[0] != expected {
  113. t.Errorf("unexpected mode change: %v", modes)
  114. }
  115. modes, unknown = ParseChannelModeChanges("+b")
  116. if len(unknown) > 0 {
  117. t.Errorf("unexpected unknown mode change: %v", unknown)
  118. }
  119. // +b with no argument becomes a list operation
  120. expectedChanges := ModeChanges{{
  121. Op: List,
  122. Mode: BanMask,
  123. }}
  124. if !reflect.DeepEqual(modes, expectedChanges) {
  125. t.Errorf("unexpected mode change: %v instead of %v", modes, expectedChanges)
  126. }
  127. }
  128. func TestSetMode(t *testing.T) {
  129. set := NewModeSet()
  130. if applied := set.SetMode(Invisible, false); applied != false {
  131. t.Errorf("all modes should be false by default")
  132. }
  133. if applied := set.SetMode(Invisible, true); applied != true {
  134. t.Errorf("initial SetMode call should return true")
  135. }
  136. set.SetMode(Operator, true)
  137. if applied := set.SetMode(Invisible, true); applied != false {
  138. t.Errorf("redundant SetMode call should return false")
  139. }
  140. expected1 := []Mode{Invisible, Operator}
  141. expected2 := []Mode{Operator, Invisible}
  142. if allModes := set.AllModes(); !(reflect.DeepEqual(allModes, expected1) || reflect.DeepEqual(allModes, expected2)) {
  143. t.Errorf("unexpected AllModes value: %v", allModes)
  144. }
  145. if modeString := set.String(); !(modeString == "io" || modeString == "oi") {
  146. t.Errorf("unexpected modestring: %s", modeString)
  147. }
  148. }
  149. func TestModeString(t *testing.T) {
  150. set := NewModeSet()
  151. set.SetMode('A', true)
  152. set.SetMode('z', true)
  153. if modeString := set.String(); !(modeString == "Az" || modeString == "Za") {
  154. t.Errorf("unexpected modestring: %s", modeString)
  155. }
  156. }
  157. func TestNilReceivers(t *testing.T) {
  158. set := NewModeSet()
  159. set = nil
  160. if set.HasMode(Invisible) {
  161. t.Errorf("nil ModeSet should not have any modes")
  162. }
  163. str := set.String()
  164. if str != "" {
  165. t.Errorf("nil Modeset should have empty String(), got %v instead", str)
  166. }
  167. }
  168. func TestHighestChannelUserMode(t *testing.T) {
  169. set := NewModeSet()
  170. if set.HighestChannelUserMode() != Mode(0) {
  171. t.Errorf("no channel user modes should be present yet")
  172. }
  173. set.SetMode(Voice, true)
  174. if set.HighestChannelUserMode() != Voice {
  175. t.Errorf("should see that user is voiced")
  176. }
  177. set.SetMode(ChannelAdmin, true)
  178. if set.HighestChannelUserMode() != ChannelAdmin {
  179. t.Errorf("should see that user has channel admin")
  180. }
  181. set = nil
  182. if set.HighestChannelUserMode() != Mode(0) {
  183. t.Errorf("nil modeset should have the zero mode as highest channel-user mode")
  184. }
  185. }
  186. func TestChanmodesToken(t *testing.T) {
  187. tok := ChanmodesToken()
  188. for _, mode := range SupportedChannelModes {
  189. if strings.IndexRune(tok, rune(mode)) == -1 {
  190. t.Errorf("+%s not included in ChanmodesToken()", mode)
  191. }
  192. }
  193. }
  194. func TestModeChangesString(t *testing.T) {
  195. m := ModeChanges{
  196. ModeChange{Op: Add, Mode: RegisteredOnly},
  197. ModeChange{Op: Add, Mode: Key, Arg: "beer"},
  198. ModeChange{Op: Add, Mode: BanMask, Arg: "shivaram"},
  199. }
  200. assertEqual(m.Strings(), []string{"+Rkb", "beer", "shivaram"}, t)
  201. m = ModeChanges{
  202. ModeChange{Op: Add, Mode: RegisteredOnly},
  203. ModeChange{Op: Remove, Mode: Key, Arg: "beer"},
  204. ModeChange{Op: Add, Mode: BanMask, Arg: "shivaram"},
  205. }
  206. assertEqual(m.Strings(), []string{"+R-k+b", "beer", "shivaram"}, t)
  207. }
  208. func BenchmarkModeString(b *testing.B) {
  209. set := NewModeSet()
  210. set.SetMode('A', true)
  211. set.SetMode('N', true)
  212. set.SetMode('b', true)
  213. set.SetMode('i', true)
  214. set.SetMode('x', true)
  215. b.ResetTimer()
  216. for i := 0; i < b.N; i++ {
  217. _ = set.String()
  218. }
  219. }