diff options
Diffstat (limited to 'test/interface11.go')
-rw-r--r-- | test/interface11.go | 140 |
1 files changed, 140 insertions, 0 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); +} + |