github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/go/ssa/interp/testdata/deepequal.go (about)

     1  // This interpreter test is designed to test the test copy of DeepEqual.
     2  //
     3  // Validate this file with 'go run' after editing.
     4  
     5  package main
     6  
     7  import "reflect"
     8  
     9  func assert(cond bool) {
    10  	if !cond {
    11  		panic("failed")
    12  	}
    13  }
    14  
    15  type X int
    16  type Y struct {
    17  	y *Y
    18  	z [3]int
    19  }
    20  
    21  var (
    22  	a = []int{0, 1, 2, 3}
    23  	b = []X{0, 1, 2, 3}
    24  	c = map[int]string{0: "zero", 1: "one"}
    25  	d = map[X]string{0: "zero", 1: "one"}
    26  	e = &Y{}
    27  	f = (*Y)(nil)
    28  	g = &Y{y: e}
    29  	h *Y
    30  )
    31  
    32  func init() {
    33  	h = &Y{} // h->h
    34  	h.y = h
    35  }
    36  
    37  func main() {
    38  	assert(reflect.DeepEqual(nil, nil))
    39  	assert(reflect.DeepEqual((*int)(nil), (*int)(nil)))
    40  	assert(!reflect.DeepEqual(nil, (*int)(nil)))
    41  
    42  	assert(reflect.DeepEqual(0, 0))
    43  	assert(!reflect.DeepEqual(0, int64(0)))
    44  
    45  	assert(!reflect.DeepEqual("", 0))
    46  
    47  	assert(reflect.DeepEqual(a, []int{0, 1, 2, 3}))
    48  	assert(!reflect.DeepEqual(a, []int{0, 1, 2}))
    49  	assert(!reflect.DeepEqual(a, []int{0, 1, 0, 3}))
    50  
    51  	assert(reflect.DeepEqual(b, []X{0, 1, 2, 3}))
    52  	assert(!reflect.DeepEqual(b, []X{0, 1, 0, 3}))
    53  
    54  	assert(reflect.DeepEqual(c, map[int]string{0: "zero", 1: "one"}))
    55  	assert(!reflect.DeepEqual(c, map[int]string{0: "zero", 1: "one", 2: "two"}))
    56  	assert(!reflect.DeepEqual(c, map[int]string{1: "one", 2: "two"}))
    57  	assert(!reflect.DeepEqual(c, map[int]string{1: "one"}))
    58  
    59  	assert(reflect.DeepEqual(d, map[X]string{0: "zero", 1: "one"}))
    60  	assert(!reflect.DeepEqual(d, map[int]string{0: "zero", 1: "one"}))
    61  
    62  	assert(reflect.DeepEqual(e, &Y{}))
    63  	assert(reflect.DeepEqual(e, &Y{z: [3]int{0, 0, 0}}))
    64  	assert(!reflect.DeepEqual(e, &Y{z: [3]int{0, 1, 0}}))
    65  
    66  	assert(reflect.DeepEqual(f, (*Y)(nil)))
    67  	assert(!reflect.DeepEqual(f, nil))
    68  
    69  	// eq_h -> eq_h. Pointer structure and elements are equal so DeepEqual.
    70  	eq_h := &Y{}
    71  	eq_h.y = eq_h
    72  	assert(reflect.DeepEqual(h, eq_h))
    73  
    74  	// deepeq_h->h->h. Pointed to elem of (deepeq_h, h) are (h,h). (h,h) are deep equal so h and deepeq_h are DeepEqual.
    75  	deepeq_h := &Y{}
    76  	deepeq_h.y = h
    77  	assert(reflect.DeepEqual(h, deepeq_h))
    78  
    79  	distinct := []interface{}{a, b, c, d, e, f, g, h}
    80  	for x := range distinct {
    81  		for y := range distinct {
    82  			assert((x == y) == reflect.DeepEqual(distinct[x], distinct[y]))
    83  		}
    84  	}
    85  
    86  	// anonymous struct types.
    87  	assert(reflect.DeepEqual(struct{}{}, struct{}{}))
    88  	assert(reflect.DeepEqual(struct{ x int }{1}, struct{ x int }{1}))
    89  	assert(!reflect.DeepEqual(struct{ x int }{}, struct{ x int }{5}))
    90  	assert(!reflect.DeepEqual(struct{ x, y int }{0, 1}, struct{ x int }{0}))
    91  	assert(reflect.DeepEqual(struct{ x, y int }{2, 3}, struct{ x, y int }{2, 3}))
    92  	assert(!reflect.DeepEqual(struct{ x, y int }{4, 5}, struct{ x, y int }{4, 6}))
    93  }