#[cfg(test)]
mod regression_tests {
use super::super::*;
use crate::bytes::{Bytes, BytesMut};
#[test]
fn bytes_codec_round_trip_identity() {
let mut codec = BytesCodec::new();
let test_cases = vec![
b"hello".to_vec(), b"\x00\x01\x02\xff".to_vec(), vec![0u8; 10000], ];
for original in test_cases {
let bytes_input = Bytes::from(original.clone());
let mut encode_buf = BytesMut::new();
codec
.encode(bytes_input.clone(), &mut encode_buf)
.expect("encode failed");
let decoded = codec
.decode(&mut encode_buf)
.expect("decode failed")
.expect("incomplete frame");
assert_eq!(
decoded.as_ref(),
original.as_slice(),
"Round-trip failed: original != decoded"
);
}
let mut empty_buf = BytesMut::new();
codec
.encode(Bytes::new(), &mut empty_buf)
.expect("encode empty failed");
assert!(empty_buf.is_empty());
assert!(
codec.decode(&mut empty_buf).expect("decode empty").is_none(),
"decoding an empty buffer must return None"
);
}
#[test]
fn lines_codec_newline_variants() {
let test_cases = vec![
("simple", "simple\n"),
("line", "line\r\n"),
("", "\n"),
("héllo wørld", "héllo wørld\n"),
];
for (expected, input) in test_cases {
let mut codec = LinesCodec::new();
let mut src = BytesMut::from(input);
let decoded = codec
.decode(&mut src)
.expect("decode failed")
.expect("incomplete frame");
assert_eq!(decoded, expected, "Line parsing failed for: {:?}", input);
}
let mut cr_codec = LinesCodec::new();
let mut cr_src = BytesMut::from("old_mac\r");
assert!(
cr_codec.decode(&mut cr_src).expect("cr-only decode").is_none(),
"CR-only input has no frame terminator"
);
}
#[test]
fn capacity_growth_bounded() {
let mut codec = BytesCodec::new();
let mut buffer = BytesMut::with_capacity(64);
for size in [100, 1000, 10000] {
let large_input = Bytes::from(vec![0x42u8; size]);
let cap_before = buffer.capacity();
codec
.encode(large_input, &mut buffer)
.expect("encode failed");
let cap_after = buffer.capacity();
assert!(cap_after >= cap_before, "Capacity decreased!");
assert!(
cap_after <= buffer.len() * 4,
"Excessive capacity growth: cap={}, len={}",
cap_after,
buffer.len()
);
}
}
#[test]
fn lines_codec_error_recovery() {
let mut codec = LinesCodec::new();
let mut src = BytesMut::new();
src.extend_from_slice(b"\xff\xfe\xfd\n");
let result = codec.decode(&mut src);
assert!(
matches!(result, Err(LinesCodecError::InvalidUtf8)),
"Should fail on invalid UTF-8, got {:?}",
result
);
src.clear();
src.extend_from_slice(b"recovery_line\n");
let decoded = codec
.decode(&mut src)
.expect("recovery failed")
.expect("incomplete frame");
assert_eq!(decoded, "recovery_line", "Failed to recover after error");
}
}