| // run | |
| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Test switch statements. | |
| package main | |
| import "os" | |
| func assert(cond bool, msg string) { | |
| if !cond { | |
| print("assertion fail: ", msg, "\n") | |
| panic(1) | |
| } | |
| } | |
| func main() { | |
| i5 := 5 | |
| i7 := 7 | |
| hello := "hello" | |
| switch true { | |
| case i5 < 5: | |
| assert(false, "<") | |
| case i5 == 5: | |
| assert(true, "!") | |
| case i5 > 5: | |
| assert(false, ">") | |
| } | |
| switch { | |
| case i5 < 5: | |
| assert(false, "<") | |
| case i5 == 5: | |
| assert(true, "!") | |
| case i5 > 5: | |
| assert(false, ">") | |
| } | |
| switch x := 5; true { | |
| case i5 < x: | |
| assert(false, "<") | |
| case i5 == x: | |
| assert(true, "!") | |
| case i5 > x: | |
| assert(false, ">") | |
| } | |
| switch x := 5; true { | |
| case i5 < x: | |
| assert(false, "<") | |
| case i5 == x: | |
| assert(true, "!") | |
| case i5 > x: | |
| assert(false, ">") | |
| } | |
| switch i5 { | |
| case 0: | |
| assert(false, "0") | |
| case 1: | |
| assert(false, "1") | |
| case 2: | |
| assert(false, "2") | |
| case 3: | |
| assert(false, "3") | |
| case 4: | |
| assert(false, "4") | |
| case 5: | |
| assert(true, "5") | |
| case 6: | |
| assert(false, "6") | |
| case 7: | |
| assert(false, "7") | |
| case 8: | |
| assert(false, "8") | |
| case 9: | |
| assert(false, "9") | |
| default: | |
| assert(false, "default") | |
| } | |
| switch i5 { | |
| case 0, 1, 2, 3, 4: | |
| assert(false, "4") | |
| case 5: | |
| assert(true, "5") | |
| case 6, 7, 8, 9: | |
| assert(false, "9") | |
| default: | |
| assert(false, "default") | |
| } | |
| switch i5 { | |
| case 0: | |
| case 1: | |
| case 2: | |
| case 3: | |
| case 4: | |
| assert(false, "4") | |
| case 5: | |
| assert(true, "5") | |
| case 6: | |
| case 7: | |
| case 8: | |
| case 9: | |
| default: | |
| assert(i5 == 5, "good") | |
| } | |
| switch i5 { | |
| case 0: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 1: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 2: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 3: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 4: | |
| dummy := 0 | |
| _ = dummy | |
| assert(false, "4") | |
| case 5: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 6: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 7: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 8: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 9: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| default: | |
| dummy := 0 | |
| _ = dummy | |
| assert(i5 == 5, "good") | |
| } | |
| fired := false | |
| switch i5 { | |
| case 0: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough // tests scoping of cases | |
| case 1: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 2: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 3: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 4: | |
| dummy := 0 | |
| _ = dummy | |
| assert(false, "4") | |
| case 5: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 6: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 7: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 8: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| case 9: | |
| dummy := 0 | |
| _ = dummy | |
| fallthrough | |
| default: | |
| dummy := 0 | |
| _ = dummy | |
| fired = !fired | |
| assert(i5 == 5, "good") | |
| } | |
| assert(fired, "fired") | |
| count := 0 | |
| switch i5 { | |
| case 0: | |
| count = count + 1 | |
| fallthrough | |
| case 1: | |
| count = count + 1 | |
| fallthrough | |
| case 2: | |
| count = count + 1 | |
| fallthrough | |
| case 3: | |
| count = count + 1 | |
| fallthrough | |
| case 4: | |
| count = count + 1 | |
| assert(false, "4") | |
| case 5: | |
| count = count + 1 | |
| fallthrough | |
| case 6: | |
| count = count + 1 | |
| fallthrough | |
| case 7: | |
| count = count + 1 | |
| fallthrough | |
| case 8: | |
| count = count + 1 | |
| fallthrough | |
| case 9: | |
| count = count + 1 | |
| fallthrough | |
| default: | |
| assert(i5 == count, "good") | |
| } | |
| assert(fired, "fired") | |
| switch hello { | |
| case "wowie": | |
| assert(false, "wowie") | |
| case "hello": | |
| assert(true, "hello") | |
| case "jumpn": | |
| assert(false, "jumpn") | |
| default: | |
| assert(false, "default") | |
| } | |
| fired = false | |
| switch i := i5 + 2; i { | |
| case i7: | |
| fired = true | |
| default: | |
| assert(false, "fail") | |
| } | |
| assert(fired, "var") | |
| // switch on nil-only comparison types | |
| switch f := func() {}; f { | |
| case nil: | |
| assert(false, "f should not be nil") | |
| default: | |
| } | |
| switch m := make(map[int]int); m { | |
| case nil: | |
| assert(false, "m should not be nil") | |
| default: | |
| } | |
| switch a := make([]int, 1); a { | |
| case nil: | |
| assert(false, "m should not be nil") | |
| default: | |
| } | |
| // switch on interface. | |
| switch i := interface{}("hello"); i { | |
| case 42: | |
| assert(false, `i should be "hello"`) | |
| case "hello": | |
| assert(true, "hello") | |
| default: | |
| assert(false, `i should be "hello"`) | |
| } | |
| // switch on implicit bool converted to interface | |
| // was broken: see issue 3980 | |
| switch i := interface{}(true); { | |
| case i: | |
| assert(true, "true") | |
| case false: | |
| assert(false, "i should be true") | |
| default: | |
| assert(false, "i should be true") | |
| } | |
| // switch on interface with constant cases differing by type. | |
| // was rejected by compiler: see issue 4781 | |
| type T int | |
| type B bool | |
| type F float64 | |
| type S string | |
| switch i := interface{}(float64(1.0)); i { | |
| case nil: | |
| assert(false, "i should be float64(1.0)") | |
| case (*int)(nil): | |
| assert(false, "i should be float64(1.0)") | |
| case 1: | |
| assert(false, "i should be float64(1.0)") | |
| case T(1): | |
| assert(false, "i should be float64(1.0)") | |
| case F(1.0): | |
| assert(false, "i should be float64(1.0)") | |
| case 1.0: | |
| assert(true, "true") | |
| case "hello": | |
| assert(false, "i should be float64(1.0)") | |
| case S("hello"): | |
| assert(false, "i should be float64(1.0)") | |
| case true, B(false): | |
| assert(false, "i should be float64(1.0)") | |
| case false, B(true): | |
| assert(false, "i should be float64(1.0)") | |
| } | |
| // switch on array. | |
| switch ar := [3]int{1, 2, 3}; ar { | |
| case [3]int{1, 2, 3}: | |
| assert(true, "[1 2 3]") | |
| case [3]int{4, 5, 6}: | |
| assert(false, "ar should be [1 2 3]") | |
| default: | |
| assert(false, "ar should be [1 2 3]") | |
| } | |
| // switch on channel | |
| switch c1, c2 := make(chan int), make(chan int); c1 { | |
| case nil: | |
| assert(false, "c1 did not match itself") | |
| case c2: | |
| assert(false, "c1 did not match itself") | |
| case c1: | |
| assert(true, "chan") | |
| default: | |
| assert(false, "c1 did not match itself") | |
| } | |
| // empty switch | |
| switch { | |
| } | |
| // empty switch with default case. | |
| fired = false | |
| switch { | |
| default: | |
| fired = true | |
| } | |
| assert(fired, "fail") | |
| // Default and fallthrough. | |
| count = 0 | |
| switch { | |
| default: | |
| count++ | |
| fallthrough | |
| case false: | |
| count++ | |
| } | |
| assert(count == 2, "fail") | |
| // fallthrough to default, which is not at end. | |
| count = 0 | |
| switch i5 { | |
| case 5: | |
| count++ | |
| fallthrough | |
| default: | |
| count++ | |
| case 6: | |
| count++ | |
| } | |
| assert(count == 2, "fail") | |
| i := 0 | |
| switch x := 5; { | |
| case i < x: | |
| os.Exit(0) | |
| case i == x: | |
| case i > x: | |
| os.Exit(1) | |
| } | |
| } |