#[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"".to_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"
);
}
}
#[test]
fn lines_codec_newline_variants() {
let mut codec = LinesCodec::new();
let test_cases = vec![
("simple", "simple\n"),
("crlf", "line\r\n"),
("cr_only", "old_mac\r"),
("empty_line", "\n"),
("unicode", "héllo wørld\n"),
];
for (expected, input) in test_cases {
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);
}
}
#[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");
let result = codec.decode(&mut src);
assert!(result.is_err(), "Should fail on invalid UTF-8");
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");
}
}