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 6.7KB

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