use buf_list::BufList;
use bytes::{Buf, Bytes};
use std::{io::IoSlice, ops::Deref};
#[test]
fn test_basic() {
let mut buf_list = vec![&b"hello"[..], &b"world"[..]]
.into_iter()
.collect::<BufList>();
println!("{:?}", buf_list);
assert_eq!(buf_list.num_bytes(), 10);
assert_eq!(buf_list.num_chunks(), 2);
let chunk = buf_list.push_chunk(&b"foo"[..]);
assert_eq!(buf_list.num_bytes(), 13);
assert_eq!(buf_list.num_chunks(), 3);
assert_eq!(chunk, &b"foo"[..]);
buf_list.push_chunk(&[] as &[u8]);
assert_eq!(buf_list.num_bytes(), 13);
assert_eq!(buf_list.num_chunks(), 3);
{
let mut buf_list = buf_list.clone();
assert_eq!(buf_list.chunk(), &b"hello"[..]);
buf_list.advance(2);
assert_eq!(buf_list.num_bytes(), 11);
assert_eq!(buf_list.num_chunks(), 3);
assert_eq!(buf_list.chunk(), &b"llo"[..]);
buf_list.advance(3);
assert_eq!(buf_list.num_bytes(), 8);
assert_eq!(buf_list.num_chunks(), 2);
assert_eq!(buf_list.chunk(), &b"world"[..]);
buf_list.advance(6);
assert_eq!(buf_list.num_bytes(), 2);
assert_eq!(buf_list.num_chunks(), 1);
assert_eq!(buf_list.chunk(), &b"oo"[..]);
buf_list.advance(2);
assert_eq!(buf_list.num_bytes(), 0);
assert_eq!(buf_list.num_chunks(), 0);
assert_eq!(buf_list.chunk(), &[] as &[u8]);
}
{
let mut chunks_vectored = vec![IoSlice::new(&[]); 5];
let ret = buf_list.chunks_vectored(&mut chunks_vectored);
assert_eq!(ret, 3);
assert_eq!(chunks_vectored[0].deref(), &b"hello"[..]);
assert_eq!(chunks_vectored[1].deref(), &b"world"[..]);
assert_eq!(chunks_vectored[2].deref(), &b"foo"[..]);
assert_eq!(chunks_vectored[3].deref(), &[] as &[u8]);
let mut chunks_vectored = vec![IoSlice::new(&[]); 2];
let ret = buf_list.chunks_vectored(&mut chunks_vectored);
assert_eq!(ret, 2);
assert_eq!(chunks_vectored[0].deref(), &b"hello"[..]);
assert_eq!(chunks_vectored[1].deref(), &b"world"[..]);
let mut chunks_vectored = vec![];
let ret = buf_list.chunks_vectored(&mut chunks_vectored);
assert_eq!(ret, 0);
}
{
let mut buf_list = buf_list.clone();
let bytes = buf_list.copy_to_bytes(2);
assert_eq!(bytes, &b"he"[..]);
assert_eq!(buf_list.num_bytes(), 11);
assert_eq!(buf_list.num_chunks(), 3);
let bytes = buf_list.copy_to_bytes(3);
assert_eq!(bytes, &b"llo"[..]);
assert_eq!(buf_list.num_bytes(), 8);
assert_eq!(buf_list.num_chunks(), 2);
let bytes = buf_list.copy_to_bytes(6);
assert_eq!(bytes, &b"worldf"[..]);
assert_eq!(buf_list.num_bytes(), 2);
assert_eq!(buf_list.num_chunks(), 1);
buf_list.push_chunk(&b"bar"[..]);
let bytes = buf_list.copy_to_bytes(5);
assert_eq!(bytes, &b"oobar"[..]);
assert_eq!(buf_list.num_bytes(), 0);
assert_eq!(buf_list.num_chunks(), 0);
}
}
#[test]
fn test_iter() {
let buf_list = vec![&b"hello"[..], &b"world"[..], &b"foo"[..], &b"bar"[..]]
.into_iter()
.collect::<BufList>();
let mut iter = (&buf_list).into_iter();
println!("{:?}", iter);
assert_eq!(iter.next(), Some(&Bytes::from_static(&b"hello"[..])));
assert_eq!(iter.size_hint(), (3, Some(3)));
assert_eq!(iter.len(), 3);
{
let mut iter = iter.clone();
#[allow(clippy::iter_nth_zero)]
{
assert_eq!(iter.nth(0), Some(&Bytes::from_static(&b"world"[..])));
}
assert_eq!(iter.last(), Some(&Bytes::from_static(&b"bar"[..])));
}
{
let iter = iter.clone();
let v = iter.fold(vec![], |mut v, item| {
v.push(item);
v
});
assert_eq!(
v,
vec![
&Bytes::from_static(&b"world"[..]),
&Bytes::from_static(&b"foo"[..]),
&Bytes::from_static(&b"bar"[..]),
]
);
}
{
let mut iter = iter.clone();
assert_eq!(iter.next_back(), Some(&Bytes::from_static(&b"bar"[..])));
assert_eq!(
iter.rfold(vec![], |mut v, item| {
v.push(item);
v
}),
vec![
&Bytes::from_static(&b"foo"[..]),
&Bytes::from_static(&b"world"[..]),
]
);
}
}
#[test]
fn test_into_iter() {
let buf_list = vec![&b"hello"[..], &b"world"[..], &b"foo"[..], &b"bar"[..]]
.into_iter()
.collect::<BufList>();
let into_iter = buf_list.into_iter();
println!("{:?}", into_iter);
#[allow(clippy::redundant_clone)]
let mut into_iter = into_iter.clone();
assert_eq!(into_iter.next(), Some(Bytes::from_static(&b"hello"[..])));
assert_eq!(into_iter.size_hint(), (3, Some(3)));
assert_eq!(into_iter.len(), 3);
assert_eq!(into_iter.next_back(), Some(Bytes::from_static(&b"bar"[..])));
}
#[test]
#[should_panic = "`len` (12) greater than remaining (10)"]
fn test_copy_to_bytes_panic() {
let mut buf_list = vec![&b"hello"[..], &b"world"[..]]
.into_iter()
.collect::<BufList>();
buf_list.copy_to_bytes(12);
}