// $G $F.go && $L $F.$A && ./$A.out

// 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.

package main

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")
}