Files
pdfcraft/crates/ui-egui/tests/pageboxes.rs
T

92 lines
3.1 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! Crop tool, Set Page Boxes and Duplicate pages in the real shell (egui_kittest).
use egui_kittest::Harness;
use egui_kittest::kittest::Queryable;
use printcraft_ui_egui::{Dialog, PrintCraftApp, QuickTool};
const FIXTURE: &[u8] = b"%PDF-1.7
1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj
2 0 obj << /Type /Pages /Kids [3 0 R 4 0 R] /Count 2 /MediaBox [0 0 300 400] >> endobj
3 0 obj << /Type /Page /Parent 2 0 R >> endobj
4 0 obj << /Type /Page /Parent 2 0 R >> endobj
trailer << /Root 1 0 R >>
%%EOF";
fn harness() -> Harness<'static, PrintCraftApp> {
let mut h = Harness::builder().with_size(egui::vec2(1400.0, 900.0)).build_eframe(|_cc| {
let mut app = PrintCraftApp::new();
app.open_bytes("doc.pdf", None, FIXTURE.to_vec()).unwrap();
app.set_option("left", "closed").unwrap();
app.set_option("zoom", "150").unwrap();
app
});
h.run_steps(6);
h
}
fn size(h: &Harness<'static, PrintCraftApp>, page: usize) -> (f32, f32) {
let s = h.state();
let p = &s.session.get(s.views[0].id).unwrap().info.pages[page];
(p.width, p.height)
}
#[test]
fn the_crop_tool_crops_to_the_dragged_rectangle_then_returns_to_select() {
let mut h = harness();
assert!(h.state_mut().execute("page.crop"));
assert_eq!(h.state().quick_tool, QuickTool::Crop);
h.run_steps(2);
let r = h.state().views[0].page_screen_rect(0).unwrap();
// The middle half of the page in both directions.
let (a, b) = (r.min + r.size() * 0.25, r.min + r.size() * 0.75);
h.hover_at(a);
h.run_steps(1);
h.drag_at(a);
h.run_steps(1);
for k in 1..=4 {
h.hover_at(a + (b - a) * (k as f32 / 4.0));
h.run_steps(1);
}
h.drop_at(b);
h.run_steps(4);
let (w, hh) = size(&h, 0);
assert!((w - 150.0).abs() < 2.0 && (hh - 200.0).abs() < 2.0, "{w}×{hh}");
assert_eq!(size(&h, 1), (300.0, 400.0));
assert_eq!(h.state().quick_tool, QuickTool::Select);
assert_eq!(h.state().session.get(h.state().views[0].id).unwrap().can_undo(), Some("Crop page"));
}
#[test]
fn set_page_boxes_dialog_applies_margins_to_the_chosen_pages() {
let mut h = harness();
assert!(h.state_mut().execute("page.boxes"));
h.run_steps(3);
assert_eq!(h.state().dialog, Some(Dialog::PageBoxes));
h.get_by_label("Set Page Boxes");
// One inch off every side (the units default to inches; margins are stored in points).
h.state_mut().boxes_draft.margins = [72.0; 4];
h.run_steps(2);
h.get_by_label("OK").click();
h.run_steps(4);
assert_eq!(h.state().dialog, None);
assert_eq!(size(&h, 0), (156.0, 256.0));
assert_eq!(size(&h, 1), (156.0, 256.0), "All pages by default");
// Set to zero resets the box.
h.state_mut().execute("page.boxes");
h.run_steps(3);
h.get_by_label("Set to zero").click();
h.run_steps(1);
h.get_by_label("OK").click();
h.run_steps(4);
assert_eq!(size(&h, 0), (300.0, 400.0));
}
#[test]
fn duplicate_pages_copies_the_current_page() {
let mut h = harness();
assert!(h.state_mut().execute("page.duplicate"));
h.run_steps(3);
let s = h.state();
assert_eq!(s.session.get(s.views[0].id).unwrap().info.pages.len(), 3);
}