// $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.

// Verify channel operations that test for blocking
// Use several sizes and types of operands

package main

import "runtime"
import "time"

func i32receiver(c chan int32, strobe chan bool) {
	if <-c != 123 {
		panic("i32 value")
	}
	strobe <- true
}

func i32sender(c chan int32, strobe chan bool) {
	c <- 234
	strobe <- true
}

func i64receiver(c chan int64, strobe chan bool) {
	if <-c != 123456 {
		panic("i64 value")
	}
	strobe <- true
}

func i64sender(c chan int64, strobe chan bool) {
	c <- 234567
	strobe <- true
}

func breceiver(c chan bool, strobe chan bool) {
	if !<-c {
		panic("b value")
	}
	strobe <- true
}

func bsender(c chan bool, strobe chan bool) {
	c <- true
	strobe <- true
}

func sreceiver(c chan string, strobe chan bool) {
	if <-c != "hello" {
		panic("s value")
	}
	strobe <- true
}

func ssender(c chan string, strobe chan bool) {
	c <- "hello again"
	strobe <- true
}

var ticker = time.Tick(10 * 1000) // 10 us
func sleep() {
	<-ticker
	<-ticker
	runtime.Gosched()
	runtime.Gosched()
	runtime.Gosched()
}

func main() {
	var i32 int32
	var i64 int64
	var b bool
	var s string
	var ok bool

	var sync = make(chan bool)

	for buffer := 0; buffer < 2; buffer++ {
		c32 := make(chan int32, buffer)
		c64 := make(chan int64, buffer)
		cb := make(chan bool, buffer)
		cs := make(chan string, buffer)

		i32, ok = <-c32
		if ok {
			panic("blocked i32sender")
		}

		i64, ok = <-c64
		if ok {
			panic("blocked i64sender")
		}

		b, ok = <-cb
		if ok {
			panic("blocked bsender")
		}

		s, ok = <-cs
		if ok {
			panic("blocked ssender")
		}

		go i32receiver(c32, sync)
		sleep()
		ok = c32 <- 123
		if !ok {
			println("i32receiver buffer=", buffer)
			panic("fail")
		}
		<-sync

		go i32sender(c32, sync)
		if buffer > 0 {
			<-sync
		} else {
			sleep()
		}
		i32, ok = <-c32
		if !ok {
			println("i32sender buffer=", buffer)
			panic("fail")
		}
		if i32 != 234 {
			panic("i32sender value")
		}
		if buffer == 0 {
			<-sync
		}

		go i64receiver(c64, sync)
		sleep()
		ok = c64 <- 123456
		if !ok {
			panic("i64receiver")
		}
		<-sync

		go i64sender(c64, sync)
		if buffer > 0 {
			<-sync
		} else {
			sleep()
		}
		i64, ok = <-c64
		if !ok {
			panic("i64sender")
		}
		if i64 != 234567 {
			panic("i64sender value")
		}
		if buffer == 0 {
			<-sync
		}

		go breceiver(cb, sync)
		sleep()
		ok = cb <- true
		if !ok {
			panic("breceiver")
		}
		<-sync

		go bsender(cb, sync)
		if buffer > 0 {
			<-sync
		} else {
			sleep()
		}
		b, ok = <-cb
		if !ok {
			panic("bsender")
		}
		if !b {
			panic("bsender value")
		}
		if buffer == 0 {
			<-sync
		}

		go sreceiver(cs, sync)
		sleep()
		ok = cs <- "hello"
		if !ok {
			panic("sreceiver")
		}
		<-sync

		go ssender(cs, sync)
		if buffer > 0 {
			<-sync
		} else {
			sleep()
		}
		s, ok = <-cs
		if !ok {
			panic("ssender")
		}
		if s != "hello again" {
			panic("ssender value")
		}
		if buffer == 0 {
			<-sync
		}
	}
	print("PASS\n")
}
