use wresp::read::*;
#[test]
fn test_length_encoding() {
let mut length = 0;
let mut ptr = b"$5\r\n".as_slice();
assert!(try_read_unsigned_length_header(&mut length, &mut ptr, b'$').unwrap());
assert_eq!(length, 5);
let mut ptr = b"$-1\r\n".as_slice();
assert!(try_read_signed_length_header(&mut length, &mut ptr, b'$').unwrap());
assert_eq!(length, -1);
let mut ptr = b"*3\r\n".as_slice();
assert!(try_read_unsigned_array_length(&mut length, &mut ptr).unwrap());
assert_eq!(length, 3);
}
#[test]
fn test_skip_byte_array() {
let mut ptr = b"$5\r\nhello\r\n".as_slice();
assert!(try_skip_byte_array_with_length_header(&mut ptr).unwrap());
assert!(ptr.is_empty());
}
#[test]
fn test_int32_boundary_length_headers() {
let mut ptr = b"$2147483647\r\n".as_slice();
let mut length = 0;
assert!(try_read_unsigned_length_header(&mut length, &mut ptr, b'$').unwrap());
assert_eq!(length, i32::MAX);
let mut ptr = b"$-2147483648\r\n".as_slice();
let mut length = 0;
assert!(try_read_signed_length_header(&mut length, &mut ptr, b'$').unwrap());
assert_eq!(length, i32::MIN);
let mut ptr = b"$2147483648\r\n".as_slice();
let mut length = 0;
assert!(try_read_unsigned_length_header(&mut length, &mut ptr, b'$').is_err());
}
#[test]
fn test_max_argument_length_bound() {
let oversized = format!("${}\r\n", wresp::MAX_ARGUMENT_LENGTH_BYTES + 1);
let head: &[u8] = oversized.as_bytes();
let mut ptr = head;
let mut result: &[u8] = &[];
assert!(!try_slice_with_length_header(&mut result, &mut ptr).unwrap());
assert_eq!(ptr, &head[head.len()..], "超界时头部已消费、仅返 false");
let mut ptr = head;
assert!(!try_skip_byte_array_with_length_header(&mut ptr).unwrap());
let mut ptr = head;
let mut span: &[u8] = &[];
assert!(!try_read_span_with_length_header(&mut span, &mut ptr).unwrap());
let mut ptr = head;
let mut opt: Option<&[u8]> = None;
assert!(!try_read_ptr_with_signed_length_header(&mut opt, &mut ptr).unwrap());
let mut ptr = head;
let mut len = 0;
let mut result: &[u8] = &[];
assert!(!try_read_ptr_with_length_header(&mut result, &mut len, &mut ptr).unwrap());
let mut ptr = b"$-1\r\n".as_slice();
let mut opt: Option<&[u8]> = None;
assert!(try_read_ptr_with_signed_length_header(&mut opt, &mut ptr).unwrap());
assert_eq!(opt, None);
assert!(ptr.is_empty());
let boundary = format!("${}\r\n", wresp::MAX_ARGUMENT_LENGTH_BYTES);
let mut ptr: &[u8] = boundary.as_bytes();
assert!(!try_skip_byte_array_with_length_header(&mut ptr).unwrap());
}