Russ Cox | 57eb06f | 2012-02-16 23:51:04 -0500 | [diff] [blame] | 1 | // run |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 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 | |
Rob Pike | 80a9783 | 2012-02-24 11:48:19 +1100 | [diff] [blame] | 7 | // Test simple type switches, including chans, maps etc. |
| 8 | |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 9 | package main |
| 10 | |
Russ Cox | 918afd94 | 2009-05-08 15:21:41 -0700 | [diff] [blame] | 11 | import "os" |
| 12 | |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 13 | const ( |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 14 | Bool = iota |
| 15 | Int |
| 16 | Float |
| 17 | String |
| 18 | Struct |
| 19 | Chan |
| 20 | Array |
| 21 | Map |
| 22 | Func |
| 23 | Last |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 24 | ) |
| 25 | |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 26 | type S struct { |
| 27 | a int |
| 28 | } |
| 29 | |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 30 | var s S = S{1234} |
| 31 | |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 32 | var c = make(chan int) |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 33 | |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 34 | var a = []int{0, 1, 2, 3} |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 35 | |
| 36 | var m = make(map[string]int) |
| 37 | |
| 38 | func assert(b bool, s string) { |
| 39 | if !b { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 40 | println(s) |
| 41 | os.Exit(1) |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 42 | } |
| 43 | } |
| 44 | |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 45 | func f(i int) interface{} { |
| 46 | switch i { |
| 47 | case Bool: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 48 | return true |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 49 | case Int: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 50 | return 7 |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 51 | case Float: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 52 | return 7.4 |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 53 | case String: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 54 | return "hello" |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 55 | case Struct: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 56 | return s |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 57 | case Chan: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 58 | return c |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 59 | case Array: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 60 | return a |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 61 | case Map: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 62 | return m |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 63 | case Func: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 64 | return f |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 65 | } |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 66 | panic("bad type number") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 67 | } |
| 68 | |
| 69 | func main() { |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 70 | for i := Bool; i < Last; i++ { |
| 71 | switch x := f(i).(type) { |
| 72 | case bool: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 73 | assert(x == true && i == Bool, "bool") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 74 | case int: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 75 | assert(x == 7 && i == Int, "int") |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 76 | case float64: |
| 77 | assert(x == 7.4 && i == Float, "float64") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 78 | case string: |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 79 | assert(x == "hello" && i == String, "string") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 80 | case S: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 81 | assert(x.a == 1234 && i == Struct, "struct") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 82 | case chan int: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 83 | assert(x == c && i == Chan, "chan") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 84 | case []int: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 85 | assert(x[3] == 3 && i == Array, "array") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 86 | case map[string]int: |
Russ Cox | 5bb54b8 | 2011-11-13 22:58:08 -0500 | [diff] [blame] | 87 | assert(x != nil && i == Map, "map") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 88 | case func(i int) interface{}: |
Russ Cox | 5bb54b8 | 2011-11-13 22:58:08 -0500 | [diff] [blame] | 89 | assert(x != nil && i == Func, "fun") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 90 | default: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 91 | assert(false, "unknown") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 92 | } |
| 93 | } |
| 94 | |
Rob Pike | 08eeb25 | 2009-03-18 14:05:05 -0700 | [diff] [blame] | 95 | // boolean switch (has had bugs in past; worth writing down) |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 96 | switch { |
| 97 | case true: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 98 | assert(true, "switch 2 bool") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 99 | default: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 100 | assert(false, "switch 2 unknown") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | switch true { |
| 104 | case true: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 105 | assert(true, "switch 3 bool") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 106 | default: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 107 | assert(false, "switch 3 unknown") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 108 | } |
| 109 | |
| 110 | switch false { |
| 111 | case false: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 112 | assert(true, "switch 4 bool") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 113 | default: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 114 | assert(false, "switch 4 unknown") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 115 | } |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 116 | } |