// -*- 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::(); 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: