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