use oxidize_pdf::batch::*;
use std::path::PathBuf;
#[test]
fn test_batch_job_types_comprehensive() {
let split_job = BatchJob::Split {
input: PathBuf::from("test.pdf"),
output_pattern: "page_{}.pdf".to_string(),
pages_per_file: 1,
};
assert_eq!(split_job.display_name(), "Split test.pdf");
assert_eq!(split_job.input_files().len(), 1);
assert!(split_job.output_file().is_none());
let merge_job = BatchJob::Merge {
inputs: vec![PathBuf::from("a.pdf"), PathBuf::from("b.pdf")],
output: PathBuf::from("merged.pdf"),
};
assert!(merge_job.display_name().contains("Merge 2 files"));
assert_eq!(merge_job.input_files().len(), 2);
assert_eq!(merge_job.output_file(), Some(&PathBuf::from("merged.pdf")));
let compress_job = BatchJob::Compress {
input: PathBuf::from("large.pdf"),
output: PathBuf::from("small.pdf"),
quality: 75,
};
assert!(compress_job.display_name().contains("Compress"));
assert!(compress_job.display_name().contains("quality: 75"));
assert_eq!(compress_job.estimate_complexity(), 50);
let extract_job = BatchJob::Extract {
input: PathBuf::from("source.pdf"),
output: PathBuf::from("extracted.pdf"),
pages: vec![1, 3, 5],
};
assert!(extract_job.display_name().contains("Extract 3 pages"));
assert_eq!(extract_job.estimate_complexity(), 45);
let rotate_job = BatchJob::Rotate {
input: PathBuf::from("landscape.pdf"),
output: PathBuf::from("portrait.pdf"),
rotation: 90,
pages: Some(vec![0, 2]),
};
assert!(rotate_job.display_name().contains("90°"));
assert_eq!(rotate_job.estimate_complexity(), 10); }
#[test]
fn test_batch_processing_workflow() {
let options = BatchOptions::default().with_parallelism(1);
let mut processor = BatchProcessor::new(options);
processor.add_job(BatchJob::Custom {
name: "Success Job 1".to_string(),
operation: Box::new(|| {
std::thread::sleep(std::time::Duration::from_millis(1));
Ok(())
}),
});
processor.add_job(BatchJob::Custom {
name: "Success Job 2".to_string(),
operation: Box::new(|| {
std::thread::sleep(std::time::Duration::from_millis(1));
Ok(())
}),
});
let summary = processor.execute().unwrap();
assert_eq!(summary.total_jobs, 2);
assert_eq!(summary.successful, 2);
assert_eq!(summary.failed, 0);
}
#[test]
fn test_batch_error_handling() {
let options = BatchOptions::default()
.with_parallelism(1)
.stop_on_error(false);
let mut processor = BatchProcessor::new(options);
processor.add_job(BatchJob::Custom {
name: "Success Job".to_string(),
operation: Box::new(|| Ok(())),
});
processor.add_job(BatchJob::Custom {
name: "Failure Job".to_string(),
operation: Box::new(|| Err(std::io::Error::other("Simulated error").into())),
});
processor.add_job(BatchJob::Custom {
name: "Another Success Job".to_string(),
operation: Box::new(|| Ok(())),
});
let summary = processor.execute().unwrap();
assert_eq!(summary.total_jobs, 3);
assert_eq!(summary.successful, 2);
assert_eq!(summary.failed, 1);
}
#[test]
fn test_batch_progress_tracking() {
let progress = BatchProgress::new();
progress.add_job();
progress.add_job();
progress.add_job();
let info = progress.get_info();
assert_eq!(info.total_jobs, 3);
assert_eq!(info.completed_jobs, 0);
progress.start_job();
progress.complete_job();
let info = progress.get_info();
assert_eq!(info.completed_jobs, 1);
assert_eq!(info.running_jobs, 0);
assert!((info.percentage() - 33.33).abs() < 0.1);
}