blob: 30a4b4975fbb3afeb7a54e19bcf7b57df4d130ff [file] [log] [blame]
Russ Cox57eb06f2012-02-16 23:51:04 -05001// run
Rob Pikebcb464d2009-03-17 20:55:42 -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 simple type switches, including chans, maps etc.
8
Rob Pikebcb464d2009-03-17 20:55:42 -07009package main
10
Russ Cox918afd942009-05-08 15:21:41 -070011import "os"
12
Rob Pikebcb464d2009-03-17 20:55:42 -070013const (
Rob Pike4f61fc92010-09-04 10:36:13 +100014 Bool = iota
15 Int
16 Float
17 String
18 Struct
19 Chan
20 Array
21 Map
22 Func
23 Last
Rob Pikebcb464d2009-03-17 20:55:42 -070024)
25
Russ Coxf2b5a072011-01-19 23:09:00 -050026type S struct {
27 a int
28}
29
Rob Pikebcb464d2009-03-17 20:55:42 -070030var s S = S{1234}
31
Rob Pike4f61fc92010-09-04 10:36:13 +100032var c = make(chan int)
Rob Pikebcb464d2009-03-17 20:55:42 -070033
Russ Coxf2b5a072011-01-19 23:09:00 -050034var a = []int{0, 1, 2, 3}
Rob Pikebcb464d2009-03-17 20:55:42 -070035
36var m = make(map[string]int)
37
38func assert(b bool, s string) {
39 if !b {
Rob Pike4f61fc92010-09-04 10:36:13 +100040 println(s)
41 os.Exit(1)
Rob Pikebcb464d2009-03-17 20:55:42 -070042 }
43}
44
Rob Pikebcb464d2009-03-17 20:55:42 -070045func f(i int) interface{} {
46 switch i {
47 case Bool:
Rob Pike4f61fc92010-09-04 10:36:13 +100048 return true
Rob Pikebcb464d2009-03-17 20:55:42 -070049 case Int:
Rob Pike4f61fc92010-09-04 10:36:13 +100050 return 7
Rob Pikebcb464d2009-03-17 20:55:42 -070051 case Float:
Rob Pike4f61fc92010-09-04 10:36:13 +100052 return 7.4
Rob Pikebcb464d2009-03-17 20:55:42 -070053 case String:
Rob Pike4f61fc92010-09-04 10:36:13 +100054 return "hello"
Rob Pikebcb464d2009-03-17 20:55:42 -070055 case Struct:
Rob Pike4f61fc92010-09-04 10:36:13 +100056 return s
Rob Pikebcb464d2009-03-17 20:55:42 -070057 case Chan:
Rob Pike4f61fc92010-09-04 10:36:13 +100058 return c
Rob Pikebcb464d2009-03-17 20:55:42 -070059 case Array:
Rob Pike4f61fc92010-09-04 10:36:13 +100060 return a
Rob Pikebcb464d2009-03-17 20:55:42 -070061 case Map:
Rob Pike4f61fc92010-09-04 10:36:13 +100062 return m
Rob Pikebcb464d2009-03-17 20:55:42 -070063 case Func:
Rob Pike4f61fc92010-09-04 10:36:13 +100064 return f
Rob Pikebcb464d2009-03-17 20:55:42 -070065 }
Rob Pike4f61fc92010-09-04 10:36:13 +100066 panic("bad type number")
Rob Pikebcb464d2009-03-17 20:55:42 -070067}
68
69func main() {
Rob Pikebcb464d2009-03-17 20:55:42 -070070 for i := Bool; i < Last; i++ {
71 switch x := f(i).(type) {
72 case bool:
Rob Pike4f61fc92010-09-04 10:36:13 +100073 assert(x == true && i == Bool, "bool")
Rob Pikebcb464d2009-03-17 20:55:42 -070074 case int:
Rob Pike4f61fc92010-09-04 10:36:13 +100075 assert(x == 7 && i == Int, "int")
Russ Coxf2b5a072011-01-19 23:09:00 -050076 case float64:
77 assert(x == 7.4 && i == Float, "float64")
Rob Pikebcb464d2009-03-17 20:55:42 -070078 case string:
Russ Coxf2b5a072011-01-19 23:09:00 -050079 assert(x == "hello" && i == String, "string")
Rob Pikebcb464d2009-03-17 20:55:42 -070080 case S:
Rob Pike4f61fc92010-09-04 10:36:13 +100081 assert(x.a == 1234 && i == Struct, "struct")
Rob Pikebcb464d2009-03-17 20:55:42 -070082 case chan int:
Rob Pike4f61fc92010-09-04 10:36:13 +100083 assert(x == c && i == Chan, "chan")
Rob Pikebcb464d2009-03-17 20:55:42 -070084 case []int:
Rob Pike4f61fc92010-09-04 10:36:13 +100085 assert(x[3] == 3 && i == Array, "array")
Rob Pikebcb464d2009-03-17 20:55:42 -070086 case map[string]int:
Russ Cox5bb54b82011-11-13 22:58:08 -050087 assert(x != nil && i == Map, "map")
Rob Pikebcb464d2009-03-17 20:55:42 -070088 case func(i int) interface{}:
Russ Cox5bb54b82011-11-13 22:58:08 -050089 assert(x != nil && i == Func, "fun")
Rob Pikebcb464d2009-03-17 20:55:42 -070090 default:
Rob Pike4f61fc92010-09-04 10:36:13 +100091 assert(false, "unknown")
Rob Pikebcb464d2009-03-17 20:55:42 -070092 }
93 }
94
Rob Pike08eeb252009-03-18 14:05:05 -070095 // boolean switch (has had bugs in past; worth writing down)
Rob Pikebcb464d2009-03-17 20:55:42 -070096 switch {
97 case true:
Rob Pike4f61fc92010-09-04 10:36:13 +100098 assert(true, "switch 2 bool")
Rob Pikebcb464d2009-03-17 20:55:42 -070099 default:
Rob Pike4f61fc92010-09-04 10:36:13 +1000100 assert(false, "switch 2 unknown")
Rob Pikebcb464d2009-03-17 20:55:42 -0700101 }
102
103 switch true {
104 case true:
Rob Pike4f61fc92010-09-04 10:36:13 +1000105 assert(true, "switch 3 bool")
Rob Pikebcb464d2009-03-17 20:55:42 -0700106 default:
Rob Pike4f61fc92010-09-04 10:36:13 +1000107 assert(false, "switch 3 unknown")
Rob Pikebcb464d2009-03-17 20:55:42 -0700108 }
109
110 switch false {
111 case false:
Rob Pike4f61fc92010-09-04 10:36:13 +1000112 assert(true, "switch 4 bool")
Rob Pikebcb464d2009-03-17 20:55:42 -0700113 default:
Rob Pike4f61fc92010-09-04 10:36:13 +1000114 assert(false, "switch 4 unknown")
Rob Pikebcb464d2009-03-17 20:55:42 -0700115 }
Rob Pikebcb464d2009-03-17 20:55:42 -0700116}