pocketstation 1.0.0

Source-aware desktop audio Session SDK
use pocketstation::{SidecarMessage, SidecarMessageKind, SidecarProtocolLimits};

const PKSS_V1_SIGNAL_VECTOR: &[u8] = &[
    0x50, 0x4b, 0x53, 0x53, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
    0x03, 0x00, 0x00, 0x00, 0x64, 0x65, 0x76, 0x2e, 0x70, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x74,
    0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x66, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x76, 0x31,
    0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x75, 0x72, 0x6e, 0x3a,
    0x70, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x66, 0x69,
    0x78, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x76, 0x31, 0x01, 0x02, 0x03,
];

#[test]
fn given_pkss_v1_signal_when_encoded_then_bytes_remain_stable() {
    let message = SidecarMessage {
        kind: SidecarMessageKind::Signal,
        terminal: true,
        stream_id: 7,
        sequence_number: 11,
        timestamp_ns: 13,
        signal_id: "dev.pocketstation.fixture.v1".to_owned(),
        role: Some("result.final".to_owned()),
        schema: Some("urn:pocketstation:fixture:v1".to_owned()),
        payload: vec![1, 2, 3],
    };
    let limits = SidecarProtocolLimits::default();
    let encoded = message.encode(limits).expect("encode PKSS 1.0 vector");

    assert_eq!(encoded, PKSS_V1_SIGNAL_VECTOR);
    assert_eq!(
        SidecarMessage::decode(PKSS_V1_SIGNAL_VECTOR, limits),
        Ok(message)
    );
}

#[test]
fn given_pkss_v1_message_kinds_when_projected_then_values_remain_stable() {
    let kinds = [
        (SidecarMessageKind::Signal, 1),
        (SidecarMessageKind::Ready, 2),
        (SidecarMessageKind::Error, 3),
        (SidecarMessageKind::Cancel, 4),
        (SidecarMessageKind::Close, 5),
        (SidecarMessageKind::Hello, 6),
        (SidecarMessageKind::Manifest, 7),
        (SidecarMessageKind::Configure, 8),
        (SidecarMessageKind::Observation, 9),
        (SidecarMessageKind::Closed, 10),
    ];
    for (kind, expected) in kinds {
        assert_eq!(kind as u8, expected);
    }
}