termwright-protocol 0.4.0

Semantic side-channel client for the termwright terminal test driver: framing, render-commit markers, snapshot validation
Documentation
use std::sync::Arc;

use termwright_protocol::evidence::{
    Context, InputModeProvider, PaintProvider, Registry, ScrollProvider,
};
use termwright_protocol::{
    EvidenceMethod, Orientation, ProviderPaintedRegion, ProviderPointerSpan, ProviderScrollState,
    ProviderTerminalInputModes, Rect,
};

#[derive(Debug)]
struct ProductionViewport;

impl ScrollProvider for ProductionViewport {
    fn id(&self) -> &str {
        "app.viewport"
    }

    fn version(&self) -> &str {
        "1"
    }

    fn method(&self) -> EvidenceMethod {
        EvidenceMethod::Native
    }

    fn observe(&self, context: &Context) -> Result<Vec<ProviderScrollState>, String> {
        Ok(vec![ProviderScrollState {
            recipient_id: "list".into(),
            axis: Orientation::Vertical,
            offset: context.revision,
            viewport: 4,
            extent: 20,
        }])
    }
}

#[test]
fn scroll_is_a_closed_application_evidence_family() {
    let registry = Registry::new();
    let registration = registry.register_scroll(Arc::new(ProductionViewport));
    assert!(registration.is_ok());

    let duplicate = registry.register_scroll(Arc::new(ProductionViewport));
    assert_eq!(duplicate.unwrap_err(), "duplicate provider app.viewport");
}

#[derive(Debug)]
struct ProductionPainter;

impl PaintProvider for ProductionPainter {
    fn id(&self) -> &str {
        "app.paint"
    }
    fn version(&self) -> &str {
        "1"
    }
    fn method(&self) -> EvidenceMethod {
        EvidenceMethod::Native
    }

    fn observe(&self, _context: &Context) -> Result<Vec<ProviderPaintedRegion>, String> {
        Ok(vec![ProviderPaintedRegion {
            recipient_id: "list".into(),
            region_bounds: Rect::new(2, 3, 4, 2),
            spans: vec![
                ProviderPointerSpan {
                    row: 2,
                    from: 3,
                    to: 7,
                },
                ProviderPointerSpan {
                    row: 3,
                    from: 4,
                    to: 6,
                },
            ],
        }])
    }
}

#[test]
fn paint_is_a_closed_application_evidence_family() {
    let registry = Registry::new();
    assert!(registry.register_paint(Arc::new(ProductionPainter)).is_ok());
    assert_eq!(
        registry
            .register_paint(Arc::new(ProductionPainter))
            .unwrap_err(),
        "duplicate provider app.paint",
    );
}

#[derive(Debug)]
struct ProductionInputParser;

impl InputModeProvider for ProductionInputParser {
    fn id(&self) -> &str {
        "app.input"
    }
    fn version(&self) -> &str {
        "1"
    }
    fn method(&self) -> EvidenceMethod {
        EvidenceMethod::Native
    }
    fn observe(&self, _context: &Context) -> Result<ProviderTerminalInputModes, String> {
        Ok(ProviderTerminalInputModes {
            mouse_tracking: "drag".into(),
            mouse_encoding: "sgr".into(),
            focus_reporting: "on".into(),
        })
    }
}

#[test]
fn input_modes_are_a_closed_application_evidence_family() {
    let registry = Registry::new();
    assert!(registry
        .register_input_modes(Arc::new(ProductionInputParser))
        .is_ok());
    assert_eq!(
        registry
            .register_input_modes(Arc::new(ProductionInputParser))
            .unwrap_err(),
        "duplicate provider app.input",
    );
}