Source file src/testing/quick/quick_test.go

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package quick
     6  
     7  import (
     8  	"math/rand"
     9  	"reflect"
    10  	"testing"
    11  )
    12  
    13  func fArray(a [4]byte) [4]byte { return a }
    14  
    15  type TestArrayAlias [4]byte
    16  
    17  func fArrayAlias(a TestArrayAlias) TestArrayAlias { return a }
    18  
    19  func fBool(a bool) bool { return a }
    20  
    21  type TestBoolAlias bool
    22  
    23  func fBoolAlias(a TestBoolAlias) TestBoolAlias { return a }
    24  
    25  func fFloat32(a float32) float32 { return a }
    26  
    27  type TestFloat32Alias float32
    28  
    29  func fFloat32Alias(a TestFloat32Alias) TestFloat32Alias { return a }
    30  
    31  func fFloat64(a float64) float64 { return a }
    32  
    33  type TestFloat64Alias float64
    34  
    35  func fFloat64Alias(a TestFloat64Alias) TestFloat64Alias { return a }
    36  
    37  func fComplex64(a complex64) complex64 { return a }
    38  
    39  type TestComplex64Alias complex64
    40  
    41  func fComplex64Alias(a TestComplex64Alias) TestComplex64Alias { return a }
    42  
    43  func fComplex128(a complex128) complex128 { return a }
    44  
    45  type TestComplex128Alias complex128
    46  
    47  func fComplex128Alias(a TestComplex128Alias) TestComplex128Alias { return a }
    48  
    49  func fInt16(a int16) int16 { return a }
    50  
    51  type TestInt16Alias int16
    52  
    53  func fInt16Alias(a TestInt16Alias) TestInt16Alias { return a }
    54  
    55  func fInt32(a int32) int32 { return a }
    56  
    57  type TestInt32Alias int32
    58  
    59  func fInt32Alias(a TestInt32Alias) TestInt32Alias { return a }
    60  
    61  func fInt64(a int64) int64 { return a }
    62  
    63  type TestInt64Alias int64
    64  
    65  func fInt64Alias(a TestInt64Alias) TestInt64Alias { return a }
    66  
    67  func fInt8(a int8) int8 { return a }
    68  
    69  type TestInt8Alias int8
    70  
    71  func fInt8Alias(a TestInt8Alias) TestInt8Alias { return a }
    72  
    73  func fInt(a int) int { return a }
    74  
    75  type TestIntAlias int
    76  
    77  func fIntAlias(a TestIntAlias) TestIntAlias { return a }
    78  
    79  func fMap(a map[int]int) map[int]int { return a }
    80  
    81  type TestMapAlias map[int]int
    82  
    83  func fMapAlias(a TestMapAlias) TestMapAlias { return a }
    84  
    85  func fPtr(a *int) *int {
    86  	if a == nil {
    87  		return nil
    88  	}
    89  	b := *a
    90  	return &b
    91  }
    92  
    93  type TestPtrAlias *int
    94  
    95  func fPtrAlias(a TestPtrAlias) TestPtrAlias { return a }
    96  
    97  func fSlice(a []byte) []byte { return a }
    98  
    99  type TestSliceAlias []byte
   100  
   101  func fSliceAlias(a TestSliceAlias) TestSliceAlias { return a }
   102  
   103  func fString(a string) string { return a }
   104  
   105  type TestStringAlias string
   106  
   107  func fStringAlias(a TestStringAlias) TestStringAlias { return a }
   108  
   109  type TestStruct struct {
   110  	A int
   111  	B string
   112  }
   113  
   114  func fStruct(a TestStruct) TestStruct { return a }
   115  
   116  type TestStructAlias TestStruct
   117  
   118  func fStructAlias(a TestStructAlias) TestStructAlias { return a }
   119  
   120  func fUint16(a uint16) uint16 { return a }
   121  
   122  type TestUint16Alias uint16
   123  
   124  func fUint16Alias(a TestUint16Alias) TestUint16Alias { return a }
   125  
   126  func fUint32(a uint32) uint32 { return a }
   127  
   128  type TestUint32Alias uint32
   129  
   130  func fUint32Alias(a TestUint32Alias) TestUint32Alias { return a }
   131  
   132  func fUint64(a uint64) uint64 { return a }
   133  
   134  type TestUint64Alias uint64
   135  
   136  func fUint64Alias(a TestUint64Alias) TestUint64Alias { return a }
   137  
   138  func fUint8(a uint8) uint8 { return a }
   139  
   140  type TestUint8Alias uint8
   141  
   142  func fUint8Alias(a TestUint8Alias) TestUint8Alias { return a }
   143  
   144  func fUint(a uint) uint { return a }
   145  
   146  type TestUintAlias uint
   147  
   148  func fUintAlias(a TestUintAlias) TestUintAlias { return a }
   149  
   150  func fUintptr(a uintptr) uintptr { return a }
   151  
   152  type TestUintptrAlias uintptr
   153  
   154  func fUintptrAlias(a TestUintptrAlias) TestUintptrAlias { return a }
   155  
   156  func reportError(property string, err error, t *testing.T) {
   157  	if err != nil {
   158  		t.Errorf("%s: %s", property, err)
   159  	}
   160  }
   161  
   162  func TestCheckEqual(t *testing.T) {
   163  	reportError("fArray", CheckEqual(fArray, fArray, nil), t)
   164  	reportError("fArrayAlias", CheckEqual(fArrayAlias, fArrayAlias, nil), t)
   165  	reportError("fBool", CheckEqual(fBool, fBool, nil), t)
   166  	reportError("fBoolAlias", CheckEqual(fBoolAlias, fBoolAlias, nil), t)
   167  	reportError("fFloat32", CheckEqual(fFloat32, fFloat32, nil), t)
   168  	reportError("fFloat32Alias", CheckEqual(fFloat32Alias, fFloat32Alias, nil), t)
   169  	reportError("fFloat64", CheckEqual(fFloat64, fFloat64, nil), t)
   170  	reportError("fFloat64Alias", CheckEqual(fFloat64Alias, fFloat64Alias, nil), t)
   171  	reportError("fComplex64", CheckEqual(fComplex64, fComplex64, nil), t)
   172  	reportError("fComplex64Alias", CheckEqual(fComplex64Alias, fComplex64Alias, nil), t)
   173  	reportError("fComplex128", CheckEqual(fComplex128, fComplex128, nil), t)
   174  	reportError("fComplex128Alias", CheckEqual(fComplex128Alias, fComplex128Alias, nil), t)
   175  	reportError("fInt16", CheckEqual(fInt16, fInt16, nil), t)
   176  	reportError("fInt16Alias", CheckEqual(fInt16Alias, fInt16Alias, nil), t)
   177  	reportError("fInt32", CheckEqual(fInt32, fInt32, nil), t)
   178  	reportError("fInt32Alias", CheckEqual(fInt32Alias, fInt32Alias, nil), t)
   179  	reportError("fInt64", CheckEqual(fInt64, fInt64, nil), t)
   180  	reportError("fInt64Alias", CheckEqual(fInt64Alias, fInt64Alias, nil), t)
   181  	reportError("fInt8", CheckEqual(fInt8, fInt8, nil), t)
   182  	reportError("fInt8Alias", CheckEqual(fInt8Alias, fInt8Alias, nil), t)
   183  	reportError("fInt", CheckEqual(fInt, fInt, nil), t)
   184  	reportError("fIntAlias", CheckEqual(fIntAlias, fIntAlias, nil), t)
   185  	reportError("fInt32", CheckEqual(fInt32, fInt32, nil), t)
   186  	reportError("fInt32Alias", CheckEqual(fInt32Alias, fInt32Alias, nil), t)
   187  	reportError("fMap", CheckEqual(fMap, fMap, nil), t)
   188  	reportError("fMapAlias", CheckEqual(fMapAlias, fMapAlias, nil), t)
   189  	reportError("fPtr", CheckEqual(fPtr, fPtr, nil), t)
   190  	reportError("fPtrAlias", CheckEqual(fPtrAlias, fPtrAlias, nil), t)
   191  	reportError("fSlice", CheckEqual(fSlice, fSlice, nil), t)
   192  	reportError("fSliceAlias", CheckEqual(fSliceAlias, fSliceAlias, nil), t)
   193  	reportError("fString", CheckEqual(fString, fString, nil), t)
   194  	reportError("fStringAlias", CheckEqual(fStringAlias, fStringAlias, nil), t)
   195  	reportError("fStruct", CheckEqual(fStruct, fStruct, nil), t)
   196  	reportError("fStructAlias", CheckEqual(fStructAlias, fStructAlias, nil), t)
   197  	reportError("fUint16", CheckEqual(fUint16, fUint16, nil), t)
   198  	reportError("fUint16Alias", CheckEqual(fUint16Alias, fUint16Alias, nil), t)
   199  	reportError("fUint32", CheckEqual(fUint32, fUint32, nil), t)
   200  	reportError("fUint32Alias", CheckEqual(fUint32Alias, fUint32Alias, nil), t)
   201  	reportError("fUint64", CheckEqual(fUint64, fUint64, nil), t)
   202  	reportError("fUint64Alias", CheckEqual(fUint64Alias, fUint64Alias, nil), t)
   203  	reportError("fUint8", CheckEqual(fUint8, fUint8, nil), t)
   204  	reportError("fUint8Alias", CheckEqual(fUint8Alias, fUint8Alias, nil), t)
   205  	reportError("fUint", CheckEqual(fUint, fUint, nil), t)
   206  	reportError("fUintAlias", CheckEqual(fUintAlias, fUintAlias, nil), t)
   207  	reportError("fUintptr", CheckEqual(fUintptr, fUintptr, nil), t)
   208  	reportError("fUintptrAlias", CheckEqual(fUintptrAlias, fUintptrAlias, nil), t)
   209  }
   210  
   211  // This tests that ArbitraryValue is working by checking that all the arbitrary
   212  // values of type MyStruct have x = 42.
   213  type myStruct struct {
   214  	x int
   215  }
   216  
   217  func (m myStruct) Generate(r *rand.Rand, _ int) reflect.Value {
   218  	return reflect.ValueOf(myStruct{x: 42})
   219  }
   220  
   221  func myStructProperty(in myStruct) bool { return in.x == 42 }
   222  
   223  func TestCheckProperty(t *testing.T) {
   224  	reportError("myStructProperty", Check(myStructProperty, nil), t)
   225  }
   226  
   227  func TestFailure(t *testing.T) {
   228  	f := func(x int) bool { return false }
   229  	err := Check(f, nil)
   230  	if err == nil {
   231  		t.Errorf("Check didn't return an error")
   232  	}
   233  	if _, ok := err.(*CheckError); !ok {
   234  		t.Errorf("Error was not a CheckError: %s", err)
   235  	}
   236  
   237  	err = CheckEqual(fUint, fUint32, nil)
   238  	if err == nil {
   239  		t.Errorf("#1 CheckEqual didn't return an error")
   240  	}
   241  	if _, ok := err.(SetupError); !ok {
   242  		t.Errorf("#1 Error was not a SetupError: %s", err)
   243  	}
   244  
   245  	err = CheckEqual(func(x, y int) {}, func(x int) {}, nil)
   246  	if err == nil {
   247  		t.Errorf("#2 CheckEqual didn't return an error")
   248  	}
   249  	if _, ok := err.(SetupError); !ok {
   250  		t.Errorf("#2 Error was not a SetupError: %s", err)
   251  	}
   252  
   253  	err = CheckEqual(func(x int) int { return 0 }, func(x int) int32 { return 0 }, nil)
   254  	if err == nil {
   255  		t.Errorf("#3 CheckEqual didn't return an error")
   256  	}
   257  	if _, ok := err.(SetupError); !ok {
   258  		t.Errorf("#3 Error was not a SetupError: %s", err)
   259  	}
   260  }
   261  
   262  // Recursive data structures didn't terminate.
   263  // Issues 8818 and 11148.
   264  func TestRecursive(t *testing.T) {
   265  	type R struct {
   266  		Ptr      *R
   267  		SliceP   []*R
   268  		Slice    []R
   269  		Map      map[int]R
   270  		MapP     map[int]*R
   271  		MapR     map[*R]*R
   272  		SliceMap []map[int]R
   273  	}
   274  
   275  	f := func(r R) bool { return true }
   276  	Check(f, nil)
   277  }
   278  
   279  func TestEmptyStruct(t *testing.T) {
   280  	f := func(struct{}) bool { return true }
   281  	Check(f, nil)
   282  }
   283  
   284  type (
   285  	A struct{ B *B }
   286  	B struct{ A *A }
   287  )
   288  
   289  func TestMutuallyRecursive(t *testing.T) {
   290  	f := func(a A) bool { return true }
   291  	Check(f, nil)
   292  }
   293  
   294  // Some serialization formats (e.g. encoding/pem) cannot distinguish
   295  // between a nil and an empty map or slice, so avoid generating the
   296  // zero value for these.
   297  func TestNonZeroSliceAndMap(t *testing.T) {
   298  	type Q struct {
   299  		M map[int]int
   300  		S []int
   301  	}
   302  	f := func(q Q) bool {
   303  		return q.M != nil && q.S != nil
   304  	}
   305  	err := Check(f, nil)
   306  	if err != nil {
   307  		t.Fatal(err)
   308  	}
   309  }
   310  
   311  func TestInt64(t *testing.T) {
   312  	var lo, hi int64
   313  	f := func(x int64) bool {
   314  		if x < lo {
   315  			lo = x
   316  		}
   317  		if x > hi {
   318  			hi = x
   319  		}
   320  		return true
   321  	}
   322  	cfg := &Config{MaxCount: 10000}
   323  	Check(f, cfg)
   324  	if uint64(lo)>>62 == 0 || uint64(hi)>>62 == 0 {
   325  		t.Errorf("int64 returned range %#016x,%#016x; does not look like full range", lo, hi)
   326  	}
   327  }
   328  

View as plain text