1 | fn do_rec_i64(ch chan i64, sumch chan i64) { |
2 | mut sum := i64(0) |
3 | for _ in 0 .. 30000 { |
4 | sum += <-ch |
5 | } |
6 | sumch <- sum |
7 | } |
8 | |
9 | fn do_send_int(ch chan int) { |
10 | for i in 0 .. 30000 { |
11 | ch <- i |
12 | } |
13 | } |
14 | |
15 | fn test_select() { |
16 | chi := chan int{cap: 10} |
17 | recch := chan i64{cap: 10} |
18 | chsum := chan i64{} |
19 | spawn do_rec_i64(recch, chsum) |
20 | spawn do_send_int(chi) |
21 | mut sum := i64(0) |
22 | mut sl := i64(0) |
23 | for _ in 0 .. 60000 + recch.cap { |
24 | select { |
25 | ri := <-chi { |
26 | sum += ri |
27 | } |
28 | recch <- sl { |
29 | sl++ |
30 | } |
31 | } |
32 | } |
33 | // Use Gauß' formula |
34 | expected_sum := i64(30000) * (30000 - 1) / 2 |
35 | assert sum == expected_sum |
36 | |
37 | mut sumrec := <-chsum |
38 | // Empty receive buffer |
39 | for _ in 0 .. recch.cap { |
40 | sumrec += <-recch |
41 | } |
42 | assert sumrec == i64(30000 + recch.cap) * (30000 + recch.cap - 1) / 2 |
43 | } |