| // 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 simple select. | 
 |  | 
 | package main | 
 |  | 
 | var counter uint | 
 | var shift uint | 
 |  | 
 | func GetValue() uint { | 
 | 	counter++ | 
 | 	return 1 << shift | 
 | } | 
 |  | 
 | func Send(a, b chan uint) int { | 
 | 	var i int | 
 |  | 
 | LOOP: | 
 | 	for { | 
 | 		select { | 
 | 		case a <- GetValue(): | 
 | 			i++ | 
 | 			a = nil | 
 | 		case b <- GetValue(): | 
 | 			i++ | 
 | 			b = nil | 
 | 		default: | 
 | 			break LOOP | 
 | 		} | 
 | 		shift++ | 
 | 	} | 
 | 	return i | 
 | } | 
 |  | 
 | func main() { | 
 | 	a := make(chan uint, 1) | 
 | 	b := make(chan uint, 1) | 
 | 	if v := Send(a, b); v != 2 { | 
 | 		println("Send returned", v, "!= 2") | 
 | 		panic("fail") | 
 | 	} | 
 | 	if av, bv := <-a, <-b; av|bv != 3 { | 
 | 		println("bad values", av, bv) | 
 | 		panic("fail") | 
 | 	} | 
 | 	if v := Send(a, nil); v != 1 { | 
 | 		println("Send returned", v, "!= 1") | 
 | 		panic("fail") | 
 | 	} | 
 | 	if counter != 10 { | 
 | 		println("counter is", counter, "!= 10") | 
 | 		panic("fail") | 
 | 	} | 
 | } |