]> Cypherpunks.ru repositories - gostls13.git/blob - test/ddd.go
gc: ... T corner cases
[gostls13.git] / test / ddd.go
1 // $G $D/$F.go && $L $F.$A && ./$A.out
2
3 // Copyright 2010 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 package main
8
9 func sum(args ...int) int {
10         s := 0
11         for _, v := range args {
12                 s += v
13         }
14         return s
15 }
16
17 func sumC(args ...int) int {
18         return func() int { return sum(args) } ()
19 }
20
21 /* TODO(rsc)
22 var sumD = func(args ...int) int { return sum(args) }
23
24 var sumE = func() func(...int) int { return func(args ...int) int { return sum(args) } } ()
25
26 var sumF = func(args ...int) func() int { return func() int { return sum(args) } }
27 */
28
29 func sumA(args []int) int {
30         s := 0
31         for _, v := range args {
32                 s += v
33         }
34         return s
35 }
36
37 func sum2(args ...int) int { return 2 * sum(args) }
38
39 func sum3(args ...int) int { return 3 * sumA(args) }
40
41 func intersum(args ...interface{}) int {
42         s := 0
43         for _, v := range args {
44                 s += v.(int)
45         }
46         return s
47 }
48
49 type T []T
50
51 func ln(args ...T) int { return len(args) }
52
53 func ln2(args ...T) int { return 2 * ln(args) }
54
55 func (*T) Sum(args ...int) int {
56         return sum(args)
57 }
58
59 type U struct {
60         *T
61 }
62
63 func main() {
64         if x := sum(1, 2, 3); x != 6 {
65                 panicln("sum 6", x)
66         }
67         if x := sum(); x != 0 {
68                 panicln("sum 0", x)
69         }
70         if x := sum(10); x != 10 {
71                 panicln("sum 10", x)
72         }
73         if x := sum(1, 8); x != 9 {
74                 panicln("sum 9", x)
75         }
76         if x := sumC(4, 5, 6); x != 15 {
77                 panicln("sumC 15", x)
78         }
79 /* TODO(rsc)
80         if x := sumD(4, 5, 7); x != 16 {
81                 panicln("sumD 16", x)
82         }
83         if x := sumE(4, 5, 8); x != 17 {
84                 panicln("sumE 17", x)
85         }
86         if x := sumF(4, 5, 9)(); x != 18 {
87                 panicln("sumF 18", x)
88         }
89 */
90         if x := sum2(1, 2, 3); x != 2*6 {
91                 panicln("sum 6", x)
92         }
93         if x := sum2(); x != 2*0 {
94                 panicln("sum 0", x)
95         }
96         if x := sum2(10); x != 2*10 {
97                 panicln("sum 10", x)
98         }
99         if x := sum2(1, 8); x != 2*9 {
100                 panicln("sum 9", x)
101         }
102         if x := sum3(1, 2, 3); x != 3*6 {
103                 panicln("sum 6", x)
104         }
105         if x := sum3(); x != 3*0 {
106                 panicln("sum 0", x)
107         }
108         if x := sum3(10); x != 3*10 {
109                 panicln("sum 10", x)
110         }
111         if x := sum3(1, 8); x != 3*9 {
112                 panicln("sum 9", x)
113         }
114         if x := intersum(1, 2, 3); x != 6 {
115                 panicln("intersum 6", x)
116         }
117         if x := intersum(); x != 0 {
118                 panicln("intersum 0", x)
119         }
120         if x := intersum(10); x != 10 {
121                 panicln("intersum 10", x)
122         }
123         if x := intersum(1, 8); x != 9 {
124                 panicln("intersum 9", x)
125         }
126
127         if x := ln(nil, nil, nil); x != 3 {
128                 panicln("ln 3", x)
129         }
130         if x := ln([]T{}); x != 1 {
131                 panicln("ln 1", x)
132         }
133         if x := ln2(nil, nil, nil); x != 2*3 {
134                 panicln("ln2 3", x)
135         }
136         if x := ln2([]T{}); x != 2*1 {
137                 panicln("ln2 1", x)
138         }
139         if x := ((*T)(nil)).Sum(1,3,5,7); x != 16 {
140                 panicln("(*T)(nil).Sum", x)
141         }
142         if x := (*T).Sum(nil, 1, 3, 5, 6); x != 15 {
143                 panicln("(*T).Sum", x)
144         }
145         if x := (&U{}).Sum(1,3,5,5); x != 14 {
146                 panicln("(&U{}).Sum", x)
147         }
148         var u U
149         if x := u.Sum(1,3,5,4); x != 13 {
150                 panicln("u.Sum", x)
151         }
152         if x := (&u).Sum(1,3,5,3); x != 12 {
153                 panicln("(&u).Sum", x)
154         }
155         var i interface { Sum(...int) int } = &u
156         if x := i.Sum(2,3,5,7); x != 17 {
157                 panicln("i(=&u).Sum", x)
158         }
159         i = u
160         if x := i.Sum(2,3,5,6); x != 16 {
161                 panicln("i(=u).Sum", x)
162         }
163 /* TODO(rsc): Enable once nested method expressions work.
164         if x := (*U).Sum(&U{}, 1, 3, 5, 2); x != 11 {
165                 panicln("(*U).Sum", x)
166         }
167         if x := U.Sum(U{}, 1, 3, 5, 1); x != 10 {
168                 panicln("U.Sum", x)
169         }
170 */
171 }