@@ -3,12 +3,12 @@ package braintest
3
3
4
4
import (
5
5
"context"
6
- "maps"
7
6
"slices"
8
7
"strings"
9
8
"testing"
10
9
"time"
11
10
11
+ "github.com/google/go-cmp/cmp"
12
12
"github.com/zephyrtronium/robot/brain"
13
13
"github.com/zephyrtronium/robot/userhash"
14
14
)
@@ -111,15 +111,15 @@ func learn(ctx context.Context, t *testing.T, br brain.Learner) {
111
111
}
112
112
}
113
113
114
- func speak (ctx context.Context , t * testing.T , br brain.Speaker , tag , prompt string , iters int ) map [string ]bool {
114
+ func speak (ctx context.Context , t * testing.T , br brain.Speaker , tag , prompt string , iters int ) map [string ]struct {} {
115
115
t .Helper ()
116
- got := make (map [string ]bool , 5 )
116
+ got := make (map [string ]struct {}, 20 )
117
117
for range iters {
118
- s , err := brain .Speak (ctx , br , tag , prompt )
118
+ s , trace , err := brain .Speak (ctx , br , tag , prompt )
119
119
if err != nil {
120
120
t .Errorf ("couldn't speak: %v" , err )
121
121
}
122
- got [s ] = true
122
+ got [strings . Join ( trace , " " ) + "#" + s ] = struct {}{}
123
123
}
124
124
return got
125
125
}
@@ -128,33 +128,57 @@ func speak(ctx context.Context, t *testing.T, br brain.Speaker, tag, prompt stri
128
128
func testSpeak (ctx context.Context , br brain.Brain ) func (t * testing.T ) {
129
129
return func (t * testing.T ) {
130
130
learn (ctx , t , br )
131
- got := speak (ctx , t , br , "kessoku" , "" , 256 )
132
- want := map [string ]bool {
133
- "member bocchi" : true ,
134
- "member ryou" : true ,
135
- "member nijika" : true ,
136
- "member kita" : true ,
131
+ got := speak (ctx , t , br , "kessoku" , "" , 2048 )
132
+ want := map [string ]struct {}{
133
+ "1#member bocchi" : {},
134
+ "1 2#member bocchi" : {},
135
+ "1 3#member bocchi" : {},
136
+ "1 4#member bocchi" : {},
137
+ "1 2#member ryou" : {},
138
+ "2#member ryou" : {},
139
+ "2 3#member ryou" : {},
140
+ "2 4#member ryou" : {},
141
+ "1 3#member nijika" : {},
142
+ "2 3#member nijika" : {},
143
+ "3#member nijika" : {},
144
+ "3 4#member nijika" : {},
145
+ "1 4#member kita" : {},
146
+ "2 4#member kita" : {},
147
+ "3 4#member kita" : {},
148
+ "4#member kita" : {},
137
149
}
138
- if ! maps . Equal ( got , want ) {
139
- t .Errorf ("wrong spoken messages for kessoku: want %v, got %v " , want , got )
150
+ if diff := cmp . Diff ( want , got ); diff != "" {
151
+ t .Errorf ("wrong spoken messages for kessoku (+got/- want): \n %s " , diff )
140
152
}
141
- got = speak (ctx , t , br , "sickhack" , "" , 256 )
142
- want = map [string ]bool {
143
- "member bocchi" : true ,
144
- "member ryou" : true ,
145
- "member nijika" : true ,
146
- "member kita" : true ,
147
- "manager seika" : true ,
153
+ got = speak (ctx , t , br , "sickhack" , "" , 2048 )
154
+ want = map [string ]struct {}{
155
+ "5#member bocchi" : {},
156
+ "5 6#member bocchi" : {},
157
+ "5 7#member bocchi" : {},
158
+ "5 8#member bocchi" : {},
159
+ "5 6#member ryou" : {},
160
+ "6#member ryou" : {},
161
+ "6 7#member ryou" : {},
162
+ "6 8#member ryou" : {},
163
+ "5 7#member nijika" : {},
164
+ "6 7#member nijika" : {},
165
+ "7#member nijika" : {},
166
+ "7 8#member nijika" : {},
167
+ "5 8#member kita" : {},
168
+ "6 8#member kita" : {},
169
+ "7 8#member kita" : {},
170
+ "8#member kita" : {},
171
+ "9#manager seika" : {},
148
172
}
149
- if ! maps . Equal ( got , want ) {
150
- t .Errorf ("wrong spoken messages for sickhack: want %v, got %v " , want , got )
173
+ if diff := cmp . Diff ( want , got ); diff != "" {
174
+ t .Errorf ("wrong spoken messages for sickhack (+got/- want): \n %s " , diff )
151
175
}
152
176
got = speak (ctx , t , br , "sickhack" , "manager" , 32 )
153
- want = map [string ]bool {
154
- "manager seika" : true ,
177
+ want = map [string ]struct {} {
178
+ "9# manager seika" : {} ,
155
179
}
156
- if ! maps . Equal ( got , want ) {
157
- t .Errorf ("wrong prompted messages for sickhack: want %v, got %v " , want , got )
180
+ if diff := cmp . Diff ( want , got ); diff != "" {
181
+ t .Errorf ("wrong prompted messages for sickhack (+got/- want): \n %s " , diff )
158
182
}
159
183
}
160
184
}
@@ -167,16 +191,19 @@ func testForget(ctx context.Context, br brain.Brain) func(t *testing.T) {
167
191
t .Errorf ("couldn't forget: %v" , err )
168
192
}
169
193
for range 100 {
170
- s , err := brain .Speak (ctx , br , "kessoku" , "" )
194
+ s , trace , err := brain .Speak (ctx , br , "kessoku" , "" )
171
195
if err != nil {
172
196
t .Errorf ("couldn't speak: %v" , err )
173
197
}
174
198
if strings .Contains (s , "bocchi" ) {
175
199
t .Errorf ("remembered that which must be forgotten: %q" , s )
176
200
}
201
+ if trace [len (trace )- 1 ] == messages [0 ].ID {
202
+ t .Errorf ("id %q should have been forgotten but was used in %q" , messages [0 ].ID , trace )
203
+ }
177
204
}
178
205
for range 10000 {
179
- s , err := brain .Speak (ctx , br , "sickhack" , "" )
206
+ s , _ , err := brain .Speak (ctx , br , "sickhack" , "" )
180
207
if err != nil {
181
208
t .Errorf ("couldn't speak: %v" , err )
182
209
}
@@ -195,25 +222,46 @@ func testForgetMessage(ctx context.Context, br brain.Brain) func(t *testing.T) {
195
222
if err := br .ForgetMessage (ctx , "kessoku" , messages [0 ].ID ); err != nil {
196
223
t .Errorf ("failed to forget first message: %v" , err )
197
224
}
198
- got := speak (ctx , t , br , "kessoku" , "" , 256 )
199
- want := map [string ]bool {
200
- "member ryou" : true ,
201
- "member nijika" : true ,
202
- "member kita" : true ,
225
+ got := speak (ctx , t , br , "kessoku" , "" , 2048 )
226
+ want := map [string ]struct {}{
227
+ // The current brains should delete the "member" with ID 1, but we
228
+ // don't strictly require it.
229
+ // This should change anyway once we stop deleting by tuples.
230
+ "2#member ryou" : {},
231
+ "2 3#member ryou" : {},
232
+ "2 4#member ryou" : {},
233
+ "2 3#member nijika" : {},
234
+ "3#member nijika" : {},
235
+ "3 4#member nijika" : {},
236
+ "2 4#member kita" : {},
237
+ "3 4#member kita" : {},
238
+ "4#member kita" : {},
203
239
}
204
- if ! maps . Equal ( got , want ) {
205
- t .Errorf ("wrong messages after forgetting: want %v, got %v " , want , got )
240
+ if diff := cmp . Diff ( want , got ); diff != "" {
241
+ t .Errorf ("wrong messages after forgetting (+got/- want): \n %s " , diff )
206
242
}
207
- got = speak (ctx , t , br , "sickhack" , "" , 256 )
208
- want = map [string ]bool {
209
- "member bocchi" : true ,
210
- "member ryou" : true ,
211
- "member nijika" : true ,
212
- "member kita" : true ,
213
- "manager seika" : true ,
243
+ got = speak (ctx , t , br , "sickhack" , "" , 2048 )
244
+ want = map [string ]struct {}{
245
+ "5#member bocchi" : {},
246
+ "5 6#member bocchi" : {},
247
+ "5 7#member bocchi" : {},
248
+ "5 8#member bocchi" : {},
249
+ "5 6#member ryou" : {},
250
+ "6#member ryou" : {},
251
+ "6 7#member ryou" : {},
252
+ "6 8#member ryou" : {},
253
+ "5 7#member nijika" : {},
254
+ "6 7#member nijika" : {},
255
+ "7#member nijika" : {},
256
+ "7 8#member nijika" : {},
257
+ "5 8#member kita" : {},
258
+ "6 8#member kita" : {},
259
+ "7 8#member kita" : {},
260
+ "8#member kita" : {},
261
+ "9#manager seika" : {},
214
262
}
215
- if ! maps . Equal ( got , want ) {
216
- t .Errorf ("wrong messages in other tag after forgetting: want %v, got %v " , want , got )
263
+ if diff := cmp . Diff ( want , got ); diff != "" {
264
+ t .Errorf ("wrong messages in other tag after forgetting (+got/- want): \n %s " , diff )
217
265
}
218
266
}
219
267
}
@@ -225,24 +273,38 @@ func testForgetDuring(ctx context.Context, br brain.Brain) func(t *testing.T) {
225
273
if err := br .ForgetDuring (ctx , "kessoku" , time .Unix (1 , 0 ).Add (- time .Millisecond ), time .Unix (2 , 0 ).Add (time .Millisecond )); err != nil {
226
274
t .Errorf ("failed to forget: %v" , err )
227
275
}
228
- got := speak (ctx , t , br , "kessoku" , "" , 256 )
229
- want := map [string ]bool {
230
- "member bocchi" : true ,
231
- "member kita" : true ,
276
+ got := speak (ctx , t , br , "kessoku" , "" , 2048 )
277
+ want := map [string ]struct {}{
278
+ "1#member bocchi" : {},
279
+ "1 4#member bocchi" : {},
280
+ "1 4#member kita" : {},
281
+ "4#member kita" : {},
232
282
}
233
- if ! maps . Equal ( got , want ) {
234
- t .Errorf ("wrong messages after forgetting: want %v, got %v " , want , got )
283
+ if diff := cmp . Diff ( want , got ); diff != "" {
284
+ t .Errorf ("wrong messages after forgetting (+got/- want): \n %s " , diff )
235
285
}
236
- got = speak (ctx , t , br , "sickhack" , "" , 256 )
237
- want = map [string ]bool {
238
- "member bocchi" : true ,
239
- "member ryou" : true ,
240
- "member nijika" : true ,
241
- "member kita" : true ,
242
- "manager seika" : true ,
286
+ got = speak (ctx , t , br , "sickhack" , "" , 2048 )
287
+ want = map [string ]struct {}{
288
+ "5#member bocchi" : {},
289
+ "5 6#member bocchi" : {},
290
+ "5 7#member bocchi" : {},
291
+ "5 8#member bocchi" : {},
292
+ "5 6#member ryou" : {},
293
+ "6#member ryou" : {},
294
+ "6 7#member ryou" : {},
295
+ "6 8#member ryou" : {},
296
+ "5 7#member nijika" : {},
297
+ "6 7#member nijika" : {},
298
+ "7#member nijika" : {},
299
+ "7 8#member nijika" : {},
300
+ "5 8#member kita" : {},
301
+ "6 8#member kita" : {},
302
+ "7 8#member kita" : {},
303
+ "8#member kita" : {},
304
+ "9#manager seika" : {},
243
305
}
244
- if ! maps . Equal ( got , want ) {
245
- t .Errorf ("wrong spoken messages for sickhack: want %v, got %v " , want , got )
306
+ if diff := cmp . Diff ( want , got ); diff != "" {
307
+ t .Errorf ("wrong spoken messages for sickhack (+got/- want): \n %s " , diff )
246
308
}
247
309
}
248
310
}
@@ -278,7 +340,7 @@ func testCombinatoric(ctx context.Context, br brain.Brain) func(t *testing.T) {
278
340
}
279
341
}
280
342
allocs := testing .AllocsPerRun (10 , func () {
281
- _ , err := brain .Speak (ctx , br , "bocchi" , "" )
343
+ _ , _ , err := brain .Speak (ctx , br , "bocchi" , "" )
282
344
if err != nil {
283
345
t .Errorf ("couldn't speak: %v" , err )
284
346
}
0 commit comments