blob: 60e822942e2826367093350db4346f6556224c34 [file] [log] [blame]
Russ Cox0b477ef2012-02-16 23:48:57 -05001// run
Russ Coxeee50ae2008-12-19 12:05:22 -08002
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
Rob Pikefc0dc042012-02-19 13:19:43 +11007// Test the internal "algorithms" for objects larger than a word: hashing, equality etc.
8
Russ Coxeee50ae2008-12-19 12:05:22 -08009package main
10
Russ Cox839a6842009-01-20 14:40:40 -080011type T struct {
Rob Pike4f61fc92010-09-04 10:36:13 +100012 a float64
13 b int64
14 c string
15 d byte
Russ Coxeee50ae2008-12-19 12:05:22 -080016}
17
Alan Donovan052c9422013-02-12 13:17:49 -050018var a = []int{1, 2, 3}
Rob Pike4f61fc92010-09-04 10:36:13 +100019var NIL []int
Russ Coxeee50ae2008-12-19 12:05:22 -080020
21func arraycmptest() {
Russ Coxeee50ae2008-12-19 12:05:22 -080022 if NIL != nil {
Rob Pike4f61fc92010-09-04 10:36:13 +100023 println("fail1:", NIL, "!= nil")
Alan Donovan052c9422013-02-12 13:17:49 -050024 panic("bigalg")
Russ Coxeee50ae2008-12-19 12:05:22 -080025 }
26 if nil != NIL {
Rob Pike4f61fc92010-09-04 10:36:13 +100027 println("fail2: nil !=", NIL)
Alan Donovan052c9422013-02-12 13:17:49 -050028 panic("bigalg")
Russ Coxeee50ae2008-12-19 12:05:22 -080029 }
30 if a == nil || nil == a {
Rob Pike4f61fc92010-09-04 10:36:13 +100031 println("fail3:", a, "== nil")
Alan Donovan052c9422013-02-12 13:17:49 -050032 panic("bigalg")
Russ Coxeee50ae2008-12-19 12:05:22 -080033 }
Russ Coxc3077f72008-12-19 17:11:54 -080034}
35
Russ Cox839a6842009-01-20 14:40:40 -080036func SameArray(a, b []int) bool {
Russ Coxc3077f72008-12-19 17:11:54 -080037 if len(a) != len(b) || cap(a) != cap(b) {
Rob Pike4f61fc92010-09-04 10:36:13 +100038 return false
Russ Coxeee50ae2008-12-19 12:05:22 -080039 }
Russ Coxc3077f72008-12-19 17:11:54 -080040 if len(a) > 0 && &a[0] != &b[0] {
Rob Pike4f61fc92010-09-04 10:36:13 +100041 return false
Russ Coxeee50ae2008-12-19 12:05:22 -080042 }
Rob Pike4f61fc92010-09-04 10:36:13 +100043 return true
Russ Coxeee50ae2008-12-19 12:05:22 -080044}
45
Russ Coxbe2edb52009-03-03 08:39:12 -080046var t = T{1.5, 123, "hello", 255}
Russ Cox55645042009-01-06 15:19:02 -080047var mt = make(map[int]T)
48var ma = make(map[int][]int)
Russ Coxeee50ae2008-12-19 12:05:22 -080049
50func maptest() {
Rob Pike4f61fc92010-09-04 10:36:13 +100051 mt[0] = t
52 t1 := mt[0]
Russ Coxeee50ae2008-12-19 12:05:22 -080053 if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
Rob Pike4f61fc92010-09-04 10:36:13 +100054 println("fail: map val struct", t1.a, t1.b, t1.c, t1.d)
Alan Donovan052c9422013-02-12 13:17:49 -050055 panic("bigalg")
Russ Coxeee50ae2008-12-19 12:05:22 -080056 }
57
Rob Pike4f61fc92010-09-04 10:36:13 +100058 ma[1] = a
59 a1 := ma[1]
Russ Coxc3077f72008-12-19 17:11:54 -080060 if !SameArray(a, a1) {
Rob Pike4f61fc92010-09-04 10:36:13 +100061 println("fail: map val array", a, a1)
Alan Donovan052c9422013-02-12 13:17:49 -050062 panic("bigalg")
Russ Coxeee50ae2008-12-19 12:05:22 -080063 }
64}
65
Russ Cox55645042009-01-06 15:19:02 -080066var ct = make(chan T)
67var ca = make(chan []int)
Russ Coxeee50ae2008-12-19 12:05:22 -080068
69func send() {
Rob Pike4f61fc92010-09-04 10:36:13 +100070 ct <- t
71 ca <- a
Russ Coxeee50ae2008-12-19 12:05:22 -080072}
73
74func chantest() {
Rob Pike4f61fc92010-09-04 10:36:13 +100075 go send()
Russ Coxeee50ae2008-12-19 12:05:22 -080076
Rob Pike4f61fc92010-09-04 10:36:13 +100077 t1 := <-ct
Russ Coxeee50ae2008-12-19 12:05:22 -080078 if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
Rob Pike4f61fc92010-09-04 10:36:13 +100079 println("fail: map val struct", t1.a, t1.b, t1.c, t1.d)
Alan Donovan052c9422013-02-12 13:17:49 -050080 panic("bigalg")
Russ Coxeee50ae2008-12-19 12:05:22 -080081 }
82
Rob Pike4f61fc92010-09-04 10:36:13 +100083 a1 := <-ca
Russ Coxc3077f72008-12-19 17:11:54 -080084 if !SameArray(a, a1) {
Rob Pike4f61fc92010-09-04 10:36:13 +100085 println("fail: map val array", a, a1)
Alan Donovan052c9422013-02-12 13:17:49 -050086 panic("bigalg")
Russ Coxeee50ae2008-12-19 12:05:22 -080087 }
88}
89
Alan Donovan052c9422013-02-12 13:17:49 -050090type E struct{}
91
Russ Coxc3077f72008-12-19 17:11:54 -080092var e E
93
94func interfacetest() {
Rob Pike4f61fc92010-09-04 10:36:13 +100095 var i interface{}
Russ Coxc3077f72008-12-19 17:11:54 -080096
Rob Pike4f61fc92010-09-04 10:36:13 +100097 i = a
98 a1 := i.([]int)
Russ Coxc3077f72008-12-19 17:11:54 -080099 if !SameArray(a, a1) {
Rob Pike4f61fc92010-09-04 10:36:13 +1000100 println("interface <-> []int", a, a1)
Alan Donovan052c9422013-02-12 13:17:49 -0500101 panic("bigalg")
Russ Coxc3077f72008-12-19 17:11:54 -0800102 }
Rob Pike4f61fc92010-09-04 10:36:13 +1000103 pa := new([]int)
104 *pa = a
105 i = pa
106 a1 = *i.(*[]int)
Russ Coxc3077f72008-12-19 17:11:54 -0800107 if !SameArray(a, a1) {
Rob Pike4f61fc92010-09-04 10:36:13 +1000108 println("interface <-> *[]int", a, a1)
Alan Donovan052c9422013-02-12 13:17:49 -0500109 panic("bigalg")
Russ Coxc3077f72008-12-19 17:11:54 -0800110 }
111
Rob Pike4f61fc92010-09-04 10:36:13 +1000112 i = t
113 t1 := i.(T)
Russ Coxc3077f72008-12-19 17:11:54 -0800114 if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
Rob Pike4f61fc92010-09-04 10:36:13 +1000115 println("interface <-> struct", t1.a, t1.b, t1.c, t1.d)
Alan Donovan052c9422013-02-12 13:17:49 -0500116 panic("bigalg")
Russ Coxc3077f72008-12-19 17:11:54 -0800117 }
118
Rob Pike4f61fc92010-09-04 10:36:13 +1000119 i = e
120 e1 := i.(E)
Russ Coxc3077f72008-12-19 17:11:54 -0800121 // nothing to check; just verify it doesn't crash
Rob Pike4f61fc92010-09-04 10:36:13 +1000122 _ = e1
Russ Coxc3077f72008-12-19 17:11:54 -0800123}
124
Russ Coxeee50ae2008-12-19 12:05:22 -0800125func main() {
Rob Pike4f61fc92010-09-04 10:36:13 +1000126 arraycmptest()
127 maptest()
128 chantest()
129 interfacetest()
Russ Coxeee50ae2008-12-19 12:05:22 -0800130}