Source file test/ken/embed.go

     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 embedded fields of structs, including methods.
     8  
     9  package main
    10  
    11  
    12  type I interface {
    13  	test1() int
    14  	test2() int
    15  	test3() int
    16  	test4() int
    17  	test5() int
    18  	test6() int
    19  	test7() int
    20  }
    21  
    22  /******
    23   ******
    24   ******/
    25  
    26  type SubpSubp struct {
    27  	a7 int
    28  	a  int
    29  }
    30  
    31  func (p *SubpSubp) test7() int {
    32  	if p.a != p.a7 {
    33  		println("SubpSubp", p, p.a7)
    34  		panic("fail")
    35  	}
    36  	return p.a
    37  }
    38  func (p *SubpSubp) testx() { println("SubpSubp", p, p.a7) }
    39  
    40  /******
    41   ******
    42   ******/
    43  
    44  type SubpSub struct {
    45  	a6 int
    46  	SubpSubp
    47  	a int
    48  }
    49  
    50  func (p *SubpSub) test6() int {
    51  	if p.a != p.a6 {
    52  		println("SubpSub", p, p.a6)
    53  		panic("fail")
    54  	}
    55  	return p.a
    56  }
    57  func (p *SubpSub) testx() { println("SubpSub", p, p.a6) }
    58  
    59  /******
    60   ******
    61   ******/
    62  
    63  type SubSubp struct {
    64  	a5 int
    65  	a  int
    66  }
    67  
    68  func (p *SubSubp) test5() int {
    69  	if p.a != p.a5 {
    70  		println("SubpSub", p, p.a5)
    71  		panic("fail")
    72  	}
    73  	return p.a
    74  }
    75  
    76  /******
    77   ******
    78   ******/
    79  
    80  type SubSub struct {
    81  	a4 int
    82  	a  int
    83  }
    84  
    85  func (p *SubSub) test4() int {
    86  	if p.a != p.a4 {
    87  		println("SubpSub", p, p.a4)
    88  		panic("fail")
    89  	}
    90  	return p.a
    91  }
    92  
    93  /******
    94   ******
    95   ******/
    96  
    97  type Subp struct {
    98  	a3 int
    99  	*SubpSubp
   100  	SubpSub
   101  	a int
   102  }
   103  
   104  func (p *Subp) test3() int {
   105  	if p.a != p.a3 {
   106  		println("SubpSub", p, p.a3)
   107  		panic("fail")
   108  	}
   109  	return p.a
   110  }
   111  
   112  /******
   113   ******
   114   ******/
   115  
   116  type Sub struct {
   117  	a2 int
   118  	*SubSubp
   119  	SubSub
   120  	a int
   121  }
   122  
   123  func (p *Sub) test2() int {
   124  	if p.a != p.a2 {
   125  		println("SubpSub", p, p.a2)
   126  		panic("fail")
   127  	}
   128  	return p.a
   129  }
   130  
   131  /******
   132   ******
   133   ******/
   134  
   135  type S struct {
   136  	a1 int
   137  	Sub
   138  	*Subp
   139  	a int
   140  }
   141  
   142  func (p *S) test1() int {
   143  	if p.a != p.a1 {
   144  		println("SubpSub", p, p.a1)
   145  		panic("fail")
   146  	}
   147  	return p.a
   148  }
   149  
   150  /******
   151   ******
   152   ******/
   153  
   154  func main() {
   155  	var i I
   156  	var s *S
   157  
   158  	// allocate
   159  	s = new(S)
   160  	s.Subp = new(Subp)
   161  	s.Sub.SubSubp = new(SubSubp)
   162  	s.Subp.SubpSubp = new(SubpSubp)
   163  
   164  	// explicit assignment
   165  	s.a = 1
   166  	s.Sub.a = 2
   167  	s.Subp.a = 3
   168  	s.Sub.SubSub.a = 4
   169  	s.Sub.SubSubp.a = 5
   170  	s.Subp.SubpSub.a = 6
   171  	s.Subp.SubpSubp.a = 7
   172  
   173  	// embedded (unique) assignment
   174  	s.a1 = 1
   175  	s.a2 = 2
   176  	s.a3 = 3
   177  	s.a4 = 4
   178  	s.a5 = 5
   179  	s.a6 = 6
   180  	s.a7 = 7
   181  
   182  	// unique calls with explicit &
   183  	if s.test1() != 1 {
   184  		println("t1", 1)
   185  		panic("fail")
   186  	}
   187  	if (&s.Sub).test2() != 2 {
   188  		println("t1", 2)
   189  		panic("fail")
   190  	}
   191  	if s.Subp.test3() != 3 {
   192  		println("t1", 3)
   193  		panic("fail")
   194  	}
   195  	if (&s.Sub.SubSub).test4() != 4 {
   196  		println("t1", 4)
   197  		panic("fail")
   198  	}
   199  	if s.Sub.SubSubp.test5() != 5 {
   200  		println("t1", 5)
   201  		panic("fail")
   202  	}
   203  	if (&s.Subp.SubpSub).test6() != 6 {
   204  		println("t1", 6)
   205  		panic("fail")
   206  	}
   207  	if s.Subp.SubpSubp.test7() != 7 {
   208  		println("t1", 7)
   209  		panic("fail")
   210  	}
   211  
   212  	// automatic &
   213  	if s.Sub.test2() != 2 {
   214  		println("t2", 2)
   215  		panic("fail")
   216  	}
   217  	if s.Sub.SubSub.test4() != 4 {
   218  		println("t2", 4)
   219  		panic("fail")
   220  	}
   221  	if s.Subp.SubpSub.test6() != 6 {
   222  		println("t2", 6)
   223  		panic("fail")
   224  	}
   225  
   226  	// embedded calls
   227  	if s.test1() != s.a1 {
   228  		println("t3", 1)
   229  		panic("fail")
   230  	}
   231  	if s.test2() != s.a2 {
   232  		println("t3", 2)
   233  		panic("fail")
   234  	}
   235  	if s.test3() != s.a3 {
   236  		println("t3", 3)
   237  		panic("fail")
   238  	}
   239  	if s.test4() != s.a4 {
   240  		println("t3", 4)
   241  		panic("fail")
   242  	}
   243  	if s.test5() != s.a5 {
   244  		println("t3", 5)
   245  		panic("fail")
   246  	}
   247  	if s.test6() != s.a6 {
   248  		println("t3", 6)
   249  		panic("fail")
   250  	}
   251  	if s.test7() != s.a7 {
   252  		println("t3", 7)
   253  		panic("fail")
   254  	}
   255  
   256  	// run it through an interface
   257  	i = s
   258  	s = i.(*S)
   259  
   260  	// same as t3
   261  	if s.test1() != s.a1 {
   262  		println("t4", 1)
   263  		panic("fail")
   264  	}
   265  	if s.test2() != s.a2 {
   266  		println("t4", 2)
   267  		panic("fail")
   268  	}
   269  	if s.test3() != s.a3 {
   270  		println("t4", 3)
   271  		panic("fail")
   272  	}
   273  	if s.test4() != s.a4 {
   274  		println("t4", 4)
   275  		panic("fail")
   276  	}
   277  	if s.test5() != s.a5 {
   278  		println("t4", 5)
   279  		panic("fail")
   280  	}
   281  	if s.test6() != s.a6 {
   282  		println("t4", 6)
   283  		panic("fail")
   284  	}
   285  	if s.test7() != s.a7 {
   286  		println("t4", 7)
   287  		panic("fail")
   288  	}
   289  
   290  	// call interface
   291  	if i.test1() != s.test1() {
   292  		println("t5", 1)
   293  		panic("fail")
   294  	}
   295  	if i.test2() != s.test2() {
   296  		println("t5", 2)
   297  		panic("fail")
   298  	}
   299  	if i.test3() != s.test3() {
   300  		println("t5", 3)
   301  		panic("fail")
   302  	}
   303  	if i.test4() != s.test4() {
   304  		println("t5", 4)
   305  		panic("fail")
   306  	}
   307  	if i.test5() != s.test5() {
   308  		println("t5", 5)
   309  		panic("fail")
   310  	}
   311  	if i.test6() != s.test6() {
   312  		println("t5", 6)
   313  		panic("fail")
   314  	}
   315  	if i.test7() != s.test7() {
   316  		println("t5", 7)
   317  		panic("fail")
   318  	}
   319  }
   320  

View as plain text