use qubit_io::Buffer;
#[test]
fn test_with_capacity_initializes_empty_window() {
let buffer = Buffer::<u8>::with_capacity(4);
assert_eq!(4, buffer.capacity());
assert_eq!(0, buffer.position());
assert_eq!(0, buffer.limit());
assert_eq!(0, buffer.available());
assert_eq!(4, buffer.spare_capacity());
assert!(buffer.is_empty());
assert!(!buffer.is_full());
}
#[test]
fn test_copy_from_unchecked_appends_to_spare_window() {
let mut buffer = Buffer::<u8>::with_capacity(6);
let input = b"abcdef";
unsafe {
buffer.copy_from_unchecked(input, 1, 3);
}
assert_eq!(0, buffer.position());
assert_eq!(3, buffer.limit());
assert_eq!(3, buffer.available());
assert_eq!(b"bcd", &buffer.data()[0..3]);
}
#[test]
fn test_advance_marks_spare_values_as_readable() {
let mut buffer = Buffer::<u8>::with_capacity(4);
buffer.data_mut()[0..2].copy_from_slice(b"ab");
buffer.advance(2);
assert_eq!(0, buffer.position());
assert_eq!(2, buffer.limit());
assert_eq!(2, buffer.available());
assert_eq!(2, buffer.spare_capacity());
assert_eq!(b"ab", &buffer.data()[0..2]);
}
#[test]
fn test_copy_to_unchecked_consumes_from_readable_window() {
let mut buffer = Buffer::<u8>::with_capacity(6);
let input = b"abcdef";
let mut output = [0_u8; 5];
unsafe {
buffer.copy_from_unchecked(input, 0, 6);
}
buffer.consume(2);
unsafe {
buffer.copy_to_unchecked(&mut output, 1, 3);
}
assert_eq!([0, b'c', b'd', b'e', 0], output);
assert_eq!(5, buffer.position());
assert_eq!(6, buffer.limit());
assert_eq!(1, buffer.available());
}
#[test]
fn test_compact_moves_unread_tail_to_front() {
let mut buffer = Buffer::<u8>::with_capacity(6);
unsafe {
buffer.copy_from_unchecked(b"abcde", 0, 5);
}
buffer.consume(2);
buffer.compact();
assert_eq!(0, buffer.position());
assert_eq!(3, buffer.limit());
assert_eq!(3, buffer.available());
assert_eq!(3, buffer.spare_capacity());
assert_eq!(b"cde", &buffer.data()[0..3]);
}
#[test]
fn test_available_slice_returns_readable_window() {
let mut buffer = Buffer::<u8>::with_capacity(6);
unsafe {
buffer.copy_from_unchecked(b"abcde", 0, 5);
}
buffer.consume(2);
assert_eq!(b"cde", buffer.available_slice());
}
#[test]
fn test_available_raw_parts_exposes_backing_buffer_index_and_count() {
let mut buffer = Buffer::<u8>::with_capacity(6);
unsafe {
buffer.copy_from_unchecked(b"abcde", 0, 5);
}
buffer.consume(2);
let (data, index, count) = buffer.available_raw_parts();
assert_eq!(2, index);
assert_eq!(3, count);
assert_eq!(b"cde", &data[index..index + count]);
}
#[test]
fn test_spare_slice_mut_returns_spare_tail() {
let mut buffer = Buffer::<u8>::with_capacity(6);
unsafe {
buffer.copy_from_unchecked(b"ab", 0, 2);
}
buffer.spare_slice_mut()[..2].copy_from_slice(b"cd");
buffer.advance(2);
assert_eq!(0, buffer.position());
assert_eq!(4, buffer.limit());
assert_eq!(b"abcd", &buffer.data()[0..4]);
}
#[test]
fn test_spare_raw_parts_mut_exposes_backing_buffer_index_and_count() {
let mut buffer = Buffer::<u8>::with_capacity(6);
unsafe {
buffer.copy_from_unchecked(b"ab", 0, 2);
}
{
let (data, index, count) = buffer.spare_raw_parts_mut();
assert_eq!(2, index);
assert_eq!(4, count);
data[index..index + 2].copy_from_slice(b"cd");
}
buffer.advance(2);
assert_eq!(b"abcd", &buffer.data()[0..4]);
}
#[test]
fn test_compact_clears_empty_readable_window() {
let mut buffer = Buffer::<u8>::with_capacity(4);
buffer.advance(3);
buffer.consume(3);
buffer.compact();
assert_eq!(0, buffer.position());
assert_eq!(0, buffer.limit());
assert_eq!(0, buffer.available());
assert_eq!(4, buffer.spare_capacity());
assert!(buffer.is_empty());
}