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		panic("bigalg")
25	}
26	if nil != NIL {
27		println("fail2: nil !=", NIL)
28		panic("bigalg")
29	}
30	if a == nil || nil == a {
31		println("fail3:", a, "== nil")
32		panic("bigalg")
33	}
34}
35
36func SameArray(a, b []int) bool {
37	if len(a) != len(b) || cap(a) != cap(b) {
38		return false
39	}
40	if len(a) > 0 && &a[0] != &b[0] {
41		return false
42	}
43	return true
44}
45
46var t = T{1.5, 123, "hello", 255}
47var mt = make(map[int]T)
48var ma = make(map[int][]int)
49
50func maptest() {
51	mt[0] = t
52	t1 := mt[0]
53	if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
54		println("fail: map val struct", t1.a, t1.b, t1.c, t1.d)
55		panic("bigalg")
56	}
57
58	ma[1] = a
59	a1 := ma[1]
60	if !SameArray(a, a1) {
61		println("fail: map val array", a, a1)
62		panic("bigalg")
63	}
64}
65
66var ct = make(chan T)
67var ca = make(chan []int)
68
69func send() {
70	ct <- t
71	ca <- a
72}
73
74func chantest() {
75	go send()
76
77	t1 := <-ct
78	if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
79		println("fail: map val struct", t1.a, t1.b, t1.c, t1.d)
80		panic("bigalg")
81	}
82
83	a1 := <-ca
84	if !SameArray(a, a1) {
85		println("fail: map val array", a, a1)
86		panic("bigalg")
87	}
88}
89
90type E struct{}
91
92var e E
93
94func interfacetest() {
95	var i interface{}
96
97	i = a
98	a1 := i.([]int)
99	if !SameArray(a, a1) {
100		println("interface <-> []int", a, a1)
101		panic("bigalg")
102	}
103	pa := new([]int)
104	*pa = a
105	i = pa
106	a1 = *i.(*[]int)
107	if !SameArray(a, a1) {
108		println("interface <-> *[]int", a, a1)
109		panic("bigalg")
110	}
111
112	i = t
113	t1 := i.(T)
114	if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
115		println("interface <-> struct", t1.a, t1.b, t1.c, t1.d)
116		panic("bigalg")
117	}
118
119	i = e
120	e1 := i.(E)
121	// nothing to check; just verify it doesn't crash
122	_ = e1
123}
124
125func main() {
126	arraycmptest()
127	maptest()
128	chantest()
129	interfacetest()
130}
131