| 1 | import time |
| 2 | |
| 3 | fn do_rec_i64(ch chan i64) { |
| 4 | mut sum := i64(0) |
| 5 | for _ in 0 .. 300 { |
| 6 | sum += <-ch |
| 7 | } |
| 8 | assert sum == 300 * (300 - 1) / 2 |
| 9 | } |
| 10 | |
| 11 | fn do_send_int(ch chan int) { |
| 12 | for i in 0 .. 300 { |
| 13 | ch <- i |
| 14 | } |
| 15 | } |
| 16 | |
| 17 | fn do_send_u8(ch chan u8) { |
| 18 | for i in 0 .. 300 { |
| 19 | ch <- u8(i) |
| 20 | } |
| 21 | } |
| 22 | |
| 23 | fn do_send_i64(ch chan i64) { |
| 24 | for i in 0 .. 300 { |
| 25 | ch <- i |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | fn test_select() { |
| 30 | chi := chan int{} |
| 31 | chl := chan i64{cap: 1} |
| 32 | chb := chan u8{cap: 10} |
| 33 | recch := chan i64{cap: 0} |
| 34 | spawn do_rec_i64(recch) |
| 35 | spawn do_send_int(chi) |
| 36 | spawn do_send_u8(chb) |
| 37 | spawn do_send_i64(chl) |
| 38 | mut sum := i64(0) |
| 39 | mut rl := i64(0) |
| 40 | mut sl := i64(0) |
| 41 | for _ in 0 .. 1200 { |
| 42 | select { |
| 43 | ri := <-chi { |
| 44 | sum += ri |
| 45 | } |
| 46 | recch <- sl { |
| 47 | sl++ |
| 48 | } |
| 49 | rl = <-chl { |
| 50 | sum += rl |
| 51 | } |
| 52 | rb := <-chb { |
| 53 | sum += rb |
| 54 | } |
| 55 | } |
| 56 | } |
| 57 | // Use Gauß' formula for the first 2 contributions |
| 58 | // the 3rd contribution is `byte` and must be seen modulo 256 |
| 59 | expected_sum := 2 * (300 * (300 - 1) / 2) + 256 * (256 - 1) / 2 + 44 * (44 - 1) / 2 |
| 60 | assert sum == expected_sum |
| 61 | time.sleep(20 * time.millisecond) // to give assert in coroutine enough time |
| 62 | } |
| 63 | |