Files
FoFreeXit/crates/ff-engine/tests/big_doc.rs
T
admin 274012f854 Initial commit: FoFreeXit Phase 1 (Viewer) + Phase 2 (Annotate)
PDF viewer (render/search/text-select/thumbnails/outline) and annotation
engine (Highlight/Underline/Strikeout/Square/FreeText/Note) over PDFium +
lopdf, with Unicode font embedding for Vietnamese text and undo/redo.
2026-06-17 22:34:06 +07:00

62 lines
2.1 KiB
Rust

//! Stress test với tài liệu lớn (corpus/big-1000.pdf — 1000 trang).
//! Mỗi trang có text "Trang N"; riêng trang index 500 có thêm "ZZMARKER".
use std::path::PathBuf;
use std::time::Instant;
fn workspace_root() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("..")
.join("..")
.canonicalize()
.expect("workspace root")
}
fn fixture() -> PathBuf {
workspace_root().join("corpus").join("big-1000.pdf")
}
fn pdfium() -> pdfium_render::prelude::Pdfium {
if std::env::var("FOFREEXIT_PDFIUM_PATH").is_err() {
std::env::set_var("FOFREEXIT_PDFIUM_PATH", workspace_root());
}
ff_engine::bind_pdfium().expect("nạp PDFium")
}
#[test]
fn big_doc_page_count() {
let dims = ff_engine::page_dims(&pdfium(), &fixture(), None).expect("page_dims");
assert_eq!(dims.len(), 1000, "phải có 1000 trang");
}
#[test]
fn big_doc_render_first_and_last() {
let pdf = pdfium();
for idx in [0u16, 999u16] {
let t = Instant::now();
let r = ff_engine::render::render_page(&pdf, &fixture(), idx, 600, None)
.unwrap_or_else(|e| panic!("render trang {idx}: {e}"));
let ms = t.elapsed().as_millis();
// Không trắng trơn.
let dark = r
.image
.to_rgba8()
.pixels()
.filter(|p| p.0[3] > 10 && p.0[0] < 128 && p.0[1] < 128 && p.0[2] < 128)
.count();
assert!(dark > 100, "trang {idx} trắng trơn ({dark} px tối)");
// Ngưỡng rộng rãi để bắt hồi quy hiệu năng nghiêm trọng (không phải benchmark).
assert!(ms < 5000, "render trang {idx} quá chậm: {ms} ms");
}
}
#[test]
fn big_doc_search_single_marker() {
let t = Instant::now();
let hits = ff_engine::search(&pdfium(), &fixture(), "ZZMARKER", false, None).expect("search");
let ms = t.elapsed().as_millis();
assert_eq!(hits.len(), 1, "ZZMARKER phải có đúng 1 kết quả");
assert_eq!(hits[0].page_index, 500, "ZZMARKER phải ở trang index 500");
assert!(ms < 10000, "search toàn tài liệu quá chậm: {ms} ms");
}