File size: 2,601 Bytes
e36aeda | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | // Copyright 2015 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.
// Tests type assertion expressions and statements
package main
import (
"runtime"
"testing"
)
type (
S struct{}
U struct{}
I interface {
F()
}
)
var (
s *S
u *U
)
func (s *S) F() {}
func (u *U) F() {}
func e2t_ssa(e interface{}) *U {
return e.(*U)
}
func i2t_ssa(i I) *U {
return i.(*U)
}
func testAssertE2TOk(t *testing.T) {
if got := e2t_ssa(u); got != u {
t.Errorf("e2t_ssa(u)=%v want %v", got, u)
}
}
func testAssertE2TPanic(t *testing.T) {
var got *U
defer func() {
if got != nil {
t.Errorf("e2t_ssa(s)=%v want nil", got)
}
e := recover()
err, ok := e.(*runtime.TypeAssertionError)
if !ok {
t.Errorf("e2t_ssa(s) panic type %T", e)
}
want := "interface conversion: interface {} is *main.S, not *main.U"
if err.Error() != want {
t.Errorf("e2t_ssa(s) wrong error, want '%s', got '%s'", want, err.Error())
}
}()
got = e2t_ssa(s)
t.Errorf("e2t_ssa(s) should panic")
}
func testAssertI2TOk(t *testing.T) {
if got := i2t_ssa(u); got != u {
t.Errorf("i2t_ssa(u)=%v want %v", got, u)
}
}
func testAssertI2TPanic(t *testing.T) {
var got *U
defer func() {
if got != nil {
t.Errorf("i2t_ssa(s)=%v want nil", got)
}
e := recover()
err, ok := e.(*runtime.TypeAssertionError)
if !ok {
t.Errorf("i2t_ssa(s) panic type %T", e)
}
want := "interface conversion: main.I is *main.S, not *main.U"
if err.Error() != want {
t.Errorf("i2t_ssa(s) wrong error, want '%s', got '%s'", want, err.Error())
}
}()
got = i2t_ssa(s)
t.Errorf("i2t_ssa(s) should panic")
}
func e2t2_ssa(e interface{}) (*U, bool) {
u, ok := e.(*U)
return u, ok
}
func i2t2_ssa(i I) (*U, bool) {
u, ok := i.(*U)
return u, ok
}
func testAssertE2T2(t *testing.T) {
if got, ok := e2t2_ssa(u); !ok || got != u {
t.Errorf("e2t2_ssa(u)=(%v, %v) want (%v, %v)", got, ok, u, true)
}
if got, ok := e2t2_ssa(s); ok || got != nil {
t.Errorf("e2t2_ssa(s)=(%v, %v) want (%v, %v)", got, ok, nil, false)
}
}
func testAssertI2T2(t *testing.T) {
if got, ok := i2t2_ssa(u); !ok || got != u {
t.Errorf("i2t2_ssa(u)=(%v, %v) want (%v, %v)", got, ok, u, true)
}
if got, ok := i2t2_ssa(s); ok || got != nil {
t.Errorf("i2t2_ssa(s)=(%v, %v) want (%v, %v)", got, ok, nil, false)
}
}
// TestTypeAssertion tests type assertions.
func TestTypeAssertion(t *testing.T) {
testAssertE2TOk(t)
testAssertE2TPanic(t)
testAssertI2TOk(t)
testAssertI2TPanic(t)
testAssertE2T2(t)
testAssertI2T2(t)
}
|