| // run | |
| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Test the internal "algorithms" for objects larger than a word: hashing, equality etc. | |
| package main | |
| type T struct { | |
| a float64 | |
| b int64 | |
| c string | |
| d byte | |
| } | |
| var a = []int{1, 2, 3} | |
| var NIL []int | |
| func arraycmptest() { | |
| if NIL != nil { | |
| println("fail1:", NIL, "!= nil") | |
| panic("bigalg") | |
| } | |
| if nil != NIL { | |
| println("fail2: nil !=", NIL) | |
| panic("bigalg") | |
| } | |
| if a == nil || nil == a { | |
| println("fail3:", a, "== nil") | |
| panic("bigalg") | |
| } | |
| } | |
| func SameArray(a, b []int) bool { | |
| if len(a) != len(b) || cap(a) != cap(b) { | |
| return false | |
| } | |
| if len(a) > 0 && &a[0] != &b[0] { | |
| return false | |
| } | |
| return true | |
| } | |
| var t = T{1.5, 123, "hello", 255} | |
| var mt = make(map[int]T) | |
| var ma = make(map[int][]int) | |
| func maptest() { | |
| mt[0] = t | |
| t1 := mt[0] | |
| if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d { | |
| println("fail: map val struct", t1.a, t1.b, t1.c, t1.d) | |
| panic("bigalg") | |
| } | |
| ma[1] = a | |
| a1 := ma[1] | |
| if !SameArray(a, a1) { | |
| println("fail: map val array", a, a1) | |
| panic("bigalg") | |
| } | |
| } | |
| var ct = make(chan T) | |
| var ca = make(chan []int) | |
| func send() { | |
| ct <- t | |
| ca <- a | |
| } | |
| func chantest() { | |
| go send() | |
| t1 := <-ct | |
| if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d { | |
| println("fail: map val struct", t1.a, t1.b, t1.c, t1.d) | |
| panic("bigalg") | |
| } | |
| a1 := <-ca | |
| if !SameArray(a, a1) { | |
| println("fail: map val array", a, a1) | |
| panic("bigalg") | |
| } | |
| } | |
| type E struct{} | |
| var e E | |
| func interfacetest() { | |
| var i interface{} | |
| i = a | |
| a1 := i.([]int) | |
| if !SameArray(a, a1) { | |
| println("interface <-> []int", a, a1) | |
| panic("bigalg") | |
| } | |
| pa := new([]int) | |
| *pa = a | |
| i = pa | |
| a1 = *i.(*[]int) | |
| if !SameArray(a, a1) { | |
| println("interface <-> *[]int", a, a1) | |
| panic("bigalg") | |
| } | |
| i = t | |
| t1 := i.(T) | |
| if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d { | |
| println("interface <-> struct", t1.a, t1.b, t1.c, t1.d) | |
| panic("bigalg") | |
| } | |
| i = e | |
| e1 := i.(E) | |
| // nothing to check; just verify it doesn't crash | |
| _ = e1 | |
| } | |
| func main() { | |
| arraycmptest() | |
| maptest() | |
| chantest() | |
| interfacetest() | |
| } |