"strings"
)
-var defaultMaxCount *int = flag.Int("quickchecks", 100, "The default number of iterations for each check")
+var defaultMaxCount = flag.Int("quickchecks", 100, "The default number of iterations for each check")
// A Generator can generate random values of its own type.
type Generator interface {
case reflect.Uintptr:
v.SetUint(uint64(randInt64(rand)))
case reflect.Map:
- numElems := rand.Intn(size)
- v.Set(reflect.MakeMap(concrete))
- for i := 0; i < numElems; i++ {
- key, ok1 := sizedValue(concrete.Key(), rand, size)
- value, ok2 := sizedValue(concrete.Elem(), rand, size)
- if !ok1 || !ok2 {
- return reflect.Value{}, false
+ if generateNilValue(rand) {
+ v.Set(reflect.Zero(concrete)) // Generate nil map.
+ } else {
+ numElems := rand.Intn(size)
+ v.Set(reflect.MakeMap(concrete))
+ for i := 0; i < numElems; i++ {
+ key, ok1 := sizedValue(concrete.Key(), rand, size)
+ 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:
- if rand.Intn(size) == 0 {
+ if generateNilValue(rand) {
v.Set(reflect.Zero(concrete)) // Generate nil pointer.
} else {
elem, ok := sizedValue(concrete.Elem(), rand, size)
v.Elem().Set(elem)
}
case reflect.Slice:
- numElems := rand.Intn(size)
- sizeLeft := size - numElems
- v.Set(reflect.MakeSlice(concrete, numElems, numElems))
- for i := 0; i < numElems; i++ {
- elem, ok := sizedValue(concrete.Elem(), rand, sizeLeft)
- if !ok {
- return reflect.Value{}, false
+ if generateNilValue(rand) {
+ v.Set(reflect.Zero(concrete)) // Generate nil slice.
+ } else {
+ slCap := rand.Intn(size)
+ slLen := rand.Intn(slCap + 1)
+ sizeLeft := size - slCap
+ v.Set(reflect.MakeSlice(concrete, slLen, slCap))
+ 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:
for i := 0; i < v.Len(); i++ {
}
return strings.Join(s, ", ")
}
+
+func generateNilValue(r *rand.Rand) bool { return r.Intn(20) == 0 }