| // run |
| |
| // 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. |
| |
| // Test embedded fields of structs, including methods. |
| |
| package main |
| |
| |
| type I interface { |
| test1() int |
| test2() int |
| test3() int |
| test4() int |
| test5() int |
| test6() int |
| test7() int |
| } |
| |
| /****** |
| ****** |
| ******/ |
| |
| type SubpSubp struct { |
| a7 int |
| a int |
| } |
| |
| func (p *SubpSubp) test7() int { |
| if p.a != p.a7 { |
| println("SubpSubp", p, p.a7) |
| panic("fail") |
| } |
| return p.a |
| } |
| func (p *SubpSubp) testx() { println("SubpSubp", p, p.a7) } |
| |
| /****** |
| ****** |
| ******/ |
| |
| type SubpSub struct { |
| a6 int |
| SubpSubp |
| a int |
| } |
| |
| func (p *SubpSub) test6() int { |
| if p.a != p.a6 { |
| println("SubpSub", p, p.a6) |
| panic("fail") |
| } |
| return p.a |
| } |
| func (p *SubpSub) testx() { println("SubpSub", p, p.a6) } |
| |
| /****** |
| ****** |
| ******/ |
| |
| type SubSubp struct { |
| a5 int |
| a int |
| } |
| |
| func (p *SubSubp) test5() int { |
| if p.a != p.a5 { |
| println("SubpSub", p, p.a5) |
| panic("fail") |
| } |
| return p.a |
| } |
| |
| /****** |
| ****** |
| ******/ |
| |
| type SubSub struct { |
| a4 int |
| a int |
| } |
| |
| func (p *SubSub) test4() int { |
| if p.a != p.a4 { |
| println("SubpSub", p, p.a4) |
| panic("fail") |
| } |
| return p.a |
| } |
| |
| /****** |
| ****** |
| ******/ |
| |
| type Subp struct { |
| a3 int |
| *SubpSubp |
| SubpSub |
| a int |
| } |
| |
| func (p *Subp) test3() int { |
| if p.a != p.a3 { |
| println("SubpSub", p, p.a3) |
| panic("fail") |
| } |
| return p.a |
| } |
| |
| /****** |
| ****** |
| ******/ |
| |
| type Sub struct { |
| a2 int |
| *SubSubp |
| SubSub |
| a int |
| } |
| |
| func (p *Sub) test2() int { |
| if p.a != p.a2 { |
| println("SubpSub", p, p.a2) |
| panic("fail") |
| } |
| return p.a |
| } |
| |
| /****** |
| ****** |
| ******/ |
| |
| type S struct { |
| a1 int |
| Sub |
| *Subp |
| a int |
| } |
| |
| func (p *S) test1() int { |
| if p.a != p.a1 { |
| println("SubpSub", p, p.a1) |
| panic("fail") |
| } |
| return p.a |
| } |
| |
| /****** |
| ****** |
| ******/ |
| |
| func main() { |
| var i I |
| var s *S |
| |
| // allocate |
| s = new(S) |
| s.Subp = new(Subp) |
| s.Sub.SubSubp = new(SubSubp) |
| s.Subp.SubpSubp = new(SubpSubp) |
| |
| // explicit assignment |
| s.a = 1 |
| s.Sub.a = 2 |
| s.Subp.a = 3 |
| s.Sub.SubSub.a = 4 |
| s.Sub.SubSubp.a = 5 |
| s.Subp.SubpSub.a = 6 |
| s.Subp.SubpSubp.a = 7 |
| |
| // embedded (unique) assignment |
| s.a1 = 1 |
| s.a2 = 2 |
| s.a3 = 3 |
| s.a4 = 4 |
| s.a5 = 5 |
| s.a6 = 6 |
| s.a7 = 7 |
| |
| // unique calls with explicit & |
| if s.test1() != 1 { |
| println("t1", 1) |
| panic("fail") |
| } |
| if (&s.Sub).test2() != 2 { |
| println("t1", 2) |
| panic("fail") |
| } |
| if s.Subp.test3() != 3 { |
| println("t1", 3) |
| panic("fail") |
| } |
| if (&s.Sub.SubSub).test4() != 4 { |
| println("t1", 4) |
| panic("fail") |
| } |
| if s.Sub.SubSubp.test5() != 5 { |
| println("t1", 5) |
| panic("fail") |
| } |
| if (&s.Subp.SubpSub).test6() != 6 { |
| println("t1", 6) |
| panic("fail") |
| } |
| if s.Subp.SubpSubp.test7() != 7 { |
| println("t1", 7) |
| panic("fail") |
| } |
| |
| // automatic & |
| if s.Sub.test2() != 2 { |
| println("t2", 2) |
| panic("fail") |
| } |
| if s.Sub.SubSub.test4() != 4 { |
| println("t2", 4) |
| panic("fail") |
| } |
| if s.Subp.SubpSub.test6() != 6 { |
| println("t2", 6) |
| panic("fail") |
| } |
| |
| // embedded calls |
| if s.test1() != s.a1 { |
| println("t3", 1) |
| panic("fail") |
| } |
| if s.test2() != s.a2 { |
| println("t3", 2) |
| panic("fail") |
| } |
| if s.test3() != s.a3 { |
| println("t3", 3) |
| panic("fail") |
| } |
| if s.test4() != s.a4 { |
| println("t3", 4) |
| panic("fail") |
| } |
| if s.test5() != s.a5 { |
| println("t3", 5) |
| panic("fail") |
| } |
| if s.test6() != s.a6 { |
| println("t3", 6) |
| panic("fail") |
| } |
| if s.test7() != s.a7 { |
| println("t3", 7) |
| panic("fail") |
| } |
| |
| // run it through an interface |
| i = s |
| s = i.(*S) |
| |
| // same as t3 |
| if s.test1() != s.a1 { |
| println("t4", 1) |
| panic("fail") |
| } |
| if s.test2() != s.a2 { |
| println("t4", 2) |
| panic("fail") |
| } |
| if s.test3() != s.a3 { |
| println("t4", 3) |
| panic("fail") |
| } |
| if s.test4() != s.a4 { |
| println("t4", 4) |
| panic("fail") |
| } |
| if s.test5() != s.a5 { |
| println("t4", 5) |
| panic("fail") |
| } |
| if s.test6() != s.a6 { |
| println("t4", 6) |
| panic("fail") |
| } |
| if s.test7() != s.a7 { |
| println("t4", 7) |
| panic("fail") |
| } |
| |
| // call interface |
| if i.test1() != s.test1() { |
| println("t5", 1) |
| panic("fail") |
| } |
| if i.test2() != s.test2() { |
| println("t5", 2) |
| panic("fail") |
| } |
| if i.test3() != s.test3() { |
| println("t5", 3) |
| panic("fail") |
| } |
| if i.test4() != s.test4() { |
| println("t5", 4) |
| panic("fail") |
| } |
| if i.test5() != s.test5() { |
| println("t5", 5) |
| panic("fail") |
| } |
| if i.test6() != s.test6() { |
| println("t5", 6) |
| panic("fail") |
| } |
| if i.test7() != s.test7() { |
| println("t5", 7) |
| panic("fail") |
| } |
| } |