//! 外部视角 API 测试:验证 `ddddocr-tract2` 的公开类型与方法在外部 crate 中可正常使用。 use ddddocr_core::Resize; use ddddocr_core::traits::{Info, Loader}; use ddddocr_core::types::AxisDim; use ddddocr_tract2::loader::ModelLoader; use ddddocr_tract2::{ DetRuntime, ModelMetadata, Normalization, OcrBuilder, OcrRuntime, Session, SlideResult, Slider, }; use std::path::{Path, PathBuf}; fn model_path(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) .join("..") .join("models") .join(name) } /// 验证对外导出的类型(含 `Session` 与 core 便捷重导出)均可直接命名。 #[test] fn public_types_are_nameable() { let _: Option = None; let _: Option = None; let _: Option = None; let _slider = Slider::new(); } /// 验证构建器链式 API 可组合使用,且返回的会话类型可显式标注。 #[test] fn loader_chain_builds_session() -> anyhow::Result<()> { let path = model_path("common_sml2h3_f32.onnx"); assert!(path.exists(), "缺少测试模型: {}", path.display()); let _session: Session = ModelLoader::default().num_threads(4).build_for_path(path)?; Ok(()) } /// 验证 `Info` trait 能从真实会话中解析输入/输出信息。 #[test] fn info_trait_returns_model_metadata() -> anyhow::Result<()> { let path = model_path("common_sml2h3_f32.onnx"); assert!(path.exists(), "缺少测试模型: {}", path.display()); let session: Session = ModelLoader::default().build_for_path(path)?; let metadata = ModelMetadata::from_static_slice( &["a", "b"], false, Resize::DynamicWidth(64), 1, Normalization::MinusOneToOne, ); let ocr = OcrRuntime::new(session, metadata); let inputs = ocr.input_info()?; let outputs = ocr.output_info()?; assert!(!inputs.is_empty()); assert!(!outputs.is_empty()); assert!(matches!(inputs[0].shape[0], AxisDim::Static(1))); assert!(matches!(inputs[0].shape[2], AxisDim::Static(64))); let model_info = ocr.model_info()?; assert_eq!(model_info.inputs.len(), inputs.len()); assert_eq!(model_info.outputs.len(), outputs.len()); assert!(model_info.providers.is_none()); Ok(()) } /// 验证检测运行时可以从构建的会话创建。 #[test] fn det_runtime_builds_from_session() -> anyhow::Result<()> { let path = model_path("common_det.onnx"); assert!(path.exists(), "缺少测试模型: {}", path.display()); let session: Session = ModelLoader::default().build_for_path(path)?; let _det = DetRuntime::new(session); Ok(()) }