1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package rand_test
16
17 import (
18 "flag"
19 "fmt"
20 "reflect"
21 "testing"
22
23 . "go.mongodb.org/mongo-driver/internal/rand"
24 )
25
26 var printgolden = flag.Bool("printgolden", false, "print golden results for regression test")
27
28
29 func TestSourceRegress(t *testing.T) {
30 src := NewSource(1)
31 var got [20]uint64
32 for i := range got {
33 got[i] = src.Uint64()
34 }
35 want := [20]uint64{
36 0x34e936394905d167,
37 0x817c0ef62fe4c731,
38 0x937987e6e24f5a40,
39 0x0c0a8307fe226199,
40 0xf96363568d8bab56,
41 0xbaef3af36bd02620,
42 0x8f18e416eb6b936b,
43 0x05a43fc149f3a67a,
44 0xdab012eb3ce01697,
45 0xf76c495a133c6aa9,
46 0x304b24c5040ce457,
47 0x47d77e0abb413159,
48 0x52a810fa9e452f04,
49 0x2d24b66380cf4780,
50 0x5ec7691b92018ef5,
51 0x5076dfa749261ea0,
52 0xac8f11ad3941d213,
53 0x13fa8d67de91db25,
54 0xb50883a9893274eb,
55 0xeb8f59263f9109ac,
56 }
57 if got != want {
58 t.Errorf("got:\n\t%#016x\nwant:\n\t%#016x", got, want)
59 if *printgolden {
60 for _, x := range got {
61 fmt.Printf("\t\t%#016x,\n", x)
62 }
63 }
64 }
65 }
66
67
68
69
70
71 func TestRegress(t *testing.T) {
72 var int32s = []int32{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1}
73 var int64s = []int64{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1, 1000000000000000000, 1 << 60, 1<<63 - 2, 1<<63 - 1}
74 var uint64s = []uint64{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1, 1000000000000000000, 1 << 60, 1<<64 - 2, 1<<64 - 1}
75 var permSizes = []int{0, 1, 5, 8, 9, 10, 16}
76 var readBufferSizes = []int{1, 7, 8, 9, 10}
77 r := New(NewSource(0))
78
79 rv := reflect.ValueOf(r)
80 n := rv.NumMethod()
81 p := 0
82 if *printgolden {
83 fmt.Printf("var regressGolden = []interface{}{\n")
84 }
85 for i := 0; i < n; i++ {
86 m := rv.Type().Method(i)
87 mv := rv.Method(i)
88 mt := mv.Type()
89 if mt.NumOut() == 0 {
90 continue
91 }
92 r.Seed(0)
93 if *printgolden && i > 0 {
94 fmt.Println()
95 }
96 for repeat := 0; repeat < 20; repeat++ {
97 var args []reflect.Value
98 var argstr string
99 if mt.NumIn() == 1 {
100 var x interface{}
101 switch mt.In(0).Kind() {
102 default:
103 t.Fatalf("unexpected argument type for r.%s", m.Name)
104
105 case reflect.Int:
106 if m.Name == "Perm" {
107 x = permSizes[repeat%len(permSizes)]
108 break
109 }
110 big := int64s[repeat%len(int64s)]
111 if int64(int(big)) != big {
112 r.Int63n(big)
113 if *printgolden {
114 fmt.Printf("\tskipped, // must run printgolden on 64-bit machine\n")
115 }
116 p++
117 continue
118 }
119 x = int(big)
120
121 case reflect.Int32:
122 x = int32s[repeat%len(int32s)]
123
124 case reflect.Int64:
125 x = int64s[repeat%len(int64s)]
126
127 case reflect.Uint64:
128 x = uint64s[repeat%len(uint64s)]
129
130 case reflect.Slice:
131 if m.Name == "Read" {
132 n := readBufferSizes[repeat%len(readBufferSizes)]
133 x = make([]byte, n)
134 }
135 }
136 argstr = fmt.Sprint(x)
137 args = append(args, reflect.ValueOf(x))
138 }
139
140 var out interface{}
141 out = mv.Call(args)[0].Interface()
142 if m.Name == "Int" || m.Name == "Intn" {
143 out = int64(out.(int))
144 }
145 if m.Name == "Read" {
146 out = args[0].Interface().([]byte)
147 }
148 if *printgolden {
149 var val string
150 big := int64(1 << 60)
151 if int64(int(big)) != big && (m.Name == "Int" || m.Name == "Intn") {
152
153 val = "truncated"
154 } else if reflect.TypeOf(out).Kind() == reflect.Slice {
155 val = fmt.Sprintf("%#v", out)
156 } else {
157 val = fmt.Sprintf("%T(%v)", out, out)
158 }
159 fmt.Printf("\t%s, // %s(%s)\n", val, m.Name, argstr)
160 } else {
161 want := regressGolden[p]
162 if m.Name == "Int" {
163 want = int64(int(uint(want.(int64)) << 1 >> 1))
164 }
165 if !reflect.DeepEqual(out, want) {
166 t.Errorf("r.%s(%s) = %v, want %v", m.Name, argstr, out, want)
167 }
168 }
169 p++
170 }
171 }
172 if *printgolden {
173 fmt.Printf("}\n")
174 }
175 }
176
177 var regressGolden = []interface{}{
178 float64(0.6279600685109523),
179 float64(0.16198826513357806),
180 float64(0.007880404652650552),
181 float64(0.41649788761745654),
182 float64(1.6958707787276301),
183 float64(2.7227327706138036),
184 float64(2.4235600263079657),
185 float64(1.277967771105418),
186 float64(0.7111660437031769),
187 float64(0.23090401427981888),
188 float64(1.4746763588379928),
189 float64(1.4868726779832278),
190 float64(0.1686257242078103),
191 float64(0.2732721816228957),
192 float64(0.4644536065869748),
193 float64(0.01319850986379164),
194 float64(0.7184492551742854),
195 float64(0.1913536422195827),
196 float64(0.16034475958495667),
197 float64(0.40599859014785644),
198
199 float32(0.7979972),
200 float32(0.7725961),
201 float32(0.21894403),
202 float32(0.96194494),
203 float32(0.2915732),
204 float32(0.59569645),
205 float32(0.99596655),
206 float32(0.4979039),
207 float32(0.98148686),
208 float32(0.01380035),
209 float32(0.086487144),
210 float32(0.6114401),
211 float32(0.71081316),
212 float32(0.6342346),
213 float32(0.008082573),
214 float32(0.33020085),
215 float32(0.032625034),
216 float32(0.9278005),
217 float32(0.34497985),
218 float32(0.66506875),
219
220 float64(0.797997151016231),
221 float64(0.7725961454373316),
222 float64(0.21894402538580782),
223 float64(0.9619449481780457),
224 float64(0.2915731877602916),
225 float64(0.5956964580775652),
226 float64(0.9959665347028619),
227 float64(0.49790390966591147),
228 float64(0.9814868602566785),
229 float64(0.013800350332924483),
230 float64(0.08648714463652596),
231 float64(0.6114401479210267),
232 float64(0.7108131531183706),
233 float64(0.6342346133706837),
234 float64(0.008082572853887138),
235 float64(0.3302008651926287),
236 float64(0.03262503454637655),
237 float64(0.9278004634858956),
238 float64(0.3449798628384906),
239 float64(0.665068719316529),
240
241 int64(5474557666971700975),
242 int64(5591422465364813936),
243 int64(74029666500212977),
244 int64(8088122161323000979),
245 int64(7298457654139700474),
246 int64(1590632625527662686),
247 int64(9052198920789078554),
248 int64(7381380909356947872),
249 int64(1738222704626512495),
250 int64(3278744831230954970),
251 int64(7062423222661652521),
252 int64(6715870808026712034),
253 int64(528819992478005418),
254 int64(2284534088986354339),
255 int64(945828723091990082),
256 int64(3813019469742317492),
257 int64(1369388146907482806),
258 int64(7367238674766648970),
259 int64(8217673022687244206),
260 int64(3185531743396549562),
261
262 int32(1711064216),
263 int32(650927245),
264 int32(8618187),
265 int32(941581344),
266 int32(1923394120),
267 int32(1258915833),
268 int32(1053814650),
269 int32(859305834),
270 int32(1276097579),
271 int32(1455437958),
272 int32(1895916096),
273 int32(781830261),
274 int32(61562749),
275 int32(265954771),
276 int32(1183850779),
277 int32(443893888),
278 int32(1233159585),
279 int32(857659461),
280 int32(956663049),
281 int32(370844703),
282
283 int32(0),
284 int32(6),
285 int32(17),
286 int32(1000595),
287 int32(424333),
288 int32(382438494),
289 int32(902738458),
290 int32(1204933878),
291 int32(1376191263),
292 int32(0),
293 int32(9),
294 int32(2),
295 int32(440490),
296 int32(176312),
297 int32(946765890),
298 int32(665034676),
299 int32(1947285452),
300 int32(1702344608),
301 int32(0),
302 int32(2),
303
304 int64(5474557666971700975),
305 int64(5591422465364813936),
306 int64(74029666500212977),
307 int64(8088122161323000979),
308 int64(7298457654139700474),
309 int64(1590632625527662686),
310 int64(9052198920789078554),
311 int64(7381380909356947872),
312 int64(1738222704626512495),
313 int64(3278744831230954970),
314 int64(7062423222661652521),
315 int64(6715870808026712034),
316 int64(528819992478005418),
317 int64(2284534088986354339),
318 int64(945828723091990082),
319 int64(3813019469742317492),
320 int64(1369388146907482806),
321 int64(7367238674766648970),
322 int64(8217673022687244206),
323 int64(3185531743396549562),
324
325 int64(0),
326 int64(6),
327 int64(17),
328 int64(1000595),
329 int64(424333),
330 int64(382438494),
331 int64(902738458),
332 int64(1204933878),
333 int64(1376191263),
334 int64(502116868085730778),
335 int64(144894195020570665),
336 int64(6715870808026712034),
337 int64(528819992478005418),
338 int64(0),
339 int64(0),
340 int64(20),
341 int64(854710),
342 int64(649893),
343 int64(687244206),
344 int64(836883386),
345
346 int64(0),
347 int64(6),
348 int64(17),
349 int64(1000595),
350 int64(424333),
351 int64(382438494),
352 int64(902738458),
353 int64(1204933878),
354 int64(1376191263),
355 int64(502116868085730778),
356 int64(144894195020570665),
357 int64(6715870808026712034),
358 int64(528819992478005418),
359 int64(0),
360 int64(0),
361 int64(20),
362 int64(854710),
363 int64(649893),
364 int64(687244206),
365 int64(836883386),
366
367 float64(-0.5410658516792047),
368 float64(0.615296849055287),
369 float64(0.007477442280032887),
370 float64(1.3443892057169684),
371 float64(-0.17508902754863512),
372 float64(-2.03494397556937),
373 float64(2.5213558871972306),
374 float64(1.4572921639613627),
375 float64(-1.5164961164210644),
376 float64(-0.4861150771891445),
377 float64(-0.8699409548614199),
378 float64(1.6271559815452794),
379 float64(0.1659465769926195),
380 float64(0.2921716191987018),
381 float64(-1.2550269636927838),
382 float64(0.11257973349467548),
383 float64(0.5437525915836436),
384 float64(0.781754430770282),
385 float64(0.5201256313962235),
386 float64(1.3826174159276245),
387
388 []int{},
389 []int{0},
390 []int{0, 2, 3, 1, 4},
391 []int{5, 6, 3, 7, 4, 2, 0, 1},
392 []int{8, 4, 5, 2, 7, 3, 0, 6, 1},
393 []int{6, 1, 5, 3, 2, 9, 7, 0, 8, 4},
394 []int{12, 5, 1, 9, 15, 7, 13, 6, 10, 11, 8, 0, 4, 2, 14, 3},
395 []int{},
396 []int{0},
397 []int{0, 2, 3, 4, 1},
398 []int{3, 2, 7, 4, 0, 6, 5, 1},
399 []int{0, 6, 2, 1, 3, 7, 5, 8, 4},
400 []int{2, 5, 6, 4, 7, 3, 0, 8, 1, 9},
401 []int{3, 6, 5, 4, 9, 15, 13, 7, 1, 11, 10, 8, 12, 0, 2, 14},
402 []int{},
403 []int{0},
404 []int{2, 4, 3, 1, 0},
405 []int{1, 6, 7, 5, 4, 3, 2, 0},
406 []int{7, 6, 8, 2, 0, 1, 3, 4, 5},
407 []int{2, 9, 7, 1, 5, 4, 0, 6, 8, 3},
408
409 []byte{0xef},
410 []byte{0x4e, 0x3d, 0x52, 0x31, 0x89, 0xf9, 0xcb},
411 []byte{0x70, 0x68, 0x35, 0x8d, 0x1b, 0xb9, 0x98, 0x4d},
412 []byte{0xf1, 0xf8, 0x95, 0xe6, 0x96, 0x1, 0x7, 0x1, 0x93},
413 []byte{0x44, 0x9f, 0xc5, 0x40, 0xc8, 0x3e, 0x70, 0xfa, 0x44, 0x3a},
414 []byte{0x4b},
415 []byte{0x91, 0x54, 0x49, 0xe5, 0x5e, 0x28, 0xb9},
416 []byte{0x4, 0xf2, 0xf, 0x13, 0x96, 0x1a, 0xb2, 0xce},
417 []byte{0x35, 0xf5, 0xde, 0x9f, 0x7d, 0xa0, 0x19, 0x12, 0x2e},
418 []byte{0xd4, 0xee, 0x6f, 0x66, 0x6f, 0x32, 0xc8, 0x21, 0x57, 0x68},
419 []byte{0x1f},
420 []byte{0x98, 0xda, 0x4d, 0xab, 0x6e, 0xd, 0x71},
421 []byte{0x80, 0xad, 0x29, 0xa0, 0x37, 0xb0, 0x80, 0xc4},
422 []byte{0x2, 0xe2, 0xe2, 0x7, 0xd9, 0xed, 0xea, 0x90, 0x33},
423 []byte{0x5d, 0xaa, 0xb8, 0xc6, 0x39, 0xfb, 0xbe, 0x56, 0x7, 0xa3},
424 []byte{0x62},
425 []byte{0x4d, 0x63, 0xa6, 0x4b, 0xb4, 0x1f, 0x42},
426 []byte{0x66, 0x42, 0x62, 0x36, 0x42, 0x20, 0x8d, 0xb4},
427 []byte{0x9f, 0xa3, 0x67, 0x1, 0x91, 0xea, 0x34, 0xb6, 0xa},
428 []byte{0xd, 0xa8, 0x43, 0xb, 0x1, 0x93, 0x8a, 0x56, 0xfc, 0x98},
429
430 uint32(3422128433),
431 uint32(1301854491),
432 uint32(17236374),
433 uint32(1883162688),
434 uint32(3846788241),
435 uint32(2517831666),
436 uint32(2107629301),
437 uint32(1718611668),
438 uint32(2552195159),
439 uint32(2910875917),
440 uint32(3791832192),
441 uint32(1563660522),
442 uint32(123125499),
443 uint32(531909542),
444 uint32(2367701558),
445 uint32(887787777),
446 uint32(2466319171),
447 uint32(1715318922),
448 uint32(1913326099),
449 uint32(741689406),
450
451 uint64(14697929703826476783),
452 uint64(5591422465364813936),
453 uint64(74029666500212977),
454 uint64(8088122161323000979),
455 uint64(16521829690994476282),
456 uint64(10814004662382438494),
457 uint64(9052198920789078554),
458 uint64(7381380909356947872),
459 uint64(10961594741481288303),
460 uint64(12502116868085730778),
461 uint64(16285795259516428329),
462 uint64(6715870808026712034),
463 uint64(528819992478005418),
464 uint64(2284534088986354339),
465 uint64(10169200759946765890),
466 uint64(3813019469742317492),
467 uint64(10592760183762258614),
468 uint64(7367238674766648970),
469 uint64(8217673022687244206),
470 uint64(3185531743396549562),
471
472 uint64(0),
473 uint64(6),
474 uint64(17),
475 uint64(1000595),
476 uint64(424333),
477 uint64(382438494),
478 uint64(902738458),
479 uint64(1204933878),
480 uint64(1376191263),
481 uint64(502116868085730778),
482 uint64(144894195020570665),
483 uint64(6715870808026712034),
484 uint64(528819992478005418),
485 uint64(0),
486 uint64(0),
487 uint64(20),
488 uint64(854710),
489 uint64(649893),
490 uint64(687244206),
491 uint64(836883386),
492 }
493
View as plain text