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.
62 lines
2.1 KiB
Rust
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");
|
|
}
|