summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-05-12 16:08:16 -0700
committerRuss Cox <rsc@golang.org>2009-05-12 16:08:16 -0700
commite796ba961440578d1521e381bfea43dc6f57f191 (patch)
tree12d6bd1cf8e96bb525e15f68f317452e487e03ea /test
parentee2c2b9c8f7631fd7d60fef2e47af140ab390579 (diff)
downloadgolang-e796ba961440578d1521e381bfea43dc6f57f191.tar.gz
update reflect for upcoming interface representation change.
test case for new change. both work with the current compiler too. R=r DELTA=150 (145 added, 2 deleted, 3 changed) OCL=28703 CL=28715
Diffstat (limited to 'test')
-rw-r--r--test/interface11.go140
-rw-r--r--test/interface4.go4
2 files changed, 141 insertions, 3 deletions
diff --git a/test/interface11.go b/test/interface11.go
new file mode 100644
index 000000000..f15f5ef0f
--- /dev/null
+++ b/test/interface11.go
@@ -0,0 +1,140 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Check uses of all the different interface
+// conversion runtime functions.
+
+package main
+
+type Stringer interface { String() string }
+type StringLengther interface { String() string; Length() int }
+type Empty interface { }
+
+type T string
+func (t T) String() string {
+ return string(t);
+}
+func (t T) Length() int {
+ return len(t);
+}
+
+type U string
+func (u U) String() string {
+ return string(u);
+}
+
+var t = T("hello")
+var u = U("goodbye")
+var e Empty
+var s Stringer = t
+var sl StringLengther = t
+var i int
+var ok bool
+
+func hello(s string) {
+ if s != "hello" {
+ panic("not hello: ", s);
+ }
+}
+
+func five(i int) {
+ if i != 5 {
+ panic("not 5: ", i);
+ }
+}
+
+func true(ok bool) {
+ if !ok {
+ panic("not true");
+ }
+}
+
+func false(ok bool) {
+ if ok {
+ panic("not false");
+ }
+}
+
+func main() {
+ // T2I
+ s = t;
+ hello(s.String());
+
+ // I2T
+ t = s.(T);
+ hello(t.String());
+
+ // T2E
+ e = t;
+
+ // E2T
+ t = e.(T);
+ hello(t.String());
+
+ // T2I again
+ sl = t;
+ hello(sl.String());
+ five(sl.Length());
+
+ // I2I static
+ s = sl;
+ hello(s.String());
+
+ // I2I dynamic
+ sl = s.(StringLengther);
+ hello(sl.String());
+ five(sl.Length());
+
+ // I2E (and E2T)
+ e = s;
+ hello(e.(T).String());
+
+ // E2I
+ s = e.(Stringer);
+ hello(s.String());
+
+ // I2T2 true
+ t, ok = s.(T);
+ true(ok);
+ hello(t.String());
+
+ // I2T2 false
+ var u1 U;
+ u1, ok = s.(U);
+ false(ok);
+
+ // I2I2 true
+ sl, ok = s.(StringLengther);
+ true(ok);
+ hello(sl.String());
+ five(sl.Length());
+
+ // I2I2 false (and T2I)
+ s = u;
+ sl, ok = s.(StringLengther);
+ false(ok);
+
+ // E2T2 true
+ t, ok = e.(T);
+ true(ok);
+ hello(t.String());
+
+ // E2T2 false
+ i, ok = e.(int);
+ false(ok);
+
+ // E2I2 true
+ sl, ok = e.(StringLengther);
+ true(ok);
+ hello(sl.String());
+ five(sl.Length());
+
+ // E2I2 false (and T2E)
+ e = u;
+ sl, ok = e.(StringLengther);
+ false(ok);
+}
+
diff --git a/test/interface4.go b/test/interface4.go
index b87130937..674ea1276 100644
--- a/test/interface4.go
+++ b/test/interface4.go
@@ -9,8 +9,6 @@
package main
-import "os"
-
type I interface { M() int64 }
type BigPtr struct { a, b, c, d int64 }
@@ -72,6 +70,6 @@ func main() {
nonptrs();
if bad {
- os.Exit(1)
+ println("BUG: interface4");
}
}