grim-rs 0.1.9

Rust implementation of grim screenshot utility for Wayland
Documentation
use grim_rs::geometry::Region;
use grim_rs::{CaptureParameters, CaptureResult, MultiOutputCaptureResult};
use std::collections::HashMap;

#[test]
fn box_getters_work_correctly() {
    let b = Region::new(10, 20, 300, 400);

    assert_eq!(b.x(), 10);
    assert_eq!(b.y(), 20);
    assert_eq!(b.width(), 300);
    assert_eq!(b.height(), 400);
}

#[test]
fn capture_result_accessors_work() {
    let data = vec![255u8; 100];
    let result = CaptureResult::new(data.clone(), 10, 10);

    assert_eq!(result.width(), 10);
    assert_eq!(result.height(), 10);
    assert_eq!(result.data(), &data[..]);
    assert_eq!(result.data().len(), 100);
}

#[test]
fn capture_result_into_data_consumes() {
    let data = vec![255u8; 100];
    let result = CaptureResult::new(data.clone(), 10, 10);

    let owned = result.into_data();
    assert_eq!(owned, data);
    assert_eq!(owned.len(), 100);
}

#[test]
fn capture_parameters_builder_pattern_works() {
    let region = Region::new(0, 0, 100, 100);

    let params = CaptureParameters::new("HDMI-A-1")
        .region(region)
        .overlay_cursor(true)
        .scale(2.0);

    assert_eq!(params.output_name(), "HDMI-A-1");
    assert_eq!(params.region_ref(), Some(&region));
    assert!(params.overlay_cursor_enabled());
    assert_eq!(params.scale_factor(), Some(2.0));
}

#[test]
fn capture_parameters_minimal_construction() {
    let params = CaptureParameters::new("eDP-1");

    assert_eq!(params.output_name(), "eDP-1");
    assert_eq!(params.region_ref(), None);
    assert!(!params.overlay_cursor_enabled());
    assert_eq!(params.scale_factor(), None);
}

#[test]
fn capture_parameters_builder_is_chainable() {
    let region = Region::new(10, 20, 640, 480);

    let params = CaptureParameters::new("DP-1")
        .region(region)
        .overlay_cursor(true)
        .scale(1.5);

    assert_eq!(params.output_name(), "DP-1");
    assert!(params.region_ref().is_some());
    assert!(params.overlay_cursor_enabled());
    assert!(params.scale_factor().is_some());
}

#[test]
fn capture_parameters_partial_builder() {
    let params = CaptureParameters::new("HDMI-A-2").overlay_cursor(true);

    assert_eq!(params.output_name(), "HDMI-A-2");
    assert_eq!(params.region_ref(), None);
    assert!(params.overlay_cursor_enabled());
    assert_eq!(params.scale_factor(), None);
}

#[test]
fn multi_output_capture_result_get_works() {
    let mut outputs = HashMap::new();
    outputs.insert(
        "HDMI-A-1".to_string(),
        CaptureResult::new(vec![255; 100], 10, 10),
    );
    outputs.insert(
        "eDP-1".to_string(),
        CaptureResult::new(vec![128; 200], 10, 20),
    );

    let result = MultiOutputCaptureResult::new(outputs);

    assert!(result.get("HDMI-A-1").is_some());
    assert!(result.get("eDP-1").is_some());
    assert!(result.get("HDMI-A-2").is_none());

    let hdmi = result.get("HDMI-A-1").unwrap();
    assert_eq!(hdmi.width(), 10);
    assert_eq!(hdmi.height(), 10);
}

#[test]
fn multi_output_capture_result_outputs_returns_reference() {
    let mut outputs = HashMap::new();
    outputs.insert(
        "HDMI-A-1".to_string(),
        CaptureResult::new(vec![255; 100], 10, 10),
    );

    let result = MultiOutputCaptureResult::new(outputs);
    let outputs_ref = result.outputs();

    assert_eq!(outputs_ref.len(), 1);
    assert!(outputs_ref.contains_key("HDMI-A-1"));
}

#[test]
fn multi_output_capture_result_into_outputs_consumes() {
    let mut outputs = HashMap::new();
    outputs.insert(
        "HDMI-A-1".to_string(),
        CaptureResult::new(vec![255; 100], 10, 10),
    );
    outputs.insert(
        "eDP-1".to_string(),
        CaptureResult::new(vec![128; 200], 10, 20),
    );

    let result = MultiOutputCaptureResult::new(outputs.clone());
    let owned = result.into_outputs();

    assert_eq!(owned.len(), 2);
    assert!(owned.contains_key("HDMI-A-1"));
    assert!(owned.contains_key("eDP-1"));
}

#[test]
fn capture_result_data_returns_slice() {
    let data = vec![1, 2, 3, 4, 5];
    let result = CaptureResult::new(data.clone(), 1, 5);

    let slice = result.data();
    assert_eq!(slice.len(), 5);
    assert_eq!(slice, &[1, 2, 3, 4, 5]);
}

#[test]
fn box_encapsulation_prevents_direct_field_access() {
    let b = Region::new(100, 200, 300, 400);

    assert_eq!(b.x(), 100);
    assert_eq!(b.y(), 200);
    assert_eq!(b.width(), 300);
    assert_eq!(b.height(), 400);
}