synta 0.2.4

ASN.1 parser, decoder, and encoder library with DER/BER support and C FFI
Documentation
//! Tests for the decoder

use synta::{Decoder, Encoding, Length};

#[test]
fn test_decoder_creation() {
    let data = [0x02, 0x01, 0x2A];
    let decoder = Decoder::new(&data, Encoding::Der);
    assert_eq!(decoder.position(), 0);
    assert_eq!(decoder.remaining(), &data[..]);
}

#[test]
fn test_read_bytes() {
    let data = [0x01, 0x02, 0x03, 0x04];
    let mut decoder = Decoder::new(&data, Encoding::Der);

    let bytes = decoder.read_bytes(2).unwrap();
    assert_eq!(bytes, &[0x01, 0x02]);
    assert_eq!(decoder.position(), 2);

    let bytes = decoder.read_bytes(2).unwrap();
    assert_eq!(bytes, &[0x03, 0x04]);
    assert_eq!(decoder.position(), 4);

    assert!(decoder.read_bytes(1).is_err());
}

#[test]
fn test_read_tag() {
    let data = [0x02, 0x00]; // INTEGER tag
    let mut decoder = Decoder::new(&data, Encoding::Der);

    let tag = decoder.read_tag().unwrap();
    assert_eq!(tag.number(), 2);
    assert_eq!(decoder.position(), 1);
}

#[test]
fn test_read_length() {
    // Short form
    let data = [0x05];
    let mut decoder = Decoder::new(&data, Encoding::Der);
    let length = decoder.read_length().unwrap();
    assert_eq!(length, Length::Definite(5));

    // Long form
    let data = [0x81, 0xC8]; // 200
    let mut decoder = Decoder::new(&data, Encoding::Der);
    let length = decoder.read_length().unwrap();
    assert_eq!(length, Length::Definite(200));
}

#[test]
fn test_indefinite_length_in_der() {
    let data = [0x80]; // Indefinite length
    let mut decoder = Decoder::new(&data, Encoding::Der);
    assert!(decoder.read_length().is_err());
}

#[test]
fn test_peek_tag() {
    let data = [0x02, 0x00];
    let decoder = Decoder::new(&data, Encoding::Der);

    let tag = decoder.peek_tag().unwrap();
    assert_eq!(tag.number(), 2);
    // Position shouldn't change
    assert_eq!(decoder.position(), 0);
}