GoPLS Viewer

Home|gopls/go/ssa/interp/testdata/deepequal.go
1// This interpreter test is designed to test the test copy of DeepEqual.
2//
3// Validate this file with 'go run' after editing.
4
5package main
6
7import "reflect"
8
9func assert(cond bool) {
10    if !cond {
11        panic("failed")
12    }
13}
14
15type X int
16type Y struct {
17    y *Y
18    z [3]int
19}
20
21var (
22    a = []int{0123}
23    b = []X{0123}
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{ye}
29    h *Y
30)
31
32func init() {
33    h = &Y{} // h->h
34    h.y = h
35}
36
37func main() {
38    assert(reflect.DeepEqual(nilnil))
39    assert(reflect.DeepEqual((*int)(nil), (*int)(nil)))
40    assert(!reflect.DeepEqual(nil, (*int)(nil)))
41
42    assert(reflect.DeepEqual(00))
43    assert(!reflect.DeepEqual(0int64(0)))
44
45    assert(!reflect.DeepEqual(""0))
46
47    assert(reflect.DeepEqual(a, []int{0123}))
48    assert(!reflect.DeepEqual(a, []int{012}))
49    assert(!reflect.DeepEqual(a, []int{0103}))
50
51    assert(reflect.DeepEqual(b, []X{0123}))
52    assert(!reflect.DeepEqual(b, []X{0103}))
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{000}}))
64    assert(!reflect.DeepEqual(e, &Y{z: [3]int{010}}))
65
66    assert(reflect.DeepEqual(f, (*Y)(nil)))
67    assert(!reflect.DeepEqual(fnil))
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(heq_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(hdeepeq_h))
78
79    distinct := []interface{}{abcdefgh}
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{ xy int }{01}, struct{ x int }{0}))
91    assert(reflect.DeepEqual(struct{ xy int }{23}, struct{ xy int }{23}))
92    assert(!reflect.DeepEqual(struct{ xy int }{45}, struct{ xy int }{46}))
93}
94
MembersX
X
Y
Y.z
main.BlockStmt.RangeStmt_2007.x
main.BlockStmt.RangeStmt_2007.BlockStmt.RangeStmt_2035.y
assert.cond
Y.y
h
main.BlockStmt.eq_h
main.BlockStmt.deepeq_h
main.BlockStmt.distinct
Members
X