68 lines
865 B
V
68 lines
865 B
V
|
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{}
|
||
|
go f(ch)
|
||
|
mut j := 0
|
||
|
for {
|
||
|
ch <- j or {
|
||
|
break
|
||
|
}
|
||
|
j++
|
||
|
}
|
||
|
assert j == n
|
||
|
}
|
||
|
|
||
|
fn test_push_or_buffered() {
|
||
|
ch := chan int{cap: c}
|
||
|
go 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{}
|
||
|
go g(ch, res)
|
||
|
go g(ch, res)
|
||
|
go 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
|
||
|
}
|