Commit 670a5cda authored by Russ Cox's avatar Russ Cox

Revert "testing/quick: generate more map and slice states"

This reverts commit 0ccabe2e.

Change-Id: Ib1c230fb6801c0ee26f4a352b0c1130fa240a76a
Reviewed-on: https://go-review.googlesource.com/22860Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 131231b8
...@@ -14,7 +14,7 @@ import ( ...@@ -14,7 +14,7 @@ import (
"strings" "strings"
) )
var defaultMaxCount = flag.Int("quickchecks", 100, "The default number of iterations for each check") var defaultMaxCount *int = flag.Int("quickchecks", 100, "The default number of iterations for each check")
// A Generator can generate random values of its own type. // A Generator can generate random values of its own type.
type Generator interface { type Generator interface {
...@@ -98,22 +98,18 @@ func sizedValue(t reflect.Type, rand *rand.Rand, size int) (value reflect.Value, ...@@ -98,22 +98,18 @@ func sizedValue(t reflect.Type, rand *rand.Rand, size int) (value reflect.Value,
case reflect.Uintptr: case reflect.Uintptr:
v.SetUint(uint64(randInt64(rand))) v.SetUint(uint64(randInt64(rand)))
case reflect.Map: case reflect.Map:
if generateNilValue(rand) { numElems := rand.Intn(size)
v.Set(reflect.Zero(concrete)) // Generate nil map. v.Set(reflect.MakeMap(concrete))
} else { for i := 0; i < numElems; i++ {
numElems := rand.Intn(size) key, ok1 := sizedValue(concrete.Key(), rand, size)
v.Set(reflect.MakeMap(concrete)) value, ok2 := sizedValue(concrete.Elem(), rand, size)
for i := 0; i < numElems; i++ { if !ok1 || !ok2 {
key, ok1 := sizedValue(concrete.Key(), rand, size) return reflect.Value{}, false
value, ok2 := sizedValue(concrete.Elem(), rand, size)
if !ok1 || !ok2 {
return reflect.Value{}, false
}
v.SetMapIndex(key, value)
} }
v.SetMapIndex(key, value)
} }
case reflect.Ptr: case reflect.Ptr:
if generateNilValue(rand) { if rand.Intn(size) == 0 {
v.Set(reflect.Zero(concrete)) // Generate nil pointer. v.Set(reflect.Zero(concrete)) // Generate nil pointer.
} else { } else {
elem, ok := sizedValue(concrete.Elem(), rand, size) elem, ok := sizedValue(concrete.Elem(), rand, size)
...@@ -124,20 +120,15 @@ func sizedValue(t reflect.Type, rand *rand.Rand, size int) (value reflect.Value, ...@@ -124,20 +120,15 @@ func sizedValue(t reflect.Type, rand *rand.Rand, size int) (value reflect.Value,
v.Elem().Set(elem) v.Elem().Set(elem)
} }
case reflect.Slice: case reflect.Slice:
if generateNilValue(rand) { numElems := rand.Intn(size)
v.Set(reflect.Zero(concrete)) // Generate nil slice. sizeLeft := size - numElems
} else { v.Set(reflect.MakeSlice(concrete, numElems, numElems))
slCap := rand.Intn(size) for i := 0; i < numElems; i++ {
slLen := rand.Intn(slCap + 1) elem, ok := sizedValue(concrete.Elem(), rand, sizeLeft)
sizeLeft := size - slCap if !ok {
v.Set(reflect.MakeSlice(concrete, slLen, slCap)) return reflect.Value{}, false
for i := 0; i < slLen; i++ {
elem, ok := sizedValue(concrete.Elem(), rand, sizeLeft)
if !ok {
return reflect.Value{}, false
}
v.Index(i).Set(elem)
} }
v.Index(i).Set(elem)
} }
case reflect.Array: case reflect.Array:
for i := 0; i < v.Len(); i++ { for i := 0; i < v.Len(); i++ {
...@@ -385,5 +376,3 @@ func toString(interfaces []interface{}) string { ...@@ -385,5 +376,3 @@ func toString(interfaces []interface{}) string {
} }
return strings.Join(s, ", ") return strings.Join(s, ", ")
} }
func generateNilValue(r *rand.Rand) bool { return r.Intn(20) == 0 }
...@@ -290,3 +290,20 @@ func TestMutuallyRecursive(t *testing.T) { ...@@ -290,3 +290,20 @@ func TestMutuallyRecursive(t *testing.T) {
f := func(a A) bool { return true } f := func(a A) bool { return true }
Check(f, nil) Check(f, nil)
} }
// Some serialization formats (e.g. encoding/pem) cannot distinguish
// between a nil and an empty map or slice, so avoid generating the
// zero value for these.
func TestNonZeroSliceAndMap(t *testing.T) {
type Q struct {
M map[int]int
S []int
}
f := func(q Q) bool {
return q.M != nil && q.S != nil
}
err := Check(f, nil)
if err != nil {
t.Fatal(err)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment