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