use circular_buffer::{CircularBuffer, Error}; use std::rc::Rc; #[test] fn error_on_read_empty_buffer() { let mut buffer = CircularBuffer::::new(1); assert_eq!(Err(Error::EmptyBuffer), buffer.read()); } #[test] #[ignore] fn can_read_item_just_written() { let mut buffer = CircularBuffer::new(1); assert!(buffer.write('1').is_ok()); assert_eq!(Ok('1'), buffer.read()); } #[test] #[ignore] fn each_item_may_only_be_read_once() { let mut buffer = CircularBuffer::new(1); assert!(buffer.write('1').is_ok()); assert_eq!(Ok('1'), buffer.read()); assert_eq!(Err(Error::EmptyBuffer), buffer.read()); } #[test] #[ignore] fn items_are_read_in_the_order_they_are_written() { let mut buffer = CircularBuffer::new(2); assert!(buffer.write('1').is_ok()); assert!(buffer.write('2').is_ok()); assert_eq!(Ok('1'), buffer.read()); assert_eq!(Ok('2'), buffer.read()); assert_eq!(Err(Error::EmptyBuffer), buffer.read()); } #[test] #[ignore] fn full_buffer_cant_be_written_to() { let mut buffer = CircularBuffer::new(1); assert!(buffer.write('1').is_ok()); assert_eq!(Err(Error::FullBuffer), buffer.write('2')); } #[test] #[ignore] fn read_frees_up_capacity_for_another_write() { let mut buffer = CircularBuffer::new(1); assert!(buffer.write('1').is_ok()); assert_eq!(Ok('1'), buffer.read()); assert!(buffer.write('2').is_ok()); assert_eq!(Ok('2'), buffer.read()); } #[test] #[ignore] fn read_position_is_maintained_even_across_multiple_writes() { let mut buffer = CircularBuffer::new(3); assert!(buffer.write('1').is_ok()); assert!(buffer.write('2').is_ok()); assert_eq!(Ok('1'), buffer.read()); assert!(buffer.write('3').is_ok()); assert_eq!(Ok('2'), buffer.read()); assert_eq!(Ok('3'), buffer.read()); } #[test] #[ignore] fn items_cleared_out_of_buffer_cant_be_read() { let mut buffer = CircularBuffer::new(1); assert!(buffer.write('1').is_ok()); buffer.clear(); assert_eq!(Err(Error::EmptyBuffer), buffer.read()); } #[test] #[ignore] fn clear_frees_up_capacity_for_another_write() { let mut buffer = CircularBuffer::new(1); assert!(buffer.write('1').is_ok()); buffer.clear(); assert!(buffer.write('2').is_ok()); assert_eq!(Ok('2'), buffer.read()); } #[test] #[ignore] fn clear_does_nothing_on_empty_buffer() { let mut buffer = CircularBuffer::new(1); buffer.clear(); assert!(buffer.write('1').is_ok()); assert_eq!(Ok('1'), buffer.read()); } #[test] #[ignore] fn clear_actually_frees_up_its_elements() { let mut buffer = CircularBuffer::new(1); let element = Rc::new(()); assert!(buffer.write(Rc::clone(&element)).is_ok()); assert_eq!(Rc::strong_count(&element), 2); buffer.clear(); assert_eq!(Rc::strong_count(&element), 1); } #[test] #[ignore] fn overwrite_acts_like_write_on_non_full_buffer() { let mut buffer = CircularBuffer::new(2); assert!(buffer.write('1').is_ok()); buffer.overwrite('2'); assert_eq!(Ok('1'), buffer.read()); assert_eq!(Ok('2'), buffer.read()); assert_eq!(Err(Error::EmptyBuffer), buffer.read()); } #[test] #[ignore] fn overwrite_replaces_the_oldest_item_on_full_buffer() { let mut buffer = CircularBuffer::new(2); assert!(buffer.write('1').is_ok()); assert!(buffer.write('2').is_ok()); buffer.overwrite('A'); assert_eq!(Ok('2'), buffer.read()); assert_eq!(Ok('A'), buffer.read()); } #[test] #[ignore] fn overwrite_replaces_the_oldest_item_remaining_in_buffer_following_a_read() { let mut buffer = CircularBuffer::new(3); assert!(buffer.write('1').is_ok()); assert!(buffer.write('2').is_ok()); assert!(buffer.write('3').is_ok()); assert_eq!(Ok('1'), buffer.read()); assert!(buffer.write('4').is_ok()); buffer.overwrite('5'); assert_eq!(Ok('3'), buffer.read()); assert_eq!(Ok('4'), buffer.read()); assert_eq!(Ok('5'), buffer.read()); } #[test] #[ignore] fn integer_buffer() { let mut buffer = CircularBuffer::new(2); assert!(buffer.write(1).is_ok()); assert!(buffer.write(2).is_ok()); assert_eq!(Ok(1), buffer.read()); assert!(buffer.write(-1).is_ok()); assert_eq!(Ok(2), buffer.read()); assert_eq!(Ok(-1), buffer.read()); assert_eq!(Err(Error::EmptyBuffer), buffer.read()); } #[test] #[ignore] fn string_buffer() { let mut buffer = CircularBuffer::new(2); buffer.write("".to_string()).unwrap(); buffer.write("Testing".to_string()).unwrap(); assert_eq!(0, buffer.read().unwrap().len()); assert_eq!(Ok("Testing".to_string()), buffer.read()); }