| // -*- rust -*- |
| |
| // Regression tests for circular_buffer when using a unit |
| // that has a size that is not a power of two |
| extern mod std; |
| use comm::Port; |
| use comm::Chan; |
| use comm::send; |
| use comm::recv; |
| |
| // A 12-byte unit to send over the channel |
| type record = {val1: u32, val2: u32, val3: u32}; |
| |
| |
| // Assuming that the default buffer size needs to hold 8 units, |
| // then the minimum buffer size needs to be 96. That's not a |
| // power of two so needs to be rounded up. Don't trigger any |
| // assertions. |
| fn test_init() { |
| let myport = Port(); |
| let mychan = Chan(&myport); |
| let val: record = {val1: 0u32, val2: 0u32, val3: 0u32}; |
| send(mychan, val); |
| } |
| |
| |
| // Dump lots of items into the channel so it has to grow. |
| // Don't trigger any assertions. |
| fn test_grow() { |
| let myport = Port(); |
| let mychan = Chan(&myport); |
| for uint::range(0u, 100u) |i| { |
| let val: record = {val1: 0u32, val2: 0u32, val3: 0u32}; |
| comm::send(mychan, val); |
| } |
| } |
| |
| |
| // Don't allow the buffer to shrink below it's original size |
| fn test_shrink1() { |
| let myport = Port(); |
| let mychan = Chan(&myport); |
| send(mychan, 0i8); |
| let x = recv(myport); |
| } |
| |
| fn test_shrink2() { |
| let myport = Port(); |
| let mychan = Chan(&myport); |
| for uint::range(0u, 100u) |_i| { |
| let val: record = {val1: 0u32, val2: 0u32, val3: 0u32}; |
| send(mychan, val); |
| } |
| for uint::range(0u, 100u) |_i| { let x = recv(myport); } |
| } |
| |
| |
| // Test rotating the buffer when the unit size is not a power of two |
| fn test_rotate() { |
| let myport = Port(); |
| let mychan = Chan(&myport); |
| for uint::range(0u, 100u) |i| { |
| let val = {val1: i as u32, val2: i as u32, val3: i as u32}; |
| send(mychan, val); |
| let x = recv(myport); |
| assert (x.val1 == i as u32); |
| assert (x.val2 == i as u32); |
| assert (x.val3 == i as u32); |
| } |
| } |
| |
| |
| // Test rotating and growing the buffer when |
| // the unit size is not a power of two |
| fn test_rotate_grow() { |
| let myport = Port::<record>(); |
| let mychan = Chan(&myport); |
| for uint::range(0u, 10u) |j| { |
| for uint::range(0u, 10u) |i| { |
| let val: record = |
| {val1: i as u32, val2: i as u32, val3: i as u32}; |
| send(mychan, val); |
| } |
| for uint::range(0u, 10u) |i| { |
| let x = recv(myport); |
| assert (x.val1 == i as u32); |
| assert (x.val2 == i as u32); |
| assert (x.val3 == i as u32); |
| } |
| } |
| } |
| |
| fn main() { |
| test_init(); |
| test_grow(); |
| test_shrink1(); |
| test_shrink2(); |
| test_rotate(); |
| test_rotate_grow(); |
| } |
| // Local Variables: |
| // mode: rust; |
| // fill-column: 78; |
| // indent-tabs-mode: nil |
| // c-basic-offset: 4 |
| // buffer-file-coding-system: utf-8-unix |
| // End: |