use chdkptp::ptp::codec::Reader;
use chdkptp::ptp::container::{decode, encode};
use chdkptp::ptp::opcode;
#[test]
fn container_command_roundtrip() {
let bytes = encode(opcode::CONTAINER_COMMAND, 0x9999, 42, &[7, 0], &[]);
assert_eq!(bytes.len(), 20);
assert_eq!(&bytes[0..4], &20u32.to_le_bytes());
let dec = decode(&bytes).expect("decode command");
assert_eq!(dec.container_type, opcode::CONTAINER_COMMAND);
assert_eq!(dec.code, 0x9999);
assert_eq!(dec.txn_id, 42);
assert_eq!(dec.params, vec![7, 0]);
assert!(dec.payload.is_empty());
}
#[test]
fn container_data_roundtrip() {
let payload = b"return get_zoom()";
let bytes = encode(opcode::CONTAINER_DATA, 0x9999, 7, &[], payload);
assert_eq!(bytes.len(), 12 + payload.len());
let dec = decode(&bytes).expect("decode data");
assert_eq!(dec.container_type, opcode::CONTAINER_DATA);
assert_eq!(dec.code, 0x9999);
assert_eq!(dec.txn_id, 7);
assert!(dec.params.is_empty());
assert_eq!(dec.payload, payload);
}
#[test]
fn container_decode_rejects_undersized_buffer() {
let bytes = [1u8, 2, 3]; assert!(decode(&bytes).is_err());
}
#[test]
fn container_decode_rejects_length_exceeding_buffer() {
let mut bytes = Vec::new();
bytes.extend_from_slice(&1000u32.to_le_bytes());
bytes.extend_from_slice(&[0; 8]);
assert!(decode(&bytes).is_err());
}
#[test]
fn codec_read_string_utf16le() {
let bytes = [3, 0x48, 0x00, 0x69, 0x00, 0x00, 0x00];
let mut r = Reader::new(&bytes);
assert_eq!(r.read_string().unwrap(), "Hi");
}
#[test]
fn codec_read_string_empty() {
let bytes = [0u8];
let mut r = Reader::new(&bytes);
assert_eq!(r.read_string().unwrap(), "");
}
#[test]
fn codec_read_u16_array() {
let bytes = [
3, 0, 0, 0, 0x01, 0x10, 0x02, 0x10, 0x99, 0x99, ];
let mut r = Reader::new(&bytes);
let arr = r.read_u16_array().unwrap();
assert_eq!(arr, vec![0x1001, 0x1002, 0x9999]);
}
#[test]
fn codec_primitive_reads_are_little_endian() {
let bytes = [
0x12, 0x34, 0x12, 0x78, 0x56, 0x34, 0x12, ];
let mut r = Reader::new(&bytes);
assert_eq!(r.read_u8().unwrap(), 0x12);
assert_eq!(r.read_u16().unwrap(), 0x1234);
assert_eq!(r.read_u32().unwrap(), 0x1234_5678);
}