hermes-tdata 0.1.1

Pure Rust parser for Telegram Desktop's tdata storage format. Decrypts local storage and extracts auth keys without Qt/C++ dependencies.
Documentation
//! QDataStream tests

use super::QDataStream;

#[test]
fn test_read_u32() {
    let data = [0x12, 0x34, 0x56, 0x78];
    let mut stream = QDataStream::new(&data);
    assert_eq!(stream.read_u32().unwrap(), 0x12345678);
}

#[test]
fn test_read_i32() {
    let data = [0xFF, 0xFF, 0xFF, 0xFE]; // -2 in big endian
    let mut stream = QDataStream::new(&data);
    assert_eq!(stream.read_i32().unwrap(), -2);
}

#[test]
fn test_read_qbytearray() {
    // Length = 4, data = [0x01, 0x02, 0x03, 0x04]
    let data = [0x00, 0x00, 0x00, 0x04, 0x01, 0x02, 0x03, 0x04];
    let mut stream = QDataStream::new(&data);
    assert_eq!(stream.read_qbytearray().unwrap(), vec![0x01, 0x02, 0x03, 0x04]);
}

#[test]
fn test_read_null_qbytearray() {
    let data = [0xFF, 0xFF, 0xFF, 0xFF];
    let mut stream = QDataStream::new(&data);
    assert!(stream.read_qbytearray().unwrap().is_empty());
}

#[test]
fn test_read_qstring() {
    // "Hi" in UTF-16 BE: length = 4 bytes, 'H' = 0x0048, 'i' = 0x0069
    let data = [0x00, 0x00, 0x00, 0x04, 0x00, 0x48, 0x00, 0x69];
    let mut stream = QDataStream::new(&data);
    assert_eq!(stream.read_qstring().unwrap(), "Hi");
}

#[test]
fn test_read_null_qstring() {
    let data = [0xFF, 0xFF, 0xFF, 0xFF];
    let mut stream = QDataStream::new(&data);
    assert!(stream.read_qstring().unwrap().is_empty());
}

#[test]
fn test_position_and_remaining() {
    let data = [0x01, 0x02, 0x03, 0x04, 0x05];
    let mut stream = QDataStream::new(&data);

    assert_eq!(stream.position(), 0);
    assert_eq!(stream.remaining(), 5);

    stream.read_u8().unwrap();
    assert_eq!(stream.position(), 1);
    assert_eq!(stream.remaining(), 4);

    stream.skip(2).unwrap();
    assert_eq!(stream.position(), 3);
    assert_eq!(stream.remaining(), 2);
}

#[test]
fn test_at_end() {
    let data = [0x01, 0x02];
    let mut stream = QDataStream::new(&data);

    assert!(!stream.at_end());
    stream.read_u16().unwrap();
    assert!(stream.at_end());
}