]> Cypherpunks repositories - gostls13.git/commitdiff
Test case for evaluation order of select statement.
authorIan Lance Taylor <iant@golang.org>
Fri, 7 Nov 2008 06:27:32 +0000 (22:27 -0800)
committerIan Lance Taylor <iant@golang.org>
Fri, 7 Nov 2008 06:27:32 +0000 (22:27 -0800)
R=r
DELTA=47  (47 added, 0 deleted, 0 changed)
OCL=18581
CL=18748

test/chan/select.go [new file with mode: 0644]

diff --git a/test/chan/select.go b/test/chan/select.go
new file mode 100644 (file)
index 0000000..470e151
--- /dev/null
@@ -0,0 +1,51 @@
+// $G $D/$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
+
+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 := new(chan uint, 1);
+  b := new(chan uint, 1);
+  if v := Send(a, b); v != 2 {
+    panicln("Send returned", v, "!= 2");
+  }
+  if av, bv := <- a, <- b; av | bv != 3 {
+    panicln("bad values", av, bv);
+  }
+  if v := Send(a, nil); v != 1 {
+    panicln("Send returned", v, "!= 1");
+  }
+  if counter != 10 {
+    panicln("counter is", counter, "!= 10");
+  }
+}