#! [warn(rust_2018_idioms)]
use bytes::{Buf, BufMut, Bytes};
#[ cfg(feature = "std" )]
use std::io::IoSlice;
#[ test]
fn collect_two_bufs() {
let a = Bytes::from(&b"hello" [..]);
let b = Bytes::from(&b"world" [..]);
let res = a.chain(b).copy_to_bytes(10 );
assert_eq!(res, &b"helloworld" [..]);
}
#[ test]
fn writing_chained() {
let mut a = [0 u8; 64 ];
let mut b = [0 u8; 64 ];
{
let mut buf = (&mut a[..]).chain_mut(&mut b[..]);
for i in 0 u8..128 {
buf.put_u8(i);
}
}
for i in 0 ..64 {
let expect = i as u8;
assert_eq!(expect, a[i]);
assert_eq!(expect + 64 , b[i]);
}
}
#[ test]
fn iterating_two_bufs() {
let a = Bytes::from(&b"hello" [..]);
let b = Bytes::from(&b"world" [..]);
let res: Vec<u8> = a.chain(b).into_iter().collect();
assert_eq!(res, &b"helloworld" [..]);
}
#[ cfg(feature = "std" )]
#[ test]
fn vectored_read() {
let a = Bytes::from(&b"hello" [..]);
let b = Bytes::from(&b"world" [..]);
let mut buf = a.chain(b);
{
let b1: &[u8] = &mut [];
let b2: &[u8] = &mut [];
let b3: &[u8] = &mut [];
let b4: &[u8] = &mut [];
let mut iovecs = [
IoSlice::new(b1),
IoSlice::new(b2),
IoSlice::new(b3),
IoSlice::new(b4),
];
assert_eq!(2 , buf.chunks_vectored(&mut iovecs));
assert_eq!(iovecs[0 ][..], b"hello" [..]);
assert_eq!(iovecs[1 ][..], b"world" [..]);
assert_eq!(iovecs[2 ][..], b"" [..]);
assert_eq!(iovecs[3 ][..], b"" [..]);
}
buf.advance(2 );
{
let b1: &[u8] = &mut [];
let b2: &[u8] = &mut [];
let b3: &[u8] = &mut [];
let b4: &[u8] = &mut [];
let mut iovecs = [
IoSlice::new(b1),
IoSlice::new(b2),
IoSlice::new(b3),
IoSlice::new(b4),
];
assert_eq!(2 , buf.chunks_vectored(&mut iovecs));
assert_eq!(iovecs[0 ][..], b"llo" [..]);
assert_eq!(iovecs[1 ][..], b"world" [..]);
assert_eq!(iovecs[2 ][..], b"" [..]);
assert_eq!(iovecs[3 ][..], b"" [..]);
}
buf.advance(3 );
{
let b1: &[u8] = &mut [];
let b2: &[u8] = &mut [];
let b3: &[u8] = &mut [];
let b4: &[u8] = &mut [];
let mut iovecs = [
IoSlice::new(b1),
IoSlice::new(b2),
IoSlice::new(b3),
IoSlice::new(b4),
];
assert_eq!(1 , buf.chunks_vectored(&mut iovecs));
assert_eq!(iovecs[0 ][..], b"world" [..]);
assert_eq!(iovecs[1 ][..], b"" [..]);
assert_eq!(iovecs[2 ][..], b"" [..]);
assert_eq!(iovecs[3 ][..], b"" [..]);
}
buf.advance(3 );
{
let b1: &[u8] = &mut [];
let b2: &[u8] = &mut [];
let b3: &[u8] = &mut [];
let b4: &[u8] = &mut [];
let mut iovecs = [
IoSlice::new(b1),
IoSlice::new(b2),
IoSlice::new(b3),
IoSlice::new(b4),
];
assert_eq!(1 , buf.chunks_vectored(&mut iovecs));
assert_eq!(iovecs[0 ][..], b"ld" [..]);
assert_eq!(iovecs[1 ][..], b"" [..]);
assert_eq!(iovecs[2 ][..], b"" [..]);
assert_eq!(iovecs[3 ][..], b"" [..]);
}
}
#[ test]
fn chain_growing_buffer() {
let mut buff = [b' ' ; 10 ];
let mut vec = b"wassup" .to_vec();
let mut chained = (&mut buff[..]).chain_mut(&mut vec).chain_mut(Vec::new()); // Required for potential overflow because remaining_mut for Vec is isize::MAX - vec.len(), but for chain_mut is usize::MAX
chained.put_slice(b"hey there123123" );
assert_eq!(&buff, b"hey there1" );
assert_eq!(&vec, b"wassup23123" );
}
#[ test]
fn chain_overflow_remaining_mut() {
let mut chained = Vec::<u8>::new().chain_mut(Vec::new()).chain_mut(Vec::new());
assert_eq!(chained.remaining_mut(), usize::MAX);
chained.put_slice(&[0 ; 256 ]);
assert_eq!(chained.remaining_mut(), usize::MAX);
}
#[ test]
fn chain_get_bytes() {
let mut ab = Bytes::copy_from_slice(b"ab" );
let mut cd = Bytes::copy_from_slice(b"cd" );
let ab_ptr = ab.as_ptr();
let cd_ptr = cd.as_ptr();
let mut chain = (&mut ab).chain(&mut cd);
let a = chain.copy_to_bytes(1 );
let bc = chain.copy_to_bytes(2 );
let d = chain.copy_to_bytes(1 );
assert_eq!(Bytes::copy_from_slice(b"a" ), a);
assert_eq!(Bytes::copy_from_slice(b"bc" ), bc);
assert_eq!(Bytes::copy_from_slice(b"d" ), d);
// assert `get_bytes` did not allocate
assert_eq!(ab_ptr, a.as_ptr());
// assert `get_bytes` did not allocate
assert_eq!(cd_ptr.wrapping_offset(1 ), d.as_ptr());
}
Messung V0.5 in Prozent C=95 H=98 G=96
¤ Dauer der Verarbeitung: 0.7 Sekunden
¤
*© Formatika GbR, Deutschland