extern crate indexed_ring_buffer; use indexed_ring_buffer::{indexed_ring_buffer, Consumer, Producer, Reader}; #[test] fn test_minimum() { let (mut prod, mut cons, read) = indexed_ring_buffer::(0, 1); assert!(prod.push(0)); assert_eq!(cons.shift(), Some((0, 0))); assert!(prod.push(1)); assert_eq!(cons.shift(), Some((1, 1))); assert!(prod.push(2)); assert_eq!(cons.shift(), Some((2, 2))); } #[test] fn test_create() { let (mut prod, mut cons, read) = indexed_ring_buffer::(0, 10); assert!(prod.is_empty()); assert!(cons.is_empty()); assert!(read.is_empty()); assert!(!prod.is_full()); assert!(!cons.is_full()); assert!(!read.is_full()); } #[test] fn test_queue() { let (mut prod, mut cons, read) = indexed_ring_buffer::(0, 5); assert!(prod.push(0)); assert!(prod.push(1)); assert!(prod.push(2)); assert!(prod.push(3)); assert!(prod.push(4)); assert_eq!(read.get(3), Some((3, 3))); assert_eq!(read.get_all(), Some((0, 4, [0, 1, 2, 3, 4].to_vec()))); assert_eq!(read.get_from(1, 3), Some((1, 3, [1, 2, 3].to_vec()))); assert_eq!(read.get_from(1, 1), Some((1, 1, [1].to_vec()))); assert_eq!(read.get_from(1, 2), Some((1, 2, [1, 2].to_vec()))); assert_eq!(read.get_from(1, 4), Some((1, 4, [1, 2, 3, 4].to_vec()))); assert_eq!(cons.shift_to(3), Some((3_usize, vec![0, 1, 2, 3]))); assert_eq!(cons.shift_to(13), None); assert_eq!(cons.shift(), Some((4, 4))); assert_eq!(cons.shift(), None); } #[test] fn test_full_and_empty() { let (mut prod, mut cons, read) = indexed_ring_buffer::(0, 5); assert!(prod.push(0)); assert!(prod.push(1)); assert!(prod.push(2)); assert!(prod.push(3)); assert!(!prod.is_empty()); assert!(!cons.is_empty()); assert!(!read.is_empty()); assert!(!prod.is_full()); assert!(!cons.is_full()); assert!(!read.is_full()); assert!(prod.push(4)); assert!(prod.is_full()); assert!(cons.is_full()); assert!(read.is_full()); assert_eq!(cons.shift(), Some((0, 0))); assert!(!prod.is_full()); assert!(!cons.is_full()); assert!(!read.is_full()); assert_eq!(cons.shift_to(2), Some((2_usize, vec![1, 2]))); assert_eq!(cons.shift(), Some((3, 3))); assert_eq!(cons.shift(), Some((4, 4))); assert!(prod.is_empty()); assert!(cons.is_empty()); assert!(read.is_empty()); assert!(!prod.is_full()); assert!(!cons.is_full()); assert!(!read.is_full()); } #[test] fn test_wrapping_add() { let mut n = usize::max_value() - 4; let (mut prod, mut cons, read) = indexed_ring_buffer::(n, 10); assert!(prod.push(n)); n = n.wrapping_add(1); assert!(prod.push(n)); n = n.wrapping_add(1); assert!(prod.push(n)); n = n.wrapping_add(1); assert!(prod.push(n)); n = n.wrapping_add(1); assert!(prod.push(n)); n = n.wrapping_add(1); assert!(prod.push(n)); n = n.wrapping_add(1); assert!(prod.push(n)); n = n.wrapping_add(1); assert!(prod.push(n)); n = n.wrapping_add(1); assert!(prod.push(n)); assert_eq!( read.get(18446744073709551611), Some((18446744073709551611, 18446744073709551611)) ); assert_eq!( read.get(18446744073709551612), Some((18446744073709551612, 18446744073709551612)) ); assert_eq!( read.get(18446744073709551613), Some((18446744073709551613, 18446744073709551613)) ); assert_eq!( read.get(18446744073709551614), Some((18446744073709551614, 18446744073709551614)) ); assert_eq!( read.get(18446744073709551615), Some((18446744073709551615, 18446744073709551615)) ); assert_eq!(read.get(0), Some((0, 0))); assert_eq!(read.get(1), Some((1, 1))); assert_eq!(read.get(2), Some((2, 2))); assert_eq!(read.get(3), Some((3, 3))); }