xberg-cli 1.3.0

Command-line interface for Xberg document intelligence
use super::super::*;
use super::default_overrides;
use xberg::{ExecutionProviderType, ExtractionConfig};

#[test]
fn test_acceleration_applied() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        acceleration: Some(AccelerationArg::Cpu),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    let accel = config.acceleration.unwrap();
    assert_eq!(accel.provider, ExecutionProviderType::Cpu);
}

#[test]
fn test_extract_pages_applied() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        extract_pages: Some(true),
        page_markers: Some(true),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    let pages = config.pages.unwrap();
    assert!(pages.extract_pages);
    assert!(pages.insert_page_markers);
}

#[test]
fn test_extract_images_applied() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        extract_images: Some(true),
        target_dpi: Some(150),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    let images = config.images.unwrap();
    assert!(images.extract_images);
    assert_eq!(images.target_dpi, 150);
}

#[cfg(feature = "analysis")]
#[test]
fn test_token_reduction_applied() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        token_reduction: Some(ReductionLevelArg::Aggressive),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    let reduction = config.token_reduction.unwrap();
    assert_eq!(reduction.mode, "aggressive");
}

#[test]
fn test_msg_codepage_applied() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        msg_codepage: Some(1251),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    let email = config.email.unwrap();
    assert_eq!(email.msg_fallback_codepage, Some(1251));
}

#[test]
fn test_max_concurrent_applied() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        max_concurrent: Some(4),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    assert_eq!(config.max_concurrent_extractions, Some(4));
}

#[test]
fn test_max_threads_applied() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        max_threads: Some(2),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    let concurrency = config.concurrency.unwrap();
    assert_eq!(concurrency.max_threads, Some(2));
}

#[test]
fn test_max_concurrent_ocr_applied() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        max_threads: Some(16),
        max_concurrent_ocr: Some(4),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    let concurrency = config.concurrency.unwrap();
    assert_eq!(concurrency.max_threads, Some(16));
    assert_eq!(concurrency.max_concurrent_ocr, Some(4));
}

#[test]
fn test_include_structure_applied() {
    let mut config = ExtractionConfig::default();
    assert!(!config.include_document_structure);
    let overrides = ExtractionOverrides {
        include_structure: Some(true),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    assert!(config.include_document_structure);
}

#[test]
fn test_validate_max_concurrent_zero() {
    let overrides = ExtractionOverrides {
        max_concurrent: Some(0),
        ..default_overrides()
    };
    let err = overrides.validate().unwrap_err();
    assert!(err.to_string().contains("--max-concurrent must be at least 1"));
}

#[test]
fn test_validate_max_threads_zero() {
    let overrides = ExtractionOverrides {
        max_threads: Some(0),
        ..default_overrides()
    };
    let err = overrides.validate().unwrap_err();
    assert!(err.to_string().contains("--max-threads must be at least 1"));
}

#[test]
fn test_validate_max_concurrent_ocr_zero() {
    let overrides = ExtractionOverrides {
        max_concurrent_ocr: Some(0),
        ..default_overrides()
    };
    let err = overrides.validate().unwrap_err();
    assert!(err.to_string().contains("--max-concurrent-ocr must be at least 1"));
}

#[test]
fn test_no_overrides_leaves_config_unchanged() {
    let original = ExtractionConfig::default();
    let mut config = original.clone();
    let overrides = default_overrides();
    overrides.apply(&mut config);

    assert!(config.ocr.is_none());
    assert!(config.chunking.is_none());
    assert!(config.use_cache);
    assert!(config.enable_quality_processing);
    assert!(!config.force_ocr);
    assert!(config.language_detection.is_none());
    assert!(config.pages.is_none());
    assert!(config.images.is_none());
    assert!(config.token_reduction.is_none());
    assert!(config.email.is_none());
    assert!(config.acceleration.is_none());
    assert!(config.concurrency.is_none());
    assert!(!config.include_document_structure);
}