diff options
Diffstat (limited to '')
-rw-r--r-- | dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/regress_test.go | 490 |
1 files changed, 490 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/regress_test.go b/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/regress_test.go new file mode 100644 index 0000000..e3a8f6e --- /dev/null +++ b/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/rand/regress_test.go @@ -0,0 +1,490 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test that random number sequences generated by a specific seed +// do not change from version to version. +// +// If the generator changes, the golden outputs need updating, and +// client programs may break. Although the desire for compatibility +// is not as stringent as in the original math/rand package, +// when possible avoid changing the generator. + +package rand_test + +import ( + "flag" + "fmt" + "reflect" + "testing" + + . "golang.org/x/exp/rand" +) + +var printgolden = flag.Bool("printgolden", false, "print golden results for regression test") + +// TestSource verifies that the output of the default Source is locked down. +func TestSourceRegress(t *testing.T) { + src := NewSource(1) + var got [20]uint64 + for i := range got { + got[i] = src.Uint64() + } + want := [20]uint64{ + 0x34e936394905d167, + 0x817c0ef62fe4c731, + 0x937987e6e24f5a40, + 0x0c0a8307fe226199, + 0xf96363568d8bab56, + 0xbaef3af36bd02620, + 0x8f18e416eb6b936b, + 0x05a43fc149f3a67a, + 0xdab012eb3ce01697, + 0xf76c495a133c6aa9, + 0x304b24c5040ce457, + 0x47d77e0abb413159, + 0x52a810fa9e452f04, + 0x2d24b66380cf4780, + 0x5ec7691b92018ef5, + 0x5076dfa749261ea0, + 0xac8f11ad3941d213, + 0x13fa8d67de91db25, + 0xb50883a9893274eb, + 0xeb8f59263f9109ac, + } + if got != want { + t.Errorf("got:\n\t%#016x\nwant:\n\t%#016x", got, want) + if *printgolden { + for _, x := range got { + fmt.Printf("\t\t%#016x,\n", x) + } + } + } +} + +// TestRegress validates that the output stream is locked down, for instance so +// optimizations do not change the output. It iterates over methods of the +// Rand type to find functions to evaluate and checks the first 20 results +// against the golden results. +func TestRegress(t *testing.T) { + var int32s = []int32{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1} + 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} + 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} + var permSizes = []int{0, 1, 5, 8, 9, 10, 16} + var readBufferSizes = []int{1, 7, 8, 9, 10} + r := New(NewSource(0)) + + rv := reflect.ValueOf(r) + n := rv.NumMethod() + p := 0 + if *printgolden { + fmt.Printf("var regressGolden = []interface{}{\n") + } + for i := 0; i < n; i++ { + m := rv.Type().Method(i) + mv := rv.Method(i) + mt := mv.Type() + if mt.NumOut() == 0 { + continue + } + r.Seed(0) + if *printgolden && i > 0 { + fmt.Println() + } + for repeat := 0; repeat < 20; repeat++ { + var args []reflect.Value + var argstr string + if mt.NumIn() == 1 { + var x interface{} + switch mt.In(0).Kind() { + default: + t.Fatalf("unexpected argument type for r.%s", m.Name) + + case reflect.Int: + if m.Name == "Perm" { + x = permSizes[repeat%len(permSizes)] + break + } + big := int64s[repeat%len(int64s)] + if int64(int(big)) != big { + r.Int63n(big) // what would happen on 64-bit machine, to keep stream in sync + if *printgolden { + fmt.Printf("\tskipped, // must run printgolden on 64-bit machine\n") + } + p++ + continue + } + x = int(big) + + case reflect.Int32: + x = int32s[repeat%len(int32s)] + + case reflect.Int64: + x = int64s[repeat%len(int64s)] + + case reflect.Uint64: + x = uint64s[repeat%len(uint64s)] + + case reflect.Slice: + if m.Name == "Read" { + n := readBufferSizes[repeat%len(readBufferSizes)] + x = make([]byte, n) + } + } + argstr = fmt.Sprint(x) + args = append(args, reflect.ValueOf(x)) + } + + var out interface{} + out = mv.Call(args)[0].Interface() + if m.Name == "Int" || m.Name == "Intn" { + out = int64(out.(int)) + } + if m.Name == "Read" { + out = args[0].Interface().([]byte) + } + if *printgolden { + var val string + big := int64(1 << 60) + if int64(int(big)) != big && (m.Name == "Int" || m.Name == "Intn") { + // 32-bit machine cannot print 64-bit results + val = "truncated" + } else if reflect.TypeOf(out).Kind() == reflect.Slice { + val = fmt.Sprintf("%#v", out) + } else { + val = fmt.Sprintf("%T(%v)", out, out) + } + fmt.Printf("\t%s, // %s(%s)\n", val, m.Name, argstr) + } else { + want := regressGolden[p] + if m.Name == "Int" { + want = int64(int(uint(want.(int64)) << 1 >> 1)) + } + if !reflect.DeepEqual(out, want) { + t.Errorf("r.%s(%s) = %v, want %v", m.Name, argstr, out, want) + } + } + p++ + } + } + if *printgolden { + fmt.Printf("}\n") + } +} + +var regressGolden = []interface{}{ + float64(0.6279600685109523), // ExpFloat64() + float64(0.16198826513357806), // ExpFloat64() + float64(0.007880404652650552), // ExpFloat64() + float64(0.41649788761745654), // ExpFloat64() + float64(1.6958707787276301), // ExpFloat64() + float64(2.7227327706138036), // ExpFloat64() + float64(2.4235600263079657), // ExpFloat64() + float64(1.277967771105418), // ExpFloat64() + float64(0.7111660437031769), // ExpFloat64() + float64(0.23090401427981888), // ExpFloat64() + float64(1.4746763588379928), // ExpFloat64() + float64(1.4868726779832278), // ExpFloat64() + float64(0.1686257242078103), // ExpFloat64() + float64(0.2732721816228957), // ExpFloat64() + float64(0.4644536065869748), // ExpFloat64() + float64(0.01319850986379164), // ExpFloat64() + float64(0.7184492551742854), // ExpFloat64() + float64(0.1913536422195827), // ExpFloat64() + float64(0.16034475958495667), // ExpFloat64() + float64(0.40599859014785644), // ExpFloat64() + + float32(0.7979972), // Float32() + float32(0.7725961), // Float32() + float32(0.21894403), // Float32() + float32(0.96194494), // Float32() + float32(0.2915732), // Float32() + float32(0.59569645), // Float32() + float32(0.99596655), // Float32() + float32(0.4979039), // Float32() + float32(0.98148686), // Float32() + float32(0.01380035), // Float32() + float32(0.086487144), // Float32() + float32(0.6114401), // Float32() + float32(0.71081316), // Float32() + float32(0.6342346), // Float32() + float32(0.008082573), // Float32() + float32(0.33020085), // Float32() + float32(0.032625034), // Float32() + float32(0.9278005), // Float32() + float32(0.34497985), // Float32() + float32(0.66506875), // Float32() + + float64(0.797997151016231), // Float64() + float64(0.7725961454373316), // Float64() + float64(0.21894402538580782), // Float64() + float64(0.9619449481780457), // Float64() + float64(0.2915731877602916), // Float64() + float64(0.5956964580775652), // Float64() + float64(0.9959665347028619), // Float64() + float64(0.49790390966591147), // Float64() + float64(0.9814868602566785), // Float64() + float64(0.013800350332924483), // Float64() + float64(0.08648714463652596), // Float64() + float64(0.6114401479210267), // Float64() + float64(0.7108131531183706), // Float64() + float64(0.6342346133706837), // Float64() + float64(0.008082572853887138), // Float64() + float64(0.3302008651926287), // Float64() + float64(0.03262503454637655), // Float64() + float64(0.9278004634858956), // Float64() + float64(0.3449798628384906), // Float64() + float64(0.665068719316529), // Float64() + + int64(5474557666971700975), // Int() + int64(5591422465364813936), // Int() + int64(74029666500212977), // Int() + int64(8088122161323000979), // Int() + int64(7298457654139700474), // Int() + int64(1590632625527662686), // Int() + int64(9052198920789078554), // Int() + int64(7381380909356947872), // Int() + int64(1738222704626512495), // Int() + int64(3278744831230954970), // Int() + int64(7062423222661652521), // Int() + int64(6715870808026712034), // Int() + int64(528819992478005418), // Int() + int64(2284534088986354339), // Int() + int64(945828723091990082), // Int() + int64(3813019469742317492), // Int() + int64(1369388146907482806), // Int() + int64(7367238674766648970), // Int() + int64(8217673022687244206), // Int() + int64(3185531743396549562), // Int() + + int32(1711064216), // Int31() + int32(650927245), // Int31() + int32(8618187), // Int31() + int32(941581344), // Int31() + int32(1923394120), // Int31() + int32(1258915833), // Int31() + int32(1053814650), // Int31() + int32(859305834), // Int31() + int32(1276097579), // Int31() + int32(1455437958), // Int31() + int32(1895916096), // Int31() + int32(781830261), // Int31() + int32(61562749), // Int31() + int32(265954771), // Int31() + int32(1183850779), // Int31() + int32(443893888), // Int31() + int32(1233159585), // Int31() + int32(857659461), // Int31() + int32(956663049), // Int31() + int32(370844703), // Int31() + + int32(0), // Int31n(1) + int32(6), // Int31n(10) + int32(17), // Int31n(32) + int32(1000595), // Int31n(1048576) + int32(424333), // Int31n(1048577) + int32(382438494), // Int31n(1000000000) + int32(902738458), // Int31n(1073741824) + int32(1204933878), // Int31n(2147483646) + int32(1376191263), // Int31n(2147483647) + int32(0), // Int31n(1) + int32(9), // Int31n(10) + int32(2), // Int31n(32) + int32(440490), // Int31n(1048576) + int32(176312), // Int31n(1048577) + int32(946765890), // Int31n(1000000000) + int32(665034676), // Int31n(1073741824) + int32(1947285452), // Int31n(2147483646) + int32(1702344608), // Int31n(2147483647) + int32(0), // Int31n(1) + int32(2), // Int31n(10) + + int64(5474557666971700975), // Int63() + int64(5591422465364813936), // Int63() + int64(74029666500212977), // Int63() + int64(8088122161323000979), // Int63() + int64(7298457654139700474), // Int63() + int64(1590632625527662686), // Int63() + int64(9052198920789078554), // Int63() + int64(7381380909356947872), // Int63() + int64(1738222704626512495), // Int63() + int64(3278744831230954970), // Int63() + int64(7062423222661652521), // Int63() + int64(6715870808026712034), // Int63() + int64(528819992478005418), // Int63() + int64(2284534088986354339), // Int63() + int64(945828723091990082), // Int63() + int64(3813019469742317492), // Int63() + int64(1369388146907482806), // Int63() + int64(7367238674766648970), // Int63() + int64(8217673022687244206), // Int63() + int64(3185531743396549562), // Int63() + + int64(0), // Int63n(1) + int64(6), // Int63n(10) + int64(17), // Int63n(32) + int64(1000595), // Int63n(1048576) + int64(424333), // Int63n(1048577) + int64(382438494), // Int63n(1000000000) + int64(902738458), // Int63n(1073741824) + int64(1204933878), // Int63n(2147483646) + int64(1376191263), // Int63n(2147483647) + int64(502116868085730778), // Int63n(1000000000000000000) + int64(144894195020570665), // Int63n(1152921504606846976) + int64(6715870808026712034), // Int63n(9223372036854775806) + int64(528819992478005418), // Int63n(9223372036854775807) + int64(0), // Int63n(1) + int64(0), // Int63n(10) + int64(20), // Int63n(32) + int64(854710), // Int63n(1048576) + int64(649893), // Int63n(1048577) + int64(687244206), // Int63n(1000000000) + int64(836883386), // Int63n(1073741824) + + int64(0), // Intn(1) + int64(6), // Intn(10) + int64(17), // Intn(32) + int64(1000595), // Intn(1048576) + int64(424333), // Intn(1048577) + int64(382438494), // Intn(1000000000) + int64(902738458), // Intn(1073741824) + int64(1204933878), // Intn(2147483646) + int64(1376191263), // Intn(2147483647) + int64(502116868085730778), // Intn(1000000000000000000) + int64(144894195020570665), // Intn(1152921504606846976) + int64(6715870808026712034), // Intn(9223372036854775806) + int64(528819992478005418), // Intn(9223372036854775807) + int64(0), // Intn(1) + int64(0), // Intn(10) + int64(20), // Intn(32) + int64(854710), // Intn(1048576) + int64(649893), // Intn(1048577) + int64(687244206), // Intn(1000000000) + int64(836883386), // Intn(1073741824) + + float64(-0.5410658516792047), // NormFloat64() + float64(0.615296849055287), // NormFloat64() + float64(0.007477442280032887), // NormFloat64() + float64(1.3443892057169684), // NormFloat64() + float64(-0.17508902754863512), // NormFloat64() + float64(-2.03494397556937), // NormFloat64() + float64(2.5213558871972306), // NormFloat64() + float64(1.4572921639613627), // NormFloat64() + float64(-1.5164961164210644), // NormFloat64() + float64(-0.4861150771891445), // NormFloat64() + float64(-0.8699409548614199), // NormFloat64() + float64(1.6271559815452794), // NormFloat64() + float64(0.1659465769926195), // NormFloat64() + float64(0.2921716191987018), // NormFloat64() + float64(-1.2550269636927838), // NormFloat64() + float64(0.11257973349467548), // NormFloat64() + float64(0.5437525915836436), // NormFloat64() + float64(0.781754430770282), // NormFloat64() + float64(0.5201256313962235), // NormFloat64() + float64(1.3826174159276245), // NormFloat64() + + []int{}, // Perm(0) + []int{0}, // Perm(1) + []int{0, 2, 3, 1, 4}, // Perm(5) + []int{5, 6, 3, 7, 4, 2, 0, 1}, // Perm(8) + []int{8, 4, 5, 2, 7, 3, 0, 6, 1}, // Perm(9) + []int{6, 1, 5, 3, 2, 9, 7, 0, 8, 4}, // Perm(10) + []int{12, 5, 1, 9, 15, 7, 13, 6, 10, 11, 8, 0, 4, 2, 14, 3}, // Perm(16) + []int{}, // Perm(0) + []int{0}, // Perm(1) + []int{0, 2, 3, 4, 1}, // Perm(5) + []int{3, 2, 7, 4, 0, 6, 5, 1}, // Perm(8) + []int{0, 6, 2, 1, 3, 7, 5, 8, 4}, // Perm(9) + []int{2, 5, 6, 4, 7, 3, 0, 8, 1, 9}, // Perm(10) + []int{3, 6, 5, 4, 9, 15, 13, 7, 1, 11, 10, 8, 12, 0, 2, 14}, // Perm(16) + []int{}, // Perm(0) + []int{0}, // Perm(1) + []int{2, 4, 3, 1, 0}, // Perm(5) + []int{1, 6, 7, 5, 4, 3, 2, 0}, // Perm(8) + []int{7, 6, 8, 2, 0, 1, 3, 4, 5}, // Perm(9) + []int{2, 9, 7, 1, 5, 4, 0, 6, 8, 3}, // Perm(10) + + []byte{0xef}, // Read([0]) + []byte{0x4e, 0x3d, 0x52, 0x31, 0x89, 0xf9, 0xcb}, // Read([0 0 0 0 0 0 0]) + []byte{0x70, 0x68, 0x35, 0x8d, 0x1b, 0xb9, 0x98, 0x4d}, // Read([0 0 0 0 0 0 0 0]) + []byte{0xf1, 0xf8, 0x95, 0xe6, 0x96, 0x1, 0x7, 0x1, 0x93}, // Read([0 0 0 0 0 0 0 0 0]) + []byte{0x44, 0x9f, 0xc5, 0x40, 0xc8, 0x3e, 0x70, 0xfa, 0x44, 0x3a}, // Read([0 0 0 0 0 0 0 0 0 0]) + []byte{0x4b}, // Read([0]) + []byte{0x91, 0x54, 0x49, 0xe5, 0x5e, 0x28, 0xb9}, // Read([0 0 0 0 0 0 0]) + []byte{0x4, 0xf2, 0xf, 0x13, 0x96, 0x1a, 0xb2, 0xce}, // Read([0 0 0 0 0 0 0 0]) + []byte{0x35, 0xf5, 0xde, 0x9f, 0x7d, 0xa0, 0x19, 0x12, 0x2e}, // Read([0 0 0 0 0 0 0 0 0]) + []byte{0xd4, 0xee, 0x6f, 0x66, 0x6f, 0x32, 0xc8, 0x21, 0x57, 0x68}, // Read([0 0 0 0 0 0 0 0 0 0]) + []byte{0x1f}, // Read([0]) + []byte{0x98, 0xda, 0x4d, 0xab, 0x6e, 0xd, 0x71}, // Read([0 0 0 0 0 0 0]) + []byte{0x80, 0xad, 0x29, 0xa0, 0x37, 0xb0, 0x80, 0xc4}, // Read([0 0 0 0 0 0 0 0]) + []byte{0x2, 0xe2, 0xe2, 0x7, 0xd9, 0xed, 0xea, 0x90, 0x33}, // Read([0 0 0 0 0 0 0 0 0]) + []byte{0x5d, 0xaa, 0xb8, 0xc6, 0x39, 0xfb, 0xbe, 0x56, 0x7, 0xa3}, // Read([0 0 0 0 0 0 0 0 0 0]) + []byte{0x62}, // Read([0]) + []byte{0x4d, 0x63, 0xa6, 0x4b, 0xb4, 0x1f, 0x42}, // Read([0 0 0 0 0 0 0]) + []byte{0x66, 0x42, 0x62, 0x36, 0x42, 0x20, 0x8d, 0xb4}, // Read([0 0 0 0 0 0 0 0]) + []byte{0x9f, 0xa3, 0x67, 0x1, 0x91, 0xea, 0x34, 0xb6, 0xa}, // Read([0 0 0 0 0 0 0 0 0]) + []byte{0xd, 0xa8, 0x43, 0xb, 0x1, 0x93, 0x8a, 0x56, 0xfc, 0x98}, // Read([0 0 0 0 0 0 0 0 0 0]) + + uint32(3422128433), // Uint32() + uint32(1301854491), // Uint32() + uint32(17236374), // Uint32() + uint32(1883162688), // Uint32() + uint32(3846788241), // Uint32() + uint32(2517831666), // Uint32() + uint32(2107629301), // Uint32() + uint32(1718611668), // Uint32() + uint32(2552195159), // Uint32() + uint32(2910875917), // Uint32() + uint32(3791832192), // Uint32() + uint32(1563660522), // Uint32() + uint32(123125499), // Uint32() + uint32(531909542), // Uint32() + uint32(2367701558), // Uint32() + uint32(887787777), // Uint32() + uint32(2466319171), // Uint32() + uint32(1715318922), // Uint32() + uint32(1913326099), // Uint32() + uint32(741689406), // Uint32() + + uint64(14697929703826476783), // Uint64() + uint64(5591422465364813936), // Uint64() + uint64(74029666500212977), // Uint64() + uint64(8088122161323000979), // Uint64() + uint64(16521829690994476282), // Uint64() + uint64(10814004662382438494), // Uint64() + uint64(9052198920789078554), // Uint64() + uint64(7381380909356947872), // Uint64() + uint64(10961594741481288303), // Uint64() + uint64(12502116868085730778), // Uint64() + uint64(16285795259516428329), // Uint64() + uint64(6715870808026712034), // Uint64() + uint64(528819992478005418), // Uint64() + uint64(2284534088986354339), // Uint64() + uint64(10169200759946765890), // Uint64() + uint64(3813019469742317492), // Uint64() + uint64(10592760183762258614), // Uint64() + uint64(7367238674766648970), // Uint64() + uint64(8217673022687244206), // Uint64() + uint64(3185531743396549562), // Uint64() + + uint64(0), // Uint64n(1) + uint64(6), // Uint64n(10) + uint64(17), // Uint64n(32) + uint64(1000595), // Uint64n(1048576) + uint64(424333), // Uint64n(1048577) + uint64(382438494), // Uint64n(1000000000) + uint64(902738458), // Uint64n(1073741824) + uint64(1204933878), // Uint64n(2147483646) + uint64(1376191263), // Uint64n(2147483647) + uint64(502116868085730778), // Uint64n(1000000000000000000) + uint64(144894195020570665), // Uint64n(1152921504606846976) + uint64(6715870808026712034), // Uint64n(18446744073709551614) + uint64(528819992478005418), // Uint64n(18446744073709551615) + uint64(0), // Uint64n(1) + uint64(0), // Uint64n(10) + uint64(20), // Uint64n(32) + uint64(854710), // Uint64n(1048576) + uint64(649893), // Uint64n(1048577) + uint64(687244206), // Uint64n(1000000000) + uint64(836883386), // Uint64n(1073741824) +} |