blob: f7ca0665e26f87f896be328f5c08737c3b16c317 [file] [log] [blame]
// 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")
}
}