use ocr::api::Ocr;
use ocr::utils::Result;
use std::path::Path;
#[tokio::test]
async fn test_simple_text() -> Result<()> {
let test_image = Path::new("test_images/simple_text.png");
if !test_image.exists() {
eprintln!("Test image not found: {:?}", test_image);
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(
!result.text.trim().is_empty() || result.word_count() > 0,
"Expected `simple_text.png` to produce recognized text or words"
);
assert!(
result.confidence >= 0.0 && result.confidence <= 1.0,
"Confidence should be valid"
);
Ok(())
}
#[tokio::test]
async fn test_multiline_text() -> Result<()> {
let test_image = Path::new("test_images/multiline_text.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0 && result.confidence <= 1.0);
Ok(())
}
#[tokio::test]
async fn test_mixed_case() -> Result<()> {
let test_image = Path::new("test_images/mixed_case.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0, "Should return valid confidence");
Ok(())
}
#[tokio::test]
async fn test_numbers_special() -> Result<()> {
let test_image = Path::new("test_images/numbers_special.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0, "Should return valid confidence");
Ok(())
}
#[tokio::test]
async fn test_small_text() -> Result<()> {
let test_image = Path::new("test_images/small_text.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(
!result.text.is_empty() || result.words.is_empty(),
"Should recognize some text or words"
);
Ok(())
}
#[tokio::test]
async fn test_large_text() -> Result<()> {
let test_image = Path::new("test_images/large_text.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0, "Should return valid confidence");
Ok(())
}
#[tokio::test]
async fn test_dark_background() -> Result<()> {
let test_image = Path::new("test_images/dark_background.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0, "Should return valid confidence");
Ok(())
}
#[tokio::test]
async fn test_noisy_background() -> Result<()> {
let test_image = Path::new("test_images/noisy_background.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(
!result.text.is_empty() || result.words.is_empty(),
"Should recognize some text despite noise"
);
Ok(())
}
#[tokio::test]
async fn test_column_layout() -> Result<()> {
let test_image = Path::new("test_images/column_layout.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0 && result.confidence <= 1.0);
Ok(())
}
#[tokio::test]
async fn test_table_layout() -> Result<()> {
let test_image = Path::new("test_images/table_layout.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0, "Should return valid confidence");
Ok(())
}
#[tokio::test]
async fn test_dense_text() -> Result<()> {
let test_image = Path::new("test_images/dense_text.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0, "Should return valid confidence");
Ok(())
}
#[tokio::test]
async fn test_low_contrast() -> Result<()> {
let test_image = Path::new("test_images/low_contrast.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(
!result.text.is_empty() || result.words.is_empty(),
"Should attempt to recognize low contrast text"
);
Ok(())
}
#[tokio::test]
async fn test_rotated_text() -> Result<()> {
let test_image = Path::new("test_images/rotated_text.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(
!result.text.is_empty() || result.words.is_empty(),
"Should attempt to recognize rotated text"
);
Ok(())
}
#[tokio::test]
async fn test_mixed_languages() -> Result<()> {
let test_image = Path::new("test_images/mixed_languages.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0, "Should return valid confidence");
Ok(())
}
#[tokio::test]
async fn test_complex_document() -> Result<()> {
let test_image = Path::new("test_images/complex_document.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.confidence >= 0.0, "Should return valid confidence");
Ok(())
}
#[tokio::test]
async fn test_batch_all_images() -> Result<()> {
let test_dir = Path::new("test_images");
if !test_dir.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let mut success_count = 0;
let mut total_count = 0;
let entries = std::fs::read_dir(test_dir)?;
for entry in entries {
let entry = entry?;
let path = entry.path();
if path.extension().and_then(|s| s.to_str()) == Some("png") {
total_count += 1;
match ocr.recognize_text_from_file(&path).await {
Ok(result) => {
if !result.text.is_empty() || !result.words.is_empty() {
success_count += 1;
}
}
Err(_) => {
}
}
}
}
assert!(total_count > 0, "Should find at least one test image");
println!(
"Processed {} images, {} returned results",
total_count, success_count
);
Ok(())
}
#[tokio::test]
async fn test_confidence_scores() -> Result<()> {
let test_image = Path::new("test_images/simple_text.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(
result.confidence >= 0.0 && result.confidence <= 1.0,
"Confidence should be between 0 and 1, got: {}",
result.confidence
);
if !result.text.is_empty() {
assert!(
result.confidence > 0.0,
"Non-empty text should have positive confidence"
);
}
Ok(())
}
#[tokio::test]
async fn test_word_level_results() -> Result<()> {
let test_image = Path::new("test_images/multiline_text.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
if !result.text.is_empty() {
let _ = &result.words;
}
Ok(())
}
#[tokio::test]
async fn test_character_level_results() -> Result<()> {
let test_image = Path::new("test_images/simple_text.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
if !result.text.is_empty() {
let _ = &result.characters;
}
Ok(())
}
#[tokio::test]
async fn test_bounding_boxes() -> Result<()> {
let test_image = Path::new("test_images/simple_text.png");
if !test_image.exists() {
return Ok(());
}
let ocr = Ocr::new()?;
ocr.initialize().await?;
let result = ocr.recognize_text_from_file(test_image).await?;
assert!(result.bounding_box.right >= result.bounding_box.left);
assert!(result.bounding_box.bottom >= result.bounding_box.top);
Ok(())
}