1// run
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
7// Test all the different interface conversion runtime functions.
8
9package main
10
11type Stringer interface {
12	String() string
13}
14type StringLengther interface {
15	String() string
16	Length() int
17}
18type Empty interface{}
19
20type T string
21
22func (t T) String() string {
23	return string(t)
24}
25func (t T) Length() int {
26	return len(t)
27}
28
29type U string
30
31func (u U) String() string {
32	return string(u)
33}
34
35var t = T("hello")
36var u = U("goodbye")
37var e Empty
38var s Stringer = t
39var sl StringLengther = t
40var i int
41var ok bool
42
43func hello(s string) {
44	if s != "hello" {
45		println("not hello: ", s)
46		panic("fail")
47	}
48}
49
50func five(i int) {
51	if i != 5 {
52		println("not 5: ", i)
53		panic("fail")
54	}
55}
56
57func true(ok bool) {
58	if !ok {
59		panic("not true")
60	}
61}
62
63func false(ok bool) {
64	if ok {
65		panic("not false")
66	}
67}
68
69func main() {
70	// T2I
71	s = t
72	hello(s.String())
73
74	// I2T
75	t = s.(T)
76	hello(t.String())
77
78	// T2E
79	e = t
80
81	// E2T
82	t = e.(T)
83	hello(t.String())
84
85	// T2I again
86	sl = t
87	hello(sl.String())
88	five(sl.Length())
89
90	// I2I static
91	s = sl
92	hello(s.String())
93
94	// I2I dynamic
95	sl = s.(StringLengther)
96	hello(sl.String())
97	five(sl.Length())
98
99	// I2E (and E2T)
100	e = s
101	hello(e.(T).String())
102
103	// E2I
104	s = e.(Stringer)
105	hello(s.String())
106
107	// I2T2 true
108	t, ok = s.(T)
109	true(ok)
110	hello(t.String())
111
112	// I2T2 false
113	_, ok = s.(U)
114	false(ok)
115
116	// I2I2 true
117	sl, ok = s.(StringLengther)
118	true(ok)
119	hello(sl.String())
120	five(sl.Length())
121
122	// I2I2 false (and T2I)
123	s = u
124	sl, ok = s.(StringLengther)
125	false(ok)
126
127	// E2T2 true
128	t, ok = e.(T)
129	true(ok)
130	hello(t.String())
131
132	// E2T2 false
133	i, ok = e.(int)
134	false(ok)
135
136	// E2I2 true
137	sl, ok = e.(StringLengther)
138	true(ok)
139	hello(sl.String())
140	five(sl.Length())
141
142	// E2I2 false (and T2E)
143	e = u
144	sl, ok = e.(StringLengther)
145	false(ok)
146}
147