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.0KB

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