fix(tests): resolve compilation error in the multiple OCR functionality
This commit is contained in:
parent
e0b0f49ba2
commit
8d1a886139
156
src/ocr/tests.rs
156
src/ocr/tests.rs
|
|
@ -8,8 +8,6 @@ mod tests {
|
|||
use tempfile::TempDir;
|
||||
use std::fs;
|
||||
|
||||
// Include language validation tests
|
||||
mod language_validation_tests;
|
||||
|
||||
#[test]
|
||||
fn test_ocr_error_types() {
|
||||
|
|
@ -212,4 +210,158 @@ mod tests {
|
|||
panic!("Expected InsufficientMemory error, got: {:?}", result);
|
||||
}
|
||||
}
|
||||
|
||||
// Language validation tests
|
||||
fn create_test_health_checker_with_languages() -> (OcrHealthChecker, TempDir) {
|
||||
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
||||
let tessdata_path = temp_dir.path().join("tessdata");
|
||||
fs::create_dir_all(&tessdata_path).expect("Failed to create tessdata directory");
|
||||
|
||||
// Create mock language files
|
||||
let language_files = vec![
|
||||
"eng.traineddata",
|
||||
"spa.traineddata",
|
||||
"fra.traineddata",
|
||||
"deu.traineddata",
|
||||
"chi_sim.traineddata",
|
||||
];
|
||||
|
||||
for file in language_files {
|
||||
fs::write(tessdata_path.join(file), "mock data")
|
||||
.expect("Failed to create mock language file");
|
||||
}
|
||||
|
||||
let health_checker = OcrHealthChecker::new(tessdata_path);
|
||||
(health_checker, temp_dir)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_available_languages_success() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker_with_languages();
|
||||
|
||||
let result = health_checker.get_available_languages();
|
||||
assert!(result.is_ok());
|
||||
|
||||
let languages = result.unwrap();
|
||||
assert_eq!(languages.len(), 5);
|
||||
assert!(languages.contains(&"eng".to_string()));
|
||||
assert!(languages.contains(&"spa".to_string()));
|
||||
assert!(languages.contains(&"fra".to_string()));
|
||||
assert!(languages.contains(&"deu".to_string()));
|
||||
assert!(languages.contains(&"chi_sim".to_string()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_language_success() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker_with_languages();
|
||||
|
||||
// Test valid languages
|
||||
assert!(health_checker.validate_language("eng").is_ok());
|
||||
assert!(health_checker.validate_language("spa").is_ok());
|
||||
assert!(health_checker.validate_language("fra").is_ok());
|
||||
assert!(health_checker.validate_language("deu").is_ok());
|
||||
assert!(health_checker.validate_language("chi_sim").is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_language_invalid() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker_with_languages();
|
||||
|
||||
// Test invalid languages
|
||||
let result = health_checker.validate_language("invalid");
|
||||
assert!(result.is_err());
|
||||
match result.unwrap_err() {
|
||||
OcrError::LanguageDataNotFound { lang } => {
|
||||
assert_eq!(lang, "invalid");
|
||||
},
|
||||
_ => panic!("Expected LanguageDataNotFound error"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_language_case_sensitive() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker_with_languages();
|
||||
|
||||
// Should be case sensitive
|
||||
assert!(health_checker.validate_language("eng").is_ok());
|
||||
|
||||
let result = health_checker.validate_language("ENG");
|
||||
assert!(result.is_err());
|
||||
match result.unwrap_err() {
|
||||
OcrError::LanguageDataNotFound { lang } => {
|
||||
assert_eq!(lang, "ENG");
|
||||
},
|
||||
_ => panic!("Expected LanguageDataNotFound error"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_language_display_name() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker_with_languages();
|
||||
|
||||
// Test known language codes
|
||||
assert_eq!(health_checker.get_language_display_name("eng"), "English");
|
||||
assert_eq!(health_checker.get_language_display_name("spa"), "Spanish");
|
||||
assert_eq!(health_checker.get_language_display_name("fra"), "French");
|
||||
assert_eq!(health_checker.get_language_display_name("deu"), "German");
|
||||
assert_eq!(health_checker.get_language_display_name("chi_sim"), "Chinese (Simplified)");
|
||||
|
||||
// Test unknown language code (should return the code itself)
|
||||
assert_eq!(health_checker.get_language_display_name("unknown"), "unknown");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ignore_non_traineddata_files() {
|
||||
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
||||
let tessdata_path = temp_dir.path().join("tessdata");
|
||||
fs::create_dir_all(&tessdata_path).expect("Failed to create tessdata directory");
|
||||
|
||||
// Create mix of valid and invalid files
|
||||
let files = vec![
|
||||
"eng.traineddata", // Valid
|
||||
"readme.txt", // Invalid - not .traineddata
|
||||
"spa.traineddata", // Valid
|
||||
"config.json", // Invalid - not .traineddata
|
||||
"fra.backup", // Invalid - not .traineddata
|
||||
"deu.traineddata", // Valid
|
||||
];
|
||||
|
||||
for file in files {
|
||||
fs::write(tessdata_path.join(file), "mock data")
|
||||
.expect("Failed to create mock file");
|
||||
}
|
||||
|
||||
let health_checker = OcrHealthChecker::new(tessdata_path);
|
||||
let languages = health_checker.get_available_languages().unwrap();
|
||||
|
||||
// Should only include .traineddata files
|
||||
assert_eq!(languages.len(), 3);
|
||||
assert!(languages.contains(&"eng".to_string()));
|
||||
assert!(languages.contains(&"spa".to_string()));
|
||||
assert!(languages.contains(&"deu".to_string()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_multiple_languages_batch() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker_with_languages();
|
||||
|
||||
let languages_to_test = vec![
|
||||
("eng", true),
|
||||
("spa", true),
|
||||
("fra", true),
|
||||
("invalid", false),
|
||||
("", false),
|
||||
("ENG", false),
|
||||
("chi_sim", true),
|
||||
];
|
||||
|
||||
for (lang, should_be_valid) in languages_to_test {
|
||||
let result = health_checker.validate_language(lang);
|
||||
if should_be_valid {
|
||||
assert!(result.is_ok(), "Language '{}' should be valid", lang);
|
||||
} else {
|
||||
assert!(result.is_err(), "Language '{}' should be invalid", lang);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,298 +0,0 @@
|
|||
#[cfg(test)]
|
||||
mod language_validation_tests {
|
||||
use super::super::health::{OcrHealthChecker, OcrError};
|
||||
use std::path::Path;
|
||||
use tempfile::TempDir;
|
||||
use std::fs;
|
||||
|
||||
fn create_test_health_checker() -> (OcrHealthChecker, TempDir) {
|
||||
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
||||
let tessdata_path = temp_dir.path().join("tessdata");
|
||||
fs::create_dir_all(&tessdata_path).expect("Failed to create tessdata directory");
|
||||
|
||||
// Create mock language files
|
||||
let language_files = vec![
|
||||
"eng.traineddata",
|
||||
"spa.traineddata",
|
||||
"fra.traineddata",
|
||||
"deu.traineddata",
|
||||
"chi_sim.traineddata",
|
||||
];
|
||||
|
||||
for file in language_files {
|
||||
fs::write(tessdata_path.join(file), "mock data")
|
||||
.expect("Failed to create mock language file");
|
||||
}
|
||||
|
||||
let health_checker = OcrHealthChecker::new(tessdata_path);
|
||||
(health_checker, temp_dir)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_available_languages_success() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
let result = health_checker.get_available_languages();
|
||||
assert!(result.is_ok());
|
||||
|
||||
let languages = result.unwrap();
|
||||
assert_eq!(languages.len(), 5);
|
||||
assert!(languages.contains(&"eng".to_string()));
|
||||
assert!(languages.contains(&"spa".to_string()));
|
||||
assert!(languages.contains(&"fra".to_string()));
|
||||
assert!(languages.contains(&"deu".to_string()));
|
||||
assert!(languages.contains(&"chi_sim".to_string()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_available_languages_empty_directory() {
|
||||
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
||||
let tessdata_path = temp_dir.path().join("tessdata");
|
||||
fs::create_dir_all(&tessdata_path).expect("Failed to create tessdata directory");
|
||||
|
||||
let health_checker = OcrHealthChecker::new(tessdata_path);
|
||||
let result = health_checker.get_available_languages();
|
||||
|
||||
assert!(result.is_ok());
|
||||
let languages = result.unwrap();
|
||||
assert!(languages.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_available_languages_nonexistent_directory() {
|
||||
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
||||
let nonexistent_path = temp_dir.path().join("nonexistent");
|
||||
|
||||
let health_checker = OcrHealthChecker::new(nonexistent_path);
|
||||
let result = health_checker.get_available_languages();
|
||||
|
||||
assert!(result.is_err());
|
||||
match result.unwrap_err() {
|
||||
OcrError::TessdataPathNotFound { .. } => {},
|
||||
_ => panic!("Expected TessdataPathNotFound error"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_language_success() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
// Test valid languages
|
||||
assert!(health_checker.validate_language("eng").is_ok());
|
||||
assert!(health_checker.validate_language("spa").is_ok());
|
||||
assert!(health_checker.validate_language("fra").is_ok());
|
||||
assert!(health_checker.validate_language("deu").is_ok());
|
||||
assert!(health_checker.validate_language("chi_sim").is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_language_invalid() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
// Test invalid languages
|
||||
let result = health_checker.validate_language("invalid");
|
||||
assert!(result.is_err());
|
||||
match result.unwrap_err() {
|
||||
OcrError::LanguageDataNotFound { lang } => {
|
||||
assert_eq!(lang, "invalid");
|
||||
},
|
||||
_ => panic!("Expected LanguageDataNotFound error"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_language_empty_string() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
let result = health_checker.validate_language("");
|
||||
assert!(result.is_err());
|
||||
match result.unwrap_err() {
|
||||
OcrError::LanguageDataNotFound { lang } => {
|
||||
assert_eq!(lang, "");
|
||||
},
|
||||
_ => panic!("Expected LanguageDataNotFound error"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_language_case_sensitive() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
// Should be case sensitive
|
||||
assert!(health_checker.validate_language("eng").is_ok());
|
||||
|
||||
let result = health_checker.validate_language("ENG");
|
||||
assert!(result.is_err());
|
||||
match result.unwrap_err() {
|
||||
OcrError::LanguageDataNotFound { lang } => {
|
||||
assert_eq!(lang, "ENG");
|
||||
},
|
||||
_ => panic!("Expected LanguageDataNotFound error"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_language_with_special_characters() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
// chi_sim contains underscore
|
||||
assert!(health_checker.validate_language("chi_sim").is_ok());
|
||||
|
||||
// Test invalid special characters
|
||||
let result = health_checker.validate_language("chi-sim");
|
||||
assert!(result.is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_language_whitespace() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
// Test with leading/trailing whitespace
|
||||
let result = health_checker.validate_language(" eng ");
|
||||
assert!(result.is_err());
|
||||
|
||||
let result = health_checker.validate_language("eng ");
|
||||
assert!(result.is_err());
|
||||
|
||||
let result = health_checker.validate_language(" eng");
|
||||
assert!(result.is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_language_display_name() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
// Test known language codes
|
||||
assert_eq!(health_checker.get_language_display_name("eng"), "English");
|
||||
assert_eq!(health_checker.get_language_display_name("spa"), "Spanish");
|
||||
assert_eq!(health_checker.get_language_display_name("fra"), "French");
|
||||
assert_eq!(health_checker.get_language_display_name("deu"), "German");
|
||||
assert_eq!(health_checker.get_language_display_name("chi_sim"), "Chinese (Simplified)");
|
||||
|
||||
// Test unknown language code (should return the code itself)
|
||||
assert_eq!(health_checker.get_language_display_name("unknown"), "unknown");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_concurrent_language_validation() {
|
||||
use std::sync::Arc;
|
||||
use std::thread;
|
||||
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
let health_checker = Arc::new(health_checker);
|
||||
|
||||
let mut handles = vec![];
|
||||
|
||||
// Test concurrent validation of different languages
|
||||
for lang in &["eng", "spa", "fra", "deu", "chi_sim"] {
|
||||
let hc = Arc::clone(&health_checker);
|
||||
let lang = lang.to_string();
|
||||
let handle = thread::spawn(move || {
|
||||
hc.validate_language(&lang)
|
||||
});
|
||||
handles.push(handle);
|
||||
}
|
||||
|
||||
// All validations should succeed
|
||||
for handle in handles {
|
||||
let result = handle.join().expect("Thread panicked");
|
||||
assert!(result.is_ok());
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_languages_alphabetically_sorted() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
let languages = health_checker.get_available_languages().unwrap();
|
||||
let mut sorted_languages = languages.clone();
|
||||
sorted_languages.sort();
|
||||
|
||||
assert_eq!(languages, sorted_languages, "Languages should be sorted alphabetically");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ignore_non_traineddata_files() {
|
||||
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
||||
let tessdata_path = temp_dir.path().join("tessdata");
|
||||
fs::create_dir_all(&tessdata_path).expect("Failed to create tessdata directory");
|
||||
|
||||
// Create mix of valid and invalid files
|
||||
let files = vec![
|
||||
"eng.traineddata", // Valid
|
||||
"readme.txt", // Invalid - not .traineddata
|
||||
"spa.traineddata", // Valid
|
||||
"config.json", // Invalid - not .traineddata
|
||||
"fra.backup", // Invalid - not .traineddata
|
||||
"deu.traineddata", // Valid
|
||||
];
|
||||
|
||||
for file in files {
|
||||
fs::write(tessdata_path.join(file), "mock data")
|
||||
.expect("Failed to create mock file");
|
||||
}
|
||||
|
||||
let health_checker = OcrHealthChecker::new(tessdata_path);
|
||||
let languages = health_checker.get_available_languages().unwrap();
|
||||
|
||||
// Should only include .traineddata files
|
||||
assert_eq!(languages.len(), 3);
|
||||
assert!(languages.contains(&"eng".to_string()));
|
||||
assert!(languages.contains(&"spa".to_string()));
|
||||
assert!(languages.contains(&"deu".to_string()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_handle_permission_errors() {
|
||||
// This test simulates permission errors by using a non-readable directory
|
||||
// Note: This may not work on all systems, particularly Windows
|
||||
#[cfg(unix)]
|
||||
{
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
|
||||
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
||||
let tessdata_path = temp_dir.path().join("tessdata");
|
||||
fs::create_dir_all(&tessdata_path).expect("Failed to create tessdata directory");
|
||||
|
||||
// Remove read permissions
|
||||
let mut perms = fs::metadata(&tessdata_path).unwrap().permissions();
|
||||
perms.set_mode(0o000);
|
||||
fs::set_permissions(&tessdata_path, perms).unwrap();
|
||||
|
||||
let health_checker = OcrHealthChecker::new(&tessdata_path);
|
||||
let result = health_checker.get_available_languages();
|
||||
|
||||
// Should handle permission error gracefully
|
||||
assert!(result.is_err());
|
||||
|
||||
// Restore permissions for cleanup
|
||||
let mut perms = fs::metadata(&tessdata_path).unwrap().permissions();
|
||||
perms.set_mode(0o755);
|
||||
fs::set_permissions(&tessdata_path, perms).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_validate_multiple_languages_batch() {
|
||||
let (health_checker, _temp_dir) = create_test_health_checker();
|
||||
|
||||
let languages_to_test = vec![
|
||||
("eng", true),
|
||||
("spa", true),
|
||||
("fra", true),
|
||||
("invalid", false),
|
||||
("", false),
|
||||
("ENG", false),
|
||||
("chi_sim", true),
|
||||
];
|
||||
|
||||
for (lang, should_be_valid) in languages_to_test {
|
||||
let result = health_checker.validate_language(lang);
|
||||
if should_be_valid {
|
||||
assert!(result.is_ok(), "Language '{}' should be valid", lang);
|
||||
} else {
|
||||
assert!(result.is_err(), "Language '{}' should be invalid", lang);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
pub mod language_validation_tests;
|
||||
Loading…
Reference in New Issue