const n = 1000

const c = 100

fn f(ch chan int) {
	for _ in 0 .. n {
		_ := <-ch
	}
	ch.close()
}

fn test_push_or_unbuffered() {
	ch := chan int{}
	spawn f(ch)
	mut j := 0
	for {
		ch <- j or { break }

		j++
	}
	assert j == n
}

fn test_push_or_buffered() {
	ch := chan int{cap: c}
	spawn f(ch)
	mut j := 0
	for {
		ch <- j or { break }

		j++
	}
	// we don't know how many elements are in the buffer when the channel
	// is closed, so check j against an interval
	assert j >= n
	assert j <= n + c
}

fn g(ch chan int, res chan int) {
	mut j := 0
	for {
		ch <- j or { break }

		j++
	}
	println('done ${j}')
	res <- j
}

fn test_many_senders() {
	ch := chan int{}
	res := chan int{}
	spawn g(ch, res)
	spawn g(ch, res)
	spawn g(ch, res)
	mut k := 0
	for _ in 0 .. 3 * n {
		k = <-ch
	}
	ch.close()
	mut sum := <-res
	sum += <-res
	sum += <-res
	assert sum == 3 * n
}
