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.
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
//! 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");
|
||||
}
|
||||
Reference in New Issue
Block a user