nigig-org/crates/apps/pdf/pdf-graphics/tests/streaming_port.rs
andodeki ac8f8aa002
Some checks failed
repo hygiene / hygiene (push) Has been cancelled
PDF engine / engine (push) Has been cancelled
PDF engine / makepad-integration (push) Has been cancelled
PDF engine / fuzz (push) Has been cancelled
nigig-build (CAD) / supply-chain (push) Has been cancelled
nigig-build (CAD) / cad-module (push) Has been cancelled
nigig-build (CAD) / full-crate-check (push) Has been cancelled
nigig-build (CAD) / cad-engine-coverage (push) Has been cancelled
nigig-build (CAD) / doc-workspace-coverage (push) Has been cancelled
nigig-build (CAD) / cad-widget-coverage (push) Has been cancelled
traffic / gates (push) Has been cancelled
traffic / nigig-traffic (push) Has been cancelled
traffic / supply-chain (push) Has been cancelled
doc-engine / engine (push) Has been cancelled
doc-engine / coverage (push) Has been cancelled
doc-engine / consumer (push) Has been cancelled
email / gates (push) Has been cancelled
email / email-domain (push) Has been cancelled
email / nigig-email (push) Has been cancelled
email / supply-chain (push) Has been cancelled
nigig-map / test (push) Has been cancelled
sms / gates (push) Has been cancelled
sms / robius-sms (push) Has been cancelled
sms / android (push) Has been cancelled
sms / nigig-sms (push) Has been cancelled
sms / supply-chain (push) Has been cancelled
spreadsheet / engine-coverage (push) Has been cancelled
spreadsheet / ui-controller-coverage (push) Has been cancelled
p2p-intel / engine (push) Has been cancelled
p2p-intel / notifications (push) Has been cancelled
p2p-intel / coverage (push) Has been cancelled
p2p-intel / makepad-app (push) Has been cancelled
p2p-intel / exchange-tab (push) Has been cancelled
Payment domain, storage, platform and UI / isolated-payment-tests (push) Has been cancelled
Payment domain, storage, platform and UI / payment-ui-tests (push) Has been cancelled
chore: sync full working tree to gitdab
Whole-tree sync: cad-core/cad-ui split sources, nigig-build
construction_frame migration, pdf port progress, mpesa/pay/uikit/doc
updates, workspace members/profiles/lock, CI workflows and reviews.
See individual file history for details.
2026-09-12 07:15:24 +03:00

62 lines
2.3 KiB
Rust

//! 1:1 port of `dart-pdf/packages/pdf_graphics/test/streaming_interpreter_test.dart`.
//!
//! Streaming (op-by-op) and materialized (parse-all-then-run)
//! interpretation must produce identical command lists.
use nigig_pdf_document::PdfDocument;
use nigig_pdf_graphics::content::{interpret_streaming, parse_content_stream};
use nigig_pdf_graphics::recording::{format_commands, RecordingDevice};
const PDFJS: &str = "/Users/aok/Projects/rustdev/CratesCode/dart-pdf/test_corpora/pdfjs";
#[test]
fn streaming_and_materialized_interpretation_agree() {
let fixtures = [
"operator-in-TJ-array.pdf",
"rotation.pdf",
"xobject-image.pdf",
"gradientfill.pdf",
"tiling-pattern-box.pdf",
"pattern_text_embedded_font.pdf",
"blendmode.pdf",
"knockout_smask.pdf",
];
let mut ran = 0;
for name in fixtures {
let path = format!("{PDFJS}/{name}");
let Ok(bytes) = std::fs::read(&path) else {
eprintln!("SKIP (missing corpus file): {path}");
continue;
};
let Ok(mut doc) = PdfDocument::parse(&bytes) else {
eprintln!("SKIP (unparseable — likely compressed xref): {path}");
continue;
};
let pages = doc.page_count().min(2);
for page_index in 0..pages {
let Ok(page) = doc.page(page_index) else { continue };
let content = page.content_data.clone();
let ops = parse_content_stream(&content).expect("content parses");
let materialized = RecordingDevice::from_ops(&ops);
let mut streamed = RecordingDevice::new();
// A malformed tail ends the stream; from_ops shares the same
// prefix behaviour, so both sides stay comparable.
let _ = interpret_streaming(&content, &mut streamed);
assert!(
!materialized.is_empty(),
"{name} page {page_index} recorded nothing"
);
assert_eq!(
format_commands(&streamed.commands),
format_commands(&materialized),
"{name} page {page_index} diverged"
);
ran += 1;
}
}
eprintln!("streaming/materialized compared {ran} pages");
assert!(ran > 0, "no corpus pages ran — checkout missing?");
}