1// run
2
3// Copyright 2009 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Test the internal "algorithms" for objects larger than a word: hashing, equality etc.
8
9package main
10
11type T struct {
12	a float64
13	b int64
14	c string
15	d byte
16}
17
18var a = []int{ 1, 2, 3 }
19var NIL []int
20
21func arraycmptest() {
22	if NIL != nil {
23		println("fail1:", NIL, "!= nil")
24	}
25	if nil != NIL {
26		println("fail2: nil !=", NIL)
27	}
28	if a == nil || nil == a {
29		println("fail3:", a, "== nil")
30	}
31}
32
33func SameArray(a, b []int) bool {
34	if len(a) != len(b) || cap(a) != cap(b) {
35		return false
36	}
37	if len(a) > 0 && &a[0] != &b[0] {
38		return false
39	}
40	return true
41}
42
43var t = T{1.5, 123, "hello", 255}
44var mt = make(map[int]T)
45var ma = make(map[int][]int)
46
47func maptest() {
48	mt[0] = t
49	t1 := mt[0]
50	if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
51		println("fail: map val struct", t1.a, t1.b, t1.c, t1.d)
52	}
53
54	ma[1] = a
55	a1 := ma[1]
56	if !SameArray(a, a1) {
57		println("fail: map val array", a, a1)
58	}
59}
60
61var ct = make(chan T)
62var ca = make(chan []int)
63
64func send() {
65	ct <- t
66	ca <- a
67}
68
69func chantest() {
70	go send()
71
72	t1 := <-ct
73	if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
74		println("fail: map val struct", t1.a, t1.b, t1.c, t1.d)
75	}
76
77	a1 := <-ca
78	if !SameArray(a, a1) {
79		println("fail: map val array", a, a1)
80	}
81}
82
83type E struct { }
84var e E
85
86func interfacetest() {
87	var i interface{}
88
89	i = a
90	a1 := i.([]int)
91	if !SameArray(a, a1) {
92		println("interface <-> []int", a, a1)
93	}
94	pa := new([]int)
95	*pa = a
96	i = pa
97	a1 = *i.(*[]int)
98	if !SameArray(a, a1) {
99		println("interface <-> *[]int", a, a1)
100	}
101
102	i = t
103	t1 := i.(T)
104	if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
105		println("interface <-> struct", t1.a, t1.b, t1.c, t1.d)
106	}
107
108	i = e
109	e1 := i.(E)
110	// nothing to check; just verify it doesn't crash
111	_ = e1
112}
113
114func main() {
115	arraycmptest()
116	maptest()
117	chantest()
118	interfacetest()
119}
120