blob: fd8748b9bceb257f21d9bded8646808e6f2f3caf [file] [log] [blame]
Russ Cox57eb06f2012-02-16 23:51:04 -05001// run
Rob Pike126150d2008-06-06 13:28:03 -07002
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
Rob Pike80a97832012-02-24 11:48:19 +11007// Test switch statements.
8
Rob Pike126150d2008-06-06 13:28:03 -07009package main
10
Rob Pike80a97832012-02-24 11:48:19 +110011import "os"
12
Rob Pike126150d2008-06-06 13:28:03 -070013func assert(cond bool, msg string) {
14 if !cond {
Rob Pike4f61fc92010-09-04 10:36:13 +100015 print("assertion fail: ", msg, "\n")
16 panic(1)
Rob Pike126150d2008-06-06 13:28:03 -070017 }
18}
19
20func main() {
Rob Pike4f61fc92010-09-04 10:36:13 +100021 i5 := 5
22 i7 := 7
23 hello := "hello"
Rob Pike126150d2008-06-06 13:28:03 -070024
25 switch true {
Russ Cox5bb54b82011-11-13 22:58:08 -050026 case i5 < 5:
27 assert(false, "<")
28 case i5 == 5:
29 assert(true, "!")
30 case i5 > 5:
31 assert(false, ">")
Rob Pike126150d2008-06-06 13:28:03 -070032 }
33
34 switch {
Russ Cox5bb54b82011-11-13 22:58:08 -050035 case i5 < 5:
36 assert(false, "<")
37 case i5 == 5:
38 assert(true, "!")
39 case i5 > 5:
40 assert(false, ">")
Rob Pike126150d2008-06-06 13:28:03 -070041 }
42
43 switch x := 5; true {
Russ Cox5bb54b82011-11-13 22:58:08 -050044 case i5 < x:
45 assert(false, "<")
46 case i5 == x:
47 assert(true, "!")
48 case i5 > x:
49 assert(false, ">")
Rob Pike126150d2008-06-06 13:28:03 -070050 }
51
Robert Griesemere92b7532008-06-06 15:53:14 -070052 switch x := 5; true {
Russ Cox5bb54b82011-11-13 22:58:08 -050053 case i5 < x:
54 assert(false, "<")
55 case i5 == x:
56 assert(true, "!")
57 case i5 > x:
58 assert(false, ">")
Rob Pike126150d2008-06-06 13:28:03 -070059 }
60
61 switch i5 {
Russ Cox5bb54b82011-11-13 22:58:08 -050062 case 0:
63 assert(false, "0")
64 case 1:
65 assert(false, "1")
66 case 2:
67 assert(false, "2")
68 case 3:
69 assert(false, "3")
70 case 4:
71 assert(false, "4")
72 case 5:
73 assert(true, "5")
74 case 6:
75 assert(false, "6")
76 case 7:
77 assert(false, "7")
78 case 8:
79 assert(false, "8")
80 case 9:
81 assert(false, "9")
82 default:
83 assert(false, "default")
Rob Pike126150d2008-06-06 13:28:03 -070084 }
85
86 switch i5 {
Russ Cox5bb54b82011-11-13 22:58:08 -050087 case 0, 1, 2, 3, 4:
88 assert(false, "4")
89 case 5:
90 assert(true, "5")
91 case 6, 7, 8, 9:
92 assert(false, "9")
93 default:
94 assert(false, "default")
Rob Pike126150d2008-06-06 13:28:03 -070095 }
96
97 switch i5 {
98 case 0:
99 case 1:
100 case 2:
101 case 3:
Russ Cox5bb54b82011-11-13 22:58:08 -0500102 case 4:
103 assert(false, "4")
104 case 5:
105 assert(true, "5")
Rob Pike126150d2008-06-06 13:28:03 -0700106 case 6:
107 case 7:
108 case 8:
Russ Cox1a319892009-09-14 21:03:53 -0700109 case 9:
Russ Cox5bb54b82011-11-13 22:58:08 -0500110 default:
111 assert(i5 == 5, "good")
Rob Pike126150d2008-06-06 13:28:03 -0700112 }
113
114 switch i5 {
Russ Cox5bb54b82011-11-13 22:58:08 -0500115 case 0:
116 dummy := 0
117 _ = dummy
118 fallthrough
119 case 1:
120 dummy := 0
121 _ = dummy
122 fallthrough
123 case 2:
124 dummy := 0
125 _ = dummy
126 fallthrough
127 case 3:
128 dummy := 0
129 _ = dummy
130 fallthrough
131 case 4:
132 dummy := 0
133 _ = dummy
134 assert(false, "4")
135 case 5:
136 dummy := 0
137 _ = dummy
138 fallthrough
139 case 6:
140 dummy := 0
141 _ = dummy
142 fallthrough
143 case 7:
144 dummy := 0
145 _ = dummy
146 fallthrough
147 case 8:
148 dummy := 0
149 _ = dummy
150 fallthrough
151 case 9:
152 dummy := 0
153 _ = dummy
154 fallthrough
155 default:
156 dummy := 0
157 _ = dummy
158 assert(i5 == 5, "good")
Rob Pike126150d2008-06-06 13:28:03 -0700159 }
160
Rob Pike4f61fc92010-09-04 10:36:13 +1000161 fired := false
Rob Pike126150d2008-06-06 13:28:03 -0700162 switch i5 {
Russ Cox5bb54b82011-11-13 22:58:08 -0500163 case 0:
164 dummy := 0
165 _ = dummy
166 fallthrough // tests scoping of cases
167 case 1:
168 dummy := 0
169 _ = dummy
170 fallthrough
171 case 2:
172 dummy := 0
173 _ = dummy
174 fallthrough
175 case 3:
176 dummy := 0
177 _ = dummy
178 fallthrough
179 case 4:
180 dummy := 0
181 _ = dummy
182 assert(false, "4")
183 case 5:
184 dummy := 0
185 _ = dummy
186 fallthrough
187 case 6:
188 dummy := 0
189 _ = dummy
190 fallthrough
191 case 7:
192 dummy := 0
193 _ = dummy
194 fallthrough
195 case 8:
196 dummy := 0
197 _ = dummy
198 fallthrough
199 case 9:
200 dummy := 0
201 _ = dummy
202 fallthrough
203 default:
204 dummy := 0
205 _ = dummy
206 fired = !fired
207 assert(i5 == 5, "good")
Rob Pike126150d2008-06-06 13:28:03 -0700208 }
Rob Pike4f61fc92010-09-04 10:36:13 +1000209 assert(fired, "fired")
Rob Pike126150d2008-06-06 13:28:03 -0700210
Rob Pike4f61fc92010-09-04 10:36:13 +1000211 count := 0
Rob Pike126150d2008-06-06 13:28:03 -0700212 switch i5 {
Russ Cox5bb54b82011-11-13 22:58:08 -0500213 case 0:
214 count = count + 1
215 fallthrough
216 case 1:
217 count = count + 1
218 fallthrough
219 case 2:
220 count = count + 1
221 fallthrough
222 case 3:
223 count = count + 1
224 fallthrough
225 case 4:
226 count = count + 1
227 assert(false, "4")
228 case 5:
229 count = count + 1
230 fallthrough
231 case 6:
232 count = count + 1
233 fallthrough
234 case 7:
235 count = count + 1
236 fallthrough
237 case 8:
238 count = count + 1
239 fallthrough
240 case 9:
241 count = count + 1
242 fallthrough
243 default:
244 assert(i5 == count, "good")
Rob Pike126150d2008-06-06 13:28:03 -0700245 }
Rob Pike4f61fc92010-09-04 10:36:13 +1000246 assert(fired, "fired")
Rob Pike126150d2008-06-06 13:28:03 -0700247
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700248 switch hello {
Russ Cox5bb54b82011-11-13 22:58:08 -0500249 case "wowie":
250 assert(false, "wowie")
251 case "hello":
252 assert(true, "hello")
253 case "jumpn":
254 assert(false, "jumpn")
255 default:
256 assert(false, "default")
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700257 }
258
Rob Pike4f61fc92010-09-04 10:36:13 +1000259 fired = false
Rob Pike126150d2008-06-06 13:28:03 -0700260 switch i := i5 + 2; i {
Russ Cox5bb54b82011-11-13 22:58:08 -0500261 case i7:
262 fired = true
263 default:
264 assert(false, "fail")
Rob Pike126150d2008-06-06 13:28:03 -0700265 }
Rob Pike4f61fc92010-09-04 10:36:13 +1000266 assert(fired, "var")
Russ Cox5bb54b82011-11-13 22:58:08 -0500267
268 // switch on nil-only comparison types
269 switch f := func() {}; f {
270 case nil:
271 assert(false, "f should not be nil")
272 default:
273 }
274
275 switch m := make(map[int]int); m {
276 case nil:
277 assert(false, "m should not be nil")
278 default:
279 }
280
281 switch a := make([]int, 1); a {
282 case nil:
283 assert(false, "m should not be nil")
284 default:
285 }
Rob Pike80a97832012-02-24 11:48:19 +1100286
Rémy Oudomphengf4f1ba22012-08-03 21:47:26 +0200287 // switch on interface.
288 switch i := interface{}("hello"); i {
289 case 42:
290 assert(false, `i should be "hello"`)
291 case "hello":
292 assert(true, "hello")
293 default:
294 assert(false, `i should be "hello"`)
295 }
296
Daniel Morsing551e2632012-09-17 21:29:10 +0200297 // switch on implicit bool converted to interface
298 // was broken: see issue 3980
299 switch i := interface{}(true); {
300 case i:
301 assert(true, "true")
302 case false:
303 assert(false, "i should be true")
304 default:
305 assert(false, "i should be true")
306 }
307
Rémy Oudomphengf4f1ba22012-08-03 21:47:26 +0200308 // switch on array.
309 switch ar := [3]int{1, 2, 3}; ar {
310 case [3]int{1,2,3}:
311 assert(true, "[1 2 3]")
312 case [3]int{4,5,6}:
313 assert(false, "ar should be [1 2 3]")
314 default:
315 assert(false, "ar should be [1 2 3]")
316 }
317
318 // switch on channel
319 switch c1, c2 := make(chan int), make(chan int); c1 {
320 case nil:
321 assert(false, "c1 did not match itself")
322 case c2:
323 assert(false, "c1 did not match itself")
324 case c1:
325 assert(true, "chan")
326 default:
327 assert(false, "c1 did not match itself")
328 }
329
Rob Pike80a97832012-02-24 11:48:19 +1100330 i := 0
331 switch x := 5; {
332 case i < x:
333 os.Exit(0)
334 case i == x:
335 case i > x:
336 os.Exit(1)
337 }
Rob Pike126150d2008-06-06 13:28:03 -0700338}