synta 0.1.2

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

use synta::tag::TAG_SEQUENCE;
use synta::{Encoder, Encoding, Tag};

#[test]
fn test_encoder_creation() {
    let encoder = Encoder::new(Encoding::Der);
    // Can't check buffer length directly since it's private, but creation should succeed
    assert!(encoder.finish().unwrap().is_empty());
}

#[test]
fn test_write_tag() {
    let mut encoder = Encoder::new(Encoding::Der);
    let tag = Tag::universal(2);
    encoder.write_tag(tag).unwrap();
    let result = encoder.finish().unwrap();
    assert_eq!(result, &[0x02]);
}

#[test]
fn test_write_length() {
    // Short form
    let mut encoder = Encoder::new(Encoding::Der);
    encoder.write_length(5).unwrap();
    let result = encoder.finish().unwrap();
    assert_eq!(result, &[0x05]);

    // Long form
    let mut encoder = Encoder::new(Encoding::Der);
    encoder.write_length(200).unwrap();
    let result = encoder.finish().unwrap();
    assert_eq!(result, &[0x81, 0xC8]);
}

#[test]
fn test_constructed_backpatching() {
    let mut encoder = Encoder::new(Encoding::Der);
    let tag = Tag::universal_constructed(TAG_SEQUENCE);

    {
        let mut guard = encoder.start_constructed(tag).unwrap();
        // Write some content
        guard.write_bytes(&[0x02, 0x01, 0x2A]).unwrap();
    }

    let result = encoder.finish().unwrap();
    // Expected: SEQUENCE tag (0x30) + length (0x03) + content (0x02, 0x01, 0x2A)
    assert_eq!(result, &[0x30, 0x03, 0x02, 0x01, 0x2A]);
}

#[test]
fn test_nested_constructed() {
    let mut encoder = Encoder::new(Encoding::Der);
    let tag = Tag::universal_constructed(TAG_SEQUENCE);

    {
        // We can't access the encoder through the guard in the new design
        // So we manually construct the inner sequence
        let mut guard = encoder.start_constructed(tag).unwrap();
        guard.write_tag(tag).unwrap();
        guard.write_length(3).unwrap();
        guard.write_bytes(&[0x02, 0x01, 0x2A]).unwrap();
    }

    let result = encoder.finish().unwrap();
    // Expected: SEQUENCE tag + length + (SEQUENCE tag + length + content)
    // Outer: 0x30 0x05 (5 bytes content)
    // Inner: 0x30 0x03 (3 bytes content)
    // Content: 0x02 0x01 0x2A
    assert_eq!(result, &[0x30, 0x05, 0x30, 0x03, 0x02, 0x01, 0x2A]);
}