exercism-rust/circular-buffer/tests/circular-buffer.rs
2023-08-21 13:50:14 -04:00

165 lines
4.5 KiB
Rust

use circular_buffer::{CircularBuffer, Error};
use std::rc::Rc;
#[test]
fn error_on_read_empty_buffer() {
let mut buffer = CircularBuffer::<char>::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());
}