blob: 902ba8410773065afba3d6bd96850d20e9fba6d1 [file] [log] [blame]
Russ Coxeee50ae2008-12-19 12:05:22 -08001// $G $D/$F.go && $L $F.$A && ./$A.out
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
7package main
8
Russ Cox839a6842009-01-20 14:40:40 -08009type T struct {
Rob Pike4f61fc92010-09-04 10:36:13 +100010 a float64
11 b int64
12 c string
13 d byte
Russ Coxeee50ae2008-12-19 12:05:22 -080014}
15
Russ Coxbe2edb52009-03-03 08:39:12 -080016var a = []int{ 1, 2, 3 }
Rob Pike4f61fc92010-09-04 10:36:13 +100017var NIL []int
Russ Coxeee50ae2008-12-19 12:05:22 -080018
19func arraycmptest() {
Russ Coxeee50ae2008-12-19 12:05:22 -080020 if NIL != nil {
Rob Pike4f61fc92010-09-04 10:36:13 +100021 println("fail1:", NIL, "!= nil")
Russ Coxeee50ae2008-12-19 12:05:22 -080022 }
23 if nil != NIL {
Rob Pike4f61fc92010-09-04 10:36:13 +100024 println("fail2: nil !=", NIL)
Russ Coxeee50ae2008-12-19 12:05:22 -080025 }
26 if a == nil || nil == a {
Rob Pike4f61fc92010-09-04 10:36:13 +100027 println("fail3:", a, "== nil")
Russ Coxeee50ae2008-12-19 12:05:22 -080028 }
Russ Coxc3077f72008-12-19 17:11:54 -080029}
30
Russ Cox839a6842009-01-20 14:40:40 -080031func SameArray(a, b []int) bool {
Russ Coxc3077f72008-12-19 17:11:54 -080032 if len(a) != len(b) || cap(a) != cap(b) {
Rob Pike4f61fc92010-09-04 10:36:13 +100033 return false
Russ Coxeee50ae2008-12-19 12:05:22 -080034 }
Russ Coxc3077f72008-12-19 17:11:54 -080035 if len(a) > 0 && &a[0] != &b[0] {
Rob Pike4f61fc92010-09-04 10:36:13 +100036 return false
Russ Coxeee50ae2008-12-19 12:05:22 -080037 }
Rob Pike4f61fc92010-09-04 10:36:13 +100038 return true
Russ Coxeee50ae2008-12-19 12:05:22 -080039}
40
Russ Coxbe2edb52009-03-03 08:39:12 -080041var t = T{1.5, 123, "hello", 255}
Russ Cox55645042009-01-06 15:19:02 -080042var mt = make(map[int]T)
43var ma = make(map[int][]int)
Russ Coxeee50ae2008-12-19 12:05:22 -080044
45func maptest() {
Rob Pike4f61fc92010-09-04 10:36:13 +100046 mt[0] = t
47 t1 := mt[0]
Russ Coxeee50ae2008-12-19 12:05:22 -080048 if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
Rob Pike4f61fc92010-09-04 10:36:13 +100049 println("fail: map val struct", t1.a, t1.b, t1.c, t1.d)
Russ Coxeee50ae2008-12-19 12:05:22 -080050 }
51
Rob Pike4f61fc92010-09-04 10:36:13 +100052 ma[1] = a
53 a1 := ma[1]
Russ Coxc3077f72008-12-19 17:11:54 -080054 if !SameArray(a, a1) {
Rob Pike4f61fc92010-09-04 10:36:13 +100055 println("fail: map val array", a, a1)
Russ Coxeee50ae2008-12-19 12:05:22 -080056 }
57}
58
Russ Cox55645042009-01-06 15:19:02 -080059var ct = make(chan T)
60var ca = make(chan []int)
Russ Coxeee50ae2008-12-19 12:05:22 -080061
62func send() {
Rob Pike4f61fc92010-09-04 10:36:13 +100063 ct <- t
64 ca <- a
Russ Coxeee50ae2008-12-19 12:05:22 -080065}
66
67func chantest() {
Rob Pike4f61fc92010-09-04 10:36:13 +100068 go send()
Russ Coxeee50ae2008-12-19 12:05:22 -080069
Rob Pike4f61fc92010-09-04 10:36:13 +100070 t1 := <-ct
Russ Coxeee50ae2008-12-19 12:05:22 -080071 if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
Rob Pike4f61fc92010-09-04 10:36:13 +100072 println("fail: map val struct", t1.a, t1.b, t1.c, t1.d)
Russ Coxeee50ae2008-12-19 12:05:22 -080073 }
74
Rob Pike4f61fc92010-09-04 10:36:13 +100075 a1 := <-ca
Russ Coxc3077f72008-12-19 17:11:54 -080076 if !SameArray(a, a1) {
Rob Pike4f61fc92010-09-04 10:36:13 +100077 println("fail: map val array", a, a1)
Russ Coxeee50ae2008-12-19 12:05:22 -080078 }
79}
80
Russ Cox839a6842009-01-20 14:40:40 -080081type E struct { }
Russ Coxc3077f72008-12-19 17:11:54 -080082var e E
83
84func interfacetest() {
Rob Pike4f61fc92010-09-04 10:36:13 +100085 var i interface{}
Russ Coxc3077f72008-12-19 17:11:54 -080086
Rob Pike4f61fc92010-09-04 10:36:13 +100087 i = a
88 a1 := i.([]int)
Russ Coxc3077f72008-12-19 17:11:54 -080089 if !SameArray(a, a1) {
Rob Pike4f61fc92010-09-04 10:36:13 +100090 println("interface <-> []int", a, a1)
Russ Coxc3077f72008-12-19 17:11:54 -080091 }
Rob Pike4f61fc92010-09-04 10:36:13 +100092 pa := new([]int)
93 *pa = a
94 i = pa
95 a1 = *i.(*[]int)
Russ Coxc3077f72008-12-19 17:11:54 -080096 if !SameArray(a, a1) {
Rob Pike4f61fc92010-09-04 10:36:13 +100097 println("interface <-> *[]int", a, a1)
Russ Coxc3077f72008-12-19 17:11:54 -080098 }
99
Rob Pike4f61fc92010-09-04 10:36:13 +1000100 i = t
101 t1 := i.(T)
Russ Coxc3077f72008-12-19 17:11:54 -0800102 if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d {
Rob Pike4f61fc92010-09-04 10:36:13 +1000103 println("interface <-> struct", t1.a, t1.b, t1.c, t1.d)
Russ Coxc3077f72008-12-19 17:11:54 -0800104 }
105
Rob Pike4f61fc92010-09-04 10:36:13 +1000106 i = e
107 e1 := i.(E)
Russ Coxc3077f72008-12-19 17:11:54 -0800108 // nothing to check; just verify it doesn't crash
Rob Pike4f61fc92010-09-04 10:36:13 +1000109 _ = e1
Russ Coxc3077f72008-12-19 17:11:54 -0800110}
111
Russ Coxeee50ae2008-12-19 12:05:22 -0800112func main() {
Rob Pike4f61fc92010-09-04 10:36:13 +1000113 arraycmptest()
114 maptest()
115 chantest()
116 interfacetest()
Russ Coxeee50ae2008-12-19 12:05:22 -0800117}