mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
testing/quick: generate all possible int64, uint64 values
When generating a random int8, uint8, int16, uint16, int32, uint32, quick.Value chooses among all possible values. But when generating a random int64 or uint64, it only chooses values in the range [-2⁶², 2⁶²) (even for uint64). It should, like for all the other integers, use the full range. If it had, this would have caught #19807 earlier. Instead it let us discover the presence of #19809. While we are here, also make the default source of randomness not completely deterministic. Fixes #19808. Change-Id: I070f852531c92b3670bd76523326c9132bfc9416 Reviewed-on: https://go-review.googlesource.com/39152 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rob Pike <r@golang.org>
This commit is contained in:
parent
65c17a05e9
commit
719c7b03ba
3 changed files with 13 additions and 6 deletions
|
|
@ -14,6 +14,7 @@ import (
|
|||
"math/rand"
|
||||
"reflect"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var defaultMaxCount *int = flag.Int("quickchecks", 100, "The default number of iterations for each check")
|
||||
|
|
@ -43,8 +44,14 @@ func randFloat64(rand *rand.Rand) float64 {
|
|||
return f
|
||||
}
|
||||
|
||||
// randInt64 returns a random integer taking half the range of an int64.
|
||||
func randInt64(rand *rand.Rand) int64 { return rand.Int63() - 1<<62 }
|
||||
// randInt64 returns a random int64.
|
||||
func randInt64(rand *rand.Rand) int64 {
|
||||
x := rand.Int63() - 1<<62
|
||||
// x in [-2⁶²,2⁶²), so top two bits are 00 or 11, never 10 or 01.
|
||||
// Mix in some bits from the middle.
|
||||
x ^= x<<29 ^ x<<43
|
||||
return x
|
||||
}
|
||||
|
||||
// complexSize is the maximum length of arbitrary values that contain other
|
||||
// values.
|
||||
|
|
@ -193,7 +200,7 @@ var defaultConfig Config
|
|||
// getRand returns the *rand.Rand to use for a given Config.
|
||||
func (c *Config) getRand() *rand.Rand {
|
||||
if c.Rand == nil {
|
||||
return rand.New(rand.NewSource(0))
|
||||
return rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
}
|
||||
return c.Rand
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue