use anyhow::Result;
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use tempfile::TempDir;
#[test]
fn test_option_handling_without_unwrap() -> Result<()> {
fn get_value(should_exist: bool) -> Option<i32> {
if should_exist {
Some(42)
} else {
None
}
}
let some_value = get_value(true);
let none_value = get_value(false);
assert_eq!(some_value.unwrap_or(0), 42);
assert_eq!(none_value.unwrap_or(0), 0);
assert_eq!(some_value.unwrap_or(0), 42);
assert_eq!(none_value.unwrap_or(0), 0);
assert_eq!(some_value.map_or(0, |v| v * 2), 84);
assert_eq!(none_value.map_or(0, |v| v * 2), 0);
Ok(())
}
#[test]
fn test_result_handling_without_unwrap() -> Result<()> {
fn get_result(should_succeed: bool) -> Result<i32> {
if should_succeed {
Ok(42)
} else {
Err(anyhow::anyhow!("error"))
}
}
let ok_result = get_result(true);
let err_result = get_result(false);
assert_eq!(ok_result.as_ref().unwrap_or(&0), &42);
assert_eq!(err_result.as_ref().unwrap_or(&0), &0);
assert_eq!(ok_result.as_ref().map_or(0, |v| v * 2), 84);
assert_eq!(err_result.map_or(0, |v| v * 2), 0);
Ok(())
}
#[test]
fn test_error_propagation_through_call_stack() -> Result<()> {
fn inner_function() -> Result<String> {
Err(anyhow::anyhow!("Inner error"))
}
fn middle_function() -> Result<String> {
let result = inner_function()?;
Ok(result)
}
fn outer_function() -> Result<String> {
let result = middle_function()?;
Ok(result)
}
let result = outer_function();
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("Inner error"));
Ok(())
}
#[test]
fn test_regex_compilation_errors_handled() -> Result<()> {
use regex::Regex;
let invalid_patterns = vec![
"[", "(", "*", "(?P<)", ];
for pattern in invalid_patterns {
let result = Regex::new(pattern);
assert!(result.is_err());
}
Ok(())
}
#[test]
fn test_file_operations_handle_permission_errors() -> Result<()> {
use std::fs;
use std::os::unix::fs::PermissionsExt;
let temp_dir = TempDir::new()?;
let protected_file = temp_dir.path().join("protected.txt");
fs::write(&protected_file, "test")?;
let mut perms = fs::metadata(&protected_file)?.permissions();
perms.set_mode(0o444); fs::set_permissions(&protected_file, perms)?;
let result = fs::write(&protected_file, "new content");
assert!(result.is_err());
Ok(())
}
#[test]
fn test_concurrent_access_handles_locks() -> Result<()> {
use std::thread;
let data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data_clone = Arc::clone(&data);
let handle = thread::spawn(move || {
if let Ok(mut num) = data_clone.lock() {
*num += 1;
}
});
handles.push(handle);
}
for handle in handles {
handle.join().expect("Thread should complete");
}
let final_value = *data.lock().unwrap();
assert_eq!(final_value, 10);
Ok(())
}
#[test]
fn test_json_parsing_handles_malformed_input() -> Result<()> {
use serde_json;
let malformed_inputs = vec![
"", "{", "{'key': 'value'}", "{\"key\": }", "null", ];
for input in malformed_inputs {
let result: serde_json::Result<HashMap<String, String>> = serde_json::from_str(input);
assert!(result.is_err());
}
Ok(())
}
#[test]
fn test_environment_variable_fallbacks() -> Result<()> {
use std::env;
env::remove_var("PRODIGY_TEST_VAR");
let value = env::var("PRODIGY_TEST_VAR").unwrap_or_else(|_| "default".to_string());
assert_eq!(value, "default");
Ok(())
}
#[test]
fn test_state_file_handles_missing_gracefully() -> Result<()> {
let temp_dir = TempDir::new()?;
let state_file = temp_dir.path().join("nonexistent_state.json");
use std::fs;
let result = fs::read_to_string(&state_file);
assert!(result.is_err());
Ok(())
}
#[test]
fn test_working_directory_fallback() -> Result<()> {
let temp_dir = TempDir::new()?;
let current_dir = std::env::current_dir()?;
std::env::set_current_dir(&temp_dir)?;
let result = std::env::current_dir();
assert!(result.is_ok());
std::env::set_current_dir(current_dir)?;
Ok(())
}
#[test]
fn test_integration_no_panics() -> Result<()> {
use std::panic;
let original_hook = panic::take_hook();
let panic_count = Arc::new(Mutex::new(0));
let panic_count_clone = Arc::clone(&panic_count);
panic::set_hook(Box::new(move |_| {
let mut count = panic_count_clone.lock().unwrap();
*count += 1;
}));
panic::set_hook(original_hook);
let final_count = *panic_count.lock().unwrap();
assert_eq!(final_count, 0, "No panics should have occurred");
Ok(())
}