@@ -0,0 +1,421 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package cmdparse
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import (
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "strings"
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "testing"
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func testRouter() *CommandRouter {
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := NewRouter("scroll")
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Register(Command{
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Name: "replay",
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Usage: "replay #channel [last=N]",
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Description: "replay channel history",
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Handler: func(ctx *Context, args string) string {
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "replaying: " + args
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Register(Command{
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Name: "status",
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Usage: "status",
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Description: "show bot status",
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Handler: func(ctx *Context, args string) string {
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "ok"
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return r
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // --- DM input form ---
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestDM_BasicCommand(t *testing.T) {
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", "replay #general last=10")
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Target != "alice" {
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("target = %q, want %q", reply.Target, "alice")
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "replaying: #general last=10" {
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "replaying: #general last=10")
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestDM_CaseInsensitive(t *testing.T) {
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", "REPLAY #general")
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "replaying: #general" {
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "replaying: #general")
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestDM_NoArgs(t *testing.T) {
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", "status")
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "ok" {
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "ok")
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestDM_EmptyMessage(t *testing.T) {
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", "")
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply != nil {
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected nil for empty message, got %+v", reply)
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestDM_WhitespaceOnly(t *testing.T) {
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", " ")
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply != nil {
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected nil for whitespace-only, got %+v", reply)
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestDM_ContextFields(t *testing.T) {
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := NewRouter("testbot")
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var gotCtx *Context
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Register(Command{
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Name: "ping",
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Usage: "ping",
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Description: "ping",
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Handler: func(ctx *Context, args string) string {
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ gotCtx = ctx
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "pong"
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Dispatch("bob", "testbot", "ping")
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if gotCtx == nil {
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("handler not called")
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !gotCtx.IsDM {
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Error("expected IsDM=true")
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if gotCtx.Channel != "" {
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("channel = %q, want empty", gotCtx.Channel)
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if gotCtx.Nick != "bob" {
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("nick = %q, want %q", gotCtx.Nick, "bob")
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // --- Fantasy input form ---
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestFantasy_BasicCommand(t *testing.T) {
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "!replay #logs last=20")
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Target != "#general" {
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("target = %q, want %q", reply.Target, "#general")
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "replaying: #logs last=20" {
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "replaying: #logs last=20")
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestFantasy_CaseInsensitive(t *testing.T) {
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "!STATUS")
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "ok" {
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "ok")
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestFantasy_ContextFields(t *testing.T) {
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := NewRouter("testbot")
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var gotCtx *Context
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Register(Command{
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Name: "ping",
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Usage: "ping",
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Description: "ping",
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Handler: func(ctx *Context, args string) string {
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ gotCtx = ctx
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "pong"
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Dispatch("bob", "#dev", "!ping")
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if gotCtx == nil {
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("handler not called")
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if gotCtx.IsDM {
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Error("expected IsDM=false")
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if gotCtx.Channel != "#dev" {
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("channel = %q, want %q", gotCtx.Channel, "#dev")
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestFantasy_BangOnly(t *testing.T) {
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "!")
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply != nil {
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected nil for bare !, got %+v", reply)
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestFantasy_NotAddressed(t *testing.T) {
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "just a normal message")
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply != nil {
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected nil for unaddressed channel message, got %+v", reply)
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // --- Addressed input form ---
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestAddressed_ColonSpace(t *testing.T) {
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "scroll: replay #logs")
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Target != "#general" {
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("target = %q, want %q", reply.Target, "#general")
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "replaying: #logs" {
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "replaying: #logs")
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestAddressed_ColonNoSpace(t *testing.T) {
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "scroll:replay #logs")
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "replaying: #logs" {
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "replaying: #logs")
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestAddressed_Comma(t *testing.T) {
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "scroll, status")
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "ok" {
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "ok")
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestAddressed_CaseInsensitiveBotNick(t *testing.T) {
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "Scroll: status")
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "ok" {
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "ok")
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestAddressed_ContextFields(t *testing.T) {
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := NewRouter("testbot")
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var gotCtx *Context
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Register(Command{
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Name: "ping",
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Usage: "ping",
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Description: "ping",
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Handler: func(ctx *Context, args string) string {
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ gotCtx = ctx
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "pong"
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Dispatch("bob", "#ops", "testbot: ping")
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if gotCtx == nil {
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("handler not called")
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if gotCtx.IsDM {
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Error("expected IsDM=false")
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if gotCtx.Channel != "#ops" {
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("channel = %q, want %q", gotCtx.Channel, "#ops")
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // --- HELP generation ---
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestHelp_DM(t *testing.T) {
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", "help")
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Target != "alice" {
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("target = %q, want %q", reply.Target, "alice")
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "REPLAY") {
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("help should list REPLAY, got: %s", reply.Text)
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "STATUS") {
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("help should list STATUS, got: %s", reply.Text)
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "commands for scroll") {
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("help should include bot name, got: %s", reply.Text)
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestHelp_Fantasy(t *testing.T) {
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "!help")
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Target != "#general" {
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("target = %q, want %q", reply.Target, "#general")
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "REPLAY") {
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("help should list REPLAY, got: %s", reply.Text)
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestHelp_Addressed(t *testing.T) {
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "scroll: help")
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Target != "#general" {
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("target = %q, want %q", reply.Target, "#general")
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestHelp_SpecificCommand(t *testing.T) {
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", "help replay")
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "replay channel history") {
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("help replay should show description, got: %s", reply.Text)
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "replay #channel [last=N]") {
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("help replay should show usage, got: %s", reply.Text)
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestHelp_SpecificCommandCaseInsensitive(t *testing.T) {
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", "HELP REPLAY")
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "replay channel history") {
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected description, got: %s", reply.Text)
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestHelp_UnknownCommand(t *testing.T) {
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", "help nosuchcmd")
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "unknown command") {
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected unknown command message, got: %s", reply.Text)
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // --- Unknown command handling ---
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestUnknown_DM(t *testing.T) {
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", "frobnicate something")
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, `unknown command "frobnicate"`) {
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected unknown command message, got: %s", reply.Text)
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "REPLAY") {
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("should list available commands, got: %s", reply.Text)
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, "STATUS") {
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("should list available commands, got: %s", reply.Text)
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestUnknown_Fantasy(t *testing.T) {
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "!frobnicate")
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Target != "#general" {
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("target = %q, want %q", reply.Target, "#general")
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, `unknown command "frobnicate"`) {
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected unknown command message, got: %s", reply.Text)
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestUnknown_Addressed(t *testing.T) {
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "#general", "scroll: frobnicate")
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if !strings.Contains(reply.Text, `unknown command "frobnicate"`) {
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected unknown command message, got: %s", reply.Text)
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // --- Edge cases ---
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestRegister_EmptyNamePanics(t *testing.T) {
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := NewRouter("bot")
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ defer func() {
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if r := recover(); r == nil {
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Error("expected panic for empty command name")
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }()
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Register(Command{Name: "", Handler: func(*Context, string) string { return "" }})
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestRegister_DuplicatePanics(t *testing.T) {
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := NewRouter("bot")
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Register(Command{Name: "ping", Handler: func(*Context, string) string { return "" }})
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ defer func() {
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if r := recover(); r == nil {
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Error("expected panic for duplicate command")
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }()
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Register(Command{Name: "ping", Handler: func(*Context, string) string { return "" }})
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestHandlerReturnsEmpty(t *testing.T) {
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := NewRouter("bot")
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r.Register(Command{
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Name: "quiet",
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Handler: func(*Context, string) string { return "" },
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "bot", "quiet")
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply != nil {
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("expected nil reply for empty handler return, got %+v", reply)
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func TestLeadingTrailingWhitespace(t *testing.T) {
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r := testRouter()
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reply := r.Dispatch("alice", "scroll", " status ")
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply == nil {
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Fatal("expected reply, got nil")
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if reply.Text != "ok" {
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ t.Errorf("text = %q, want %q", reply.Text, "ok")
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }