]> Cypherpunks.ru repositories - gostls13.git/blob - test/range3.go
cmd/internal/obj/ppc64: generate MOVD mask constants in register
[gostls13.git] / test / range3.go
1 // run -goexperiment range
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 the 'for range' construct.
8
9 package main
10
11 // test range over integers
12
13 func testint1() {
14         bad := false
15         j := 0
16         for i := range int(4) {
17                 if i != j {
18                         println("range var", i, "want", j)
19                         bad = true
20                 }
21                 j++
22         }
23         if j != 4 {
24                 println("wrong count ranging over 4:", j)
25                 bad = true
26         }
27         if bad {
28                 panic("testint1")
29         }
30 }
31
32 func testint2() {
33         bad := false
34         j := 0
35         for i := range 4 {
36                 if i != j {
37                         println("range var", i, "want", j)
38                         bad = true
39                 }
40                 j++
41         }
42         if j != 4 {
43                 println("wrong count ranging over 4:", j)
44                 bad = true
45         }
46         if bad {
47                 panic("testint2")
48         }
49 }
50
51 func testint3() {
52         bad := false
53         type MyInt int
54         j := MyInt(0)
55         for i := range MyInt(4) {
56                 if i != j {
57                         println("range var", i, "want", j)
58                         bad = true
59                 }
60                 j++
61         }
62         if j != 4 {
63                 println("wrong count ranging over 4:", j)
64                 bad = true
65         }
66         if bad {
67                 panic("testint3")
68         }
69 }
70
71 // test range over functions
72
73 var gj int
74
75 func yield4x(yield func() bool) {
76         _ = yield() && yield() && yield() && yield()
77 }
78
79 func yield4(yield func(int) bool) {
80         _ = yield(1) && yield(2) && yield(3) && yield(4)
81 }
82
83 func yield3(yield func(int) bool) {
84         _ = yield(1) && yield(2) && yield(3)
85 }
86
87 func yield2(yield func(int) bool) {
88         _ = yield(1) && yield(2)
89 }
90
91 func testfunc0() {
92         j := 0
93         for range yield4x {
94                 j++
95         }
96         if j != 4 {
97                 println("wrong count ranging over yield4x:", j)
98                 panic("testfunc0")
99         }
100
101         j = 0
102         for _ = range yield4 {
103                 j++
104         }
105         if j != 4 {
106                 println("wrong count ranging over yield4:", j)
107                 panic("testfunc0")
108         }
109 }
110
111 func testfunc1() {
112         bad := false
113         j := 1
114         for i := range yield4 {
115                 if i != j {
116                         println("range var", i, "want", j)
117                         bad = true
118                 }
119                 j++
120         }
121         if j != 5 {
122                 println("wrong count ranging over f:", j)
123                 bad = true
124         }
125         if bad {
126                 panic("testfunc1")
127         }
128 }
129
130 func testfunc2() {
131         bad := false
132         j := 1
133         var i int
134         for i = range yield4 {
135                 if i != j {
136                         println("range var", i, "want", j)
137                         bad = true
138                 }
139                 j++
140         }
141         if j != 5 {
142                 println("wrong count ranging over f:", j)
143                 bad = true
144         }
145         if i != 4 {
146                 println("wrong final i ranging over f:", i)
147                 bad = true
148         }
149         if bad {
150                 panic("testfunc2")
151         }
152 }
153
154 func testfunc3() {
155         bad := false
156         j := 1
157         var i int
158         for i = range yield4 {
159                 if i != j {
160                         println("range var", i, "want", j)
161                         bad = true
162                 }
163                 j++
164                 if i == 2 {
165                         break
166                 }
167                 continue
168         }
169         if j != 3 {
170                 println("wrong count ranging over f:", j)
171                 bad = true
172         }
173         if i != 2 {
174                 println("wrong final i ranging over f:", i)
175                 bad = true
176         }
177         if bad {
178                 panic("testfunc3")
179         }
180 }
181
182 func testfunc4() {
183         bad := false
184         j := 1
185         var i int
186         func() {
187                 for i = range yield4 {
188                         if i != j {
189                                 println("range var", i, "want", j)
190                                 bad = true
191                         }
192                         j++
193                         if i == 2 {
194                                 return
195                         }
196                 }
197         }()
198         if j != 3 {
199                 println("wrong count ranging over f:", j)
200                 bad = true
201         }
202         if i != 2 {
203                 println("wrong final i ranging over f:", i)
204                 bad = true
205         }
206         if bad {
207                 panic("testfunc3")
208         }
209 }
210
211 func func5() (int, int) {
212         for i := range yield4 {
213                 return 10, i
214         }
215         panic("still here")
216 }
217
218 func testfunc5() {
219         x, y := func5()
220         if x != 10 || y != 1 {
221                 println("wrong results", x, y, "want", 10, 1)
222                 panic("testfunc5")
223         }
224 }
225
226 func func6() (z, w int) {
227         for i := range yield4 {
228                 z = 10
229                 w = i
230                 return
231         }
232         panic("still here")
233 }
234
235 func testfunc6() {
236         x, y := func6()
237         if x != 10 || y != 1 {
238                 println("wrong results", x, y, "want", 10, 1)
239                 panic("testfunc6")
240         }
241 }
242
243 var saved []int
244
245 func save(x int) {
246         saved = append(saved, x)
247 }
248
249 func printslice(s []int) {
250         print("[")
251         for i, x := range s {
252                 if i > 0 {
253                         print(", ")
254                 }
255                 print(x)
256         }
257         print("]")
258 }
259
260 func eqslice(s, t []int) bool {
261         if len(s) != len(t) {
262                 return false
263         }
264         for i, x := range s {
265                 if x != t[i] {
266                         return false
267                 }
268         }
269         return true
270 }
271
272 func func7() {
273         defer save(-1)
274         for i := range yield4 {
275                 defer save(i)
276         }
277         defer save(5)
278 }
279
280 func checkslice(name string, saved, want []int) {
281         if !eqslice(saved, want) {
282                 print("wrong results ")
283                 printslice(saved)
284                 print(" want ")
285                 printslice(want)
286                 print("\n")
287                 panic(name)
288         }
289 }
290
291 func testfunc7() {
292         saved = nil
293         func7()
294         want := []int{5, 4, 3, 2, 1, -1}
295         checkslice("testfunc7", saved, want)
296 }
297
298 func func8() {
299         defer save(-1)
300         for i := range yield2 {
301                 for j := range yield3 {
302                         defer save(i*10 + j)
303                 }
304                 defer save(i)
305         }
306         defer save(-2)
307         for i := range yield4 {
308                 defer save(i)
309         }
310         defer save(-3)
311 }
312
313 func testfunc8() {
314         saved = nil
315         func8()
316         want := []int{-3, 4, 3, 2, 1, -2, 2, 23, 22, 21, 1, 13, 12, 11, -1}
317         checkslice("testfunc8", saved, want)
318 }
319
320 func func9() {
321         n := 0
322         for _ = range yield2 {
323                 for _ = range yield3 {
324                         n++
325                         defer save(n)
326                 }
327         }
328 }
329
330 func testfunc9() {
331         saved = nil
332         func9()
333         want := []int{6, 5, 4, 3, 2, 1}
334         checkslice("testfunc9", saved, want)
335 }
336
337 // test that range evaluates the index and value expressions
338 // exactly once per iteration.
339
340 var ncalls = 0
341
342 func getvar(p *int) *int {
343         ncalls++
344         return p
345 }
346
347 func iter2(list ...int) func(func(int, int) bool) {
348         return func(yield func(int, int) bool) {
349                 for i, x := range list {
350                         if !yield(i, x) {
351                                 return
352                         }
353                 }
354         }
355 }
356
357 func testcalls() {
358         var i, v int
359         ncalls = 0
360         si := 0
361         sv := 0
362         for *getvar(&i), *getvar(&v) = range iter2(1, 2) {
363                 si += i
364                 sv += v
365         }
366         if ncalls != 4 {
367                 println("wrong number of calls:", ncalls, "!= 4")
368                 panic("fail")
369         }
370         if si != 1 || sv != 3 {
371                 println("wrong sum in testcalls", si, sv)
372                 panic("fail")
373         }
374 }
375
376 func main() {
377         testint1()
378         testint2()
379         testint3()
380         testfunc0()
381         testfunc1()
382         testfunc2()
383         testfunc3()
384         testfunc4()
385         testfunc5()
386         testfunc6()
387         testfunc7()
388         testfunc8()
389         testfunc9()
390         testcalls()
391 }