summaryrefslogtreecommitdiff
path: root/test/closedchan.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/closedchan.go')
-rw-r--r--test/closedchan.go330
1 files changed, 0 insertions, 330 deletions
diff --git a/test/closedchan.go b/test/closedchan.go
deleted file mode 100644
index 95314b334..000000000
--- a/test/closedchan.go
+++ /dev/null
@@ -1,330 +0,0 @@
-// $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.
-
-// Test close(c), receive of closed channel.
-//
-// TODO(rsc): Doesn't check behavior of close(c) when there
-// are blocked senders/receivers.
-
-package main
-
-type Chan interface {
- Send(int)
- Nbsend(int) bool
- Recv() (int)
- Nbrecv() (int, bool)
- Recv2() (int, bool)
- Nbrecv2() (int, bool, bool)
- Close()
- Impl() string
-}
-
-// direct channel operations when possible
-type XChan chan int
-
-func (c XChan) Send(x int) {
- c <- x
-}
-
-func (c XChan) Nbsend(x int) bool {
- select {
- case c <- x:
- return true
- default:
- return false
- }
- panic("nbsend")
-}
-
-func (c XChan) Recv() int {
- return <-c
-}
-
-func (c XChan) Nbrecv() (int, bool) {
- select {
- case x := <-c:
- return x, true
- default:
- return 0, false
- }
- panic("nbrecv")
-}
-
-func (c XChan) Recv2() (int, bool) {
- x, ok := <-c
- return x, ok
-}
-
-func (c XChan) Nbrecv2() (int, bool, bool) {
- select {
- case x, ok := <-c:
- return x, ok, true
- default:
- return 0, false, false
- }
- panic("nbrecv2")
-}
-
-func (c XChan) Close() {
- close(c)
-}
-
-func (c XChan) Impl() string {
- return "(<- operator)"
-}
-
-// indirect operations via select
-type SChan chan int
-
-func (c SChan) Send(x int) {
- select {
- case c <- x:
- }
-}
-
-func (c SChan) Nbsend(x int) bool {
- select {
- default:
- return false
- case c <- x:
- return true
- }
- panic("nbsend")
-}
-
-func (c SChan) Recv() int {
- select {
- case x := <-c:
- return x
- }
- panic("recv")
-}
-
-func (c SChan) Nbrecv() (int, bool) {
- select {
- default:
- return 0, false
- case x := <-c:
- return x, true
- }
- panic("nbrecv")
-}
-
-func (c SChan) Recv2() (int, bool) {
- select {
- case x, ok := <-c:
- return x, ok
- }
- panic("recv")
-}
-
-func (c SChan) Nbrecv2() (int, bool, bool) {
- select {
- default:
- return 0, false, false
- case x, ok := <-c:
- return x, ok, true
- }
- panic("nbrecv")
-}
-
-func (c SChan) Close() {
- close(c)
-}
-
-func (c SChan) Impl() string {
- return "(select)"
-}
-
-// indirect operations via larger selects
-var dummy = make(chan bool)
-
-type SSChan chan int
-
-func (c SSChan) Send(x int) {
- select {
- case c <- x:
- case <-dummy:
- }
-}
-
-func (c SSChan) Nbsend(x int) bool {
- select {
- default:
- return false
- case <-dummy:
- case c <- x:
- return true
- }
- panic("nbsend")
-}
-
-func (c SSChan) Recv() int {
- select {
- case <-dummy:
- case x := <-c:
- return x
- }
- panic("recv")
-}
-
-func (c SSChan) Nbrecv() (int, bool) {
- select {
- case <-dummy:
- default:
- return 0, false
- case x := <-c:
- return x, true
- }
- panic("nbrecv")
-}
-
-func (c SSChan) Recv2() (int, bool) {
- select {
- case <-dummy:
- case x, ok := <-c:
- return x, ok
- }
- panic("recv")
-}
-
-func (c SSChan) Nbrecv2() (int, bool, bool) {
- select {
- case <-dummy:
- default:
- return 0, false, false
- case x, ok := <-c:
- return x, ok, true
- }
- panic("nbrecv")
-}
-
-func (c SSChan) Close() {
- close(c)
-}
-
-func (c SSChan) Impl() string {
- return "(select)"
-}
-
-
-func shouldPanic(f func()) {
- defer func() {
- if recover() == nil {
- panic("did not panic")
- }
- }()
- f()
-}
-
-func test1(c Chan) {
- for i := 0; i < 3; i++ {
- // recv a close signal (a zero value)
- if x := c.Recv(); x != 0 {
- println("test1: recv on closed:", x, c.Impl())
- }
- if x, ok := c.Recv2(); x != 0 || ok {
- println("test1: recv2 on closed:", x, ok, c.Impl())
- }
-
- // should work with select: received a value without blocking, so selected == true.
- x, selected := c.Nbrecv()
- if x != 0 || !selected {
- println("test1: recv on closed nb:", x, selected, c.Impl())
- }
- x, ok, selected := c.Nbrecv2()
- if x != 0 || ok || !selected {
- println("test1: recv2 on closed nb:", x, ok, selected, c.Impl())
- }
- }
-
- // send should work with ,ok too: sent a value without blocking, so ok == true.
- shouldPanic(func() { c.Nbsend(1) })
-
- // the value should have been discarded.
- if x := c.Recv(); x != 0 {
- println("test1: recv on closed got non-zero after send on closed:", x, c.Impl())
- }
-
- // similarly Send.
- shouldPanic(func() { c.Send(2) })
- if x := c.Recv(); x != 0 {
- println("test1: recv on closed got non-zero after send on closed:", x, c.Impl())
- }
-}
-
-func testasync1(c Chan) {
- // should be able to get the last value via Recv
- if x := c.Recv(); x != 1 {
- println("testasync1: Recv did not get 1:", x, c.Impl())
- }
-
- test1(c)
-}
-
-func testasync2(c Chan) {
- // should be able to get the last value via Recv2
- if x, ok := c.Recv2(); x != 1 || !ok {
- println("testasync1: Recv did not get 1, true:", x, ok, c.Impl())
- }
-
- test1(c)
-}
-
-func testasync3(c Chan) {
- // should be able to get the last value via Nbrecv
- if x, selected := c.Nbrecv(); x != 1 || !selected {
- println("testasync2: Nbrecv did not get 1, true:", x, selected, c.Impl())
- }
-
- test1(c)
-}
-
-func testasync4(c Chan) {
- // should be able to get the last value via Nbrecv2
- if x, ok, selected := c.Nbrecv2(); x != 1 || !ok || !selected {
- println("testasync2: Nbrecv did not get 1, true, true:", x, ok, selected, c.Impl())
- }
- test1(c)
-}
-
-func closedsync() chan int {
- c := make(chan int)
- close(c)
- return c
-}
-
-func closedasync() chan int {
- c := make(chan int, 2)
- c <- 1
- close(c)
- return c
-}
-
-var mks = []func(chan int) Chan {
- func(c chan int) Chan { return XChan(c) },
- func(c chan int) Chan { return SChan(c) },
- func(c chan int) Chan { return SSChan(c) },
-}
-
-var testcloseds = []func(Chan) {
- testasync1,
- testasync2,
- testasync3,
- testasync4,
-}
-
-func main() {
- for _, mk := range mks {
- test1(mk(closedsync()))
- }
-
- for _, testclosed := range testcloseds {
- for _, mk := range mks {
- testclosed(mk(closedasync()))
- }
- }
-}