auv-driver-linux 0.0.22

Linux driver for AUV
use auv_driver_common::geometry::{CoordinateSpace, Rect, ScreenPoint, WindowPoint};
use auv_driver_common::window::{Window, WindowRef};
use auv_driver_common::{Driver, WindowInput as _};

use super::*;
use crate::LinuxDriver;

fn session() -> LinuxDriverSession {
  LinuxDriver::new().open_local().expect("session opens")
}

fn sample_window() -> Window {
  Window {
    reference: WindowRef {
      id: "42".to_string(),
    },
    title: None,
    app_name: None,
    app_bundle_id: None,
    process_id: Some(123),
    frame: Rect::new(100.0, 200.0, 800.0, 600.0),
    coordinate_space: CoordinateSpace::Screen,
    is_main: true,
    is_visible: true,
  }
}

#[test]
fn window_point_converts_to_screen_point() {
  let window = sample_window();

  let point = session().window().to_screen_point(&window, WindowPoint::new(25.0, 30.0)).expect("point maps");

  assert_eq!(point, ScreenPoint::new(125.0, 230.0));
}

#[test]
fn screen_point_converts_to_window_point() {
  let window = sample_window();

  let point = session().window().to_window_point(&window, ScreenPoint::new(125.0, 230.0)).expect("point maps");

  assert_eq!(point, WindowPoint::new(25.0, 30.0));
}

#[test]
fn window_capture_with_rejects_nested_capture_options() {
  let window = sample_window();
  let error = session()
    .window()
    .capture_with(
      &window,
      CaptureOptions {
        window: Some(window.reference.clone()),
        ..CaptureOptions::default()
      },
    )
    .expect_err("nested window capture is rejected before portal capture");

  assert!(error.to_string().contains("window.capture_with"));
}

#[test]
fn window_capture_with_rejects_activation_on_linux() {
  let window = sample_window();
  let error = session()
    .window()
    .capture_with(
      &window,
      CaptureOptions {
        activation: Activation::ActivateFirst {
          settle: std::time::Duration::ZERO,
        },
        ..CaptureOptions::default()
      },
    )
    .expect_err("activation is rejected before portal capture");

  assert!(error.to_string().contains("cannot activate Linux Wayland"));
}

#[test]
fn window_click_rejects_background_only_policy() {
  let window = sample_window();
  let error = session()
    .window()
    .click(
      &window,
      WindowPoint::new(1.0, 1.0),
      ClickOptions {
        policy: InputPolicy::BackgroundOnly,
        ..ClickOptions::default()
      },
    )
    .expect_err("background-only window click is rejected before portal input");

  assert!(error.to_string().contains("background_only"));
}

#[test]
fn window_scroll_rejects_background_only_policy() {
  let window = sample_window();
  let error = session()
    .window()
    .scroll(
      &window,
      WindowPoint::new(1.0, 1.0),
      Scroll::new(0.0, 10.0),
      ScrollOptions {
        policy: InputPolicy::BackgroundOnly,
        ..ScrollOptions::default()
      },
    )
    .expect_err("background-only window scroll is rejected before portal input");

  assert!(error.to_string().contains("background_only"));
}

#[test]
fn window_scroll_requires_foreground_candidate_for_background_preferred_policy() {
  let window = sample_window();
  let error = session()
    .window()
    .scroll(
      &window,
      WindowPoint::new(1.0, 1.0),
      Scroll::new(0.0, 10.0),
      ScrollOptions {
        delivery_strategy: auv_driver_common::input::ScrollDeliveryStrategy {
          candidates: vec![ScrollDeliveryCandidate::WindowTargetedWheel],
        },
        ..ScrollOptions::default()
      },
    )
    .expect_err("foreground fallback must be explicitly allowed");

  assert!(error.to_string().contains("ForegroundHid"));
}

#[test]
fn modified_background_click_is_rejected_before_portal_input() {
  let modifiers = auv_driver_common::ClickModifiers {
    meta: true,
    ..Default::default()
  };
  let driver = session();
  let window = sample_window();
  for policy in [InputPolicy::BackgroundOnly] {
    let error = driver
      .window()
      .click(
        &window,
        WindowPoint::new(1.0, 1.0),
        ClickOptions {
          policy,
          modifiers,
          ..Default::default()
        },
      )
      .unwrap_err();
    assert!(error.to_string().contains("linux window.click cannot use background_only"));
  }
}