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