1// run
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
7// Test simple select.
8
9package main
10
11var counter uint
12var shift uint
13
14func GetValue() uint {
15	counter++
16	return 1 << shift
17}
18
19func Send(a, b chan uint) int {
20	var i int
21
22LOOP:
23	for {
24		select {
25		case a <- GetValue():
26			i++
27			a = nil
28		case b <- GetValue():
29			i++
30			b = nil
31		default:
32			break LOOP
33		}
34		shift++
35	}
36	return i
37}
38
39func main() {
40	a := make(chan uint, 1)
41	b := make(chan uint, 1)
42	if v := Send(a, b); v != 2 {
43		println("Send returned", v, "!= 2")
44		panic("fail")
45	}
46	if av, bv := <-a, <-b; av|bv != 3 {
47		println("bad values", av, bv)
48		panic("fail")
49	}
50	if v := Send(a, nil); v != 1 {
51		println("Send returned", v, "!= 1")
52		panic("fail")
53	}
54	if counter != 10 {
55		println("counter is", counter, "!= 10")
56		panic("fail")
57	}
58}
59