// $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; fallthrough;
	case 1: dummy := 0; fallthrough;
	case 2: dummy := 0; fallthrough;
	case 3: dummy := 0; fallthrough;
	case 4: dummy := 0; assert(false, "4");
	case 5: dummy := 0; fallthrough;
	case 6: dummy := 0; fallthrough;
	case 7: dummy := 0; fallthrough;
	case 8: dummy := 0; fallthrough;
	case 9: dummy := 0; fallthrough;
	default: dummy := 0; assert(i5 == 5, "good");
	}

	fired := false;
	switch i5 {
	case 0: dummy := 0; fallthrough;  // tests scoping of cases
	case 1: dummy := 0; fallthrough;
	case 2: dummy := 0; fallthrough;
	case 3: dummy := 0; fallthrough;
	case 4: dummy := 0; assert(false, "4");
	case 5: dummy := 0; fallthrough;
	case 6: dummy := 0; fallthrough;
	case 7: dummy := 0; fallthrough;
	case 8: dummy := 0; fallthrough;
	case 9: dummy := 0; fallthrough;
	default: dummy := 0; 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");
}
