#![allow(clippy::expect_used)]
use pdfrum::{Document, FormSession, Key, Modifiers, Point};
fn document() -> Document {
Document::open("tests/fixtures/click_form.pdf").expect("the click_form fixture must open")
}
const READ_ONLY_CHECKBOX: Point = Point::new(145.0, 260.0);
const CHECKBOX: Point = Point::new(145.0, 220.0);
fn click(session: &mut FormSession<'_>, at: Point) {
session.mouse_move(0, at, Modifiers::NONE);
session.mouse_down(0, at, Modifiers::NONE);
session.mouse_up(0, at, Modifiers::NONE);
}
#[test]
fn a_read_only_check_box_is_not_clickable() {
let doc = document();
let mut session = FormSession::new(&doc);
click(&mut session, READ_ONLY_CHECKBOX);
assert!(
session.focused_annot().is_none(),
"a read-only widget refuses a click outright"
);
}
#[test]
fn an_ordinary_check_box_takes_a_click() {
let doc = document();
let mut session = FormSession::new(&doc);
let response = click_and_report(&mut session, CHECKBOX);
assert!(response, "the click is consumed");
assert!(session.focused_annot().is_some());
}
fn click_and_report(session: &mut FormSession<'_>, at: Point) -> bool {
session.mouse_move(0, at, Modifiers::NONE);
session.mouse_down(0, at, Modifiers::NONE);
session.mouse_up(0, at, Modifiers::NONE).consumed
}
#[test]
fn a_read_only_check_box_consumes_a_keystroke_without_acting() {
let doc = document();
let mut session = FormSession::new(&doc);
let mut reached = false;
for _ in 0..8 {
if !session.key_down(Key::Tab, Modifiers::NONE).consumed {
break;
}
if session.focused_annot().is_some_and(|a| a.index == 0) {
reached = true;
break;
}
}
if !reached {
return;
}
for key in [Key::Return, Key::Space] {
let response = session.key_down(key, Modifiers::NONE);
assert!(
response.consumed,
"{key:?} on a read-only control is consumed"
);
assert!(
response.updates.is_empty(),
"{key:?} on a read-only control changes nothing"
);
}
}
#[test]
fn a_check_box_toggles_on_each_return() {
let doc = document();
let mut session = FormSession::new(&doc);
click(&mut session, CHECKBOX);
assert!(session.focused_annot().is_some());
let first = session.character('\r', Modifiers::NONE);
assert!(first.consumed);
let second = session.character('\r', Modifiers::NONE);
assert!(second.consumed);
}
#[test]
fn a_toggle_reports_no_text_at_all() {
let doc = document();
let mut session = FormSession::new(&doc);
click(&mut session, CHECKBOX);
assert!(session.focused_annot().is_some());
assert_eq!(
session.focused_text(),
None,
"a check box's value is a state name, not text"
);
assert_eq!(session.selected_text(), None);
}
#[test]
fn a_toggle_has_nothing_to_undo() {
let doc = document();
let mut session = FormSession::new(&doc);
click(&mut session, CHECKBOX);
session.character('\r', Modifiers::NONE);
assert!(!session.can_undo());
assert!(!session.can_redo());
}