use easy_prefs::easy_prefs;
easy_prefs! {
struct TestDefaultPrefs {
pub enabled: bool = true => "enabled",
pub count: i32 = 42 => "count",
pub name: String = "default".to_string() => "name",
},
"test-default-prefs"
}
#[test]
fn test_load_default_removal_and_new_api() {
test_load_creates_defaults_when_file_missing();
test_load_default_panics();
test_load_with_error_handles_instance_conflict();
test_load_panics_on_instance_conflict();
#[cfg(not(any(debug_assertions, test)))]
test_load_returns_defaults_on_error_in_release();
}
fn test_load_creates_defaults_when_file_missing() {
let test_dir = format!("/tmp/easy_prefs_test_{}", std::process::id());
let prefs = TestDefaultPrefs::load(&test_dir);
assert_eq!(*prefs.get_enabled(), true);
assert_eq!(*prefs.get_count(), 42);
assert_eq!(prefs.get_name(), "default");
let path = prefs.get_preferences_file_path();
assert!(path.contains(&test_dir));
assert!(path.contains("test-default-prefs.toml"));
let _ = std::fs::remove_dir_all(&test_dir);
drop(prefs);
}
fn test_load_default_panics() {
let test_dir = format!("/tmp/easy_prefs_test_panic_{}", std::process::id());
let result = std::panic::catch_unwind(|| {
#[allow(deprecated)]
let _prefs = TestDefaultPrefs::load_default(&test_dir);
});
assert!(result.is_err());
let panic_msg = result.unwrap_err();
if let Some(msg) = panic_msg.downcast_ref::<String>() {
assert!(msg.contains("load_default() has been removed in version 3.0.0"));
} else if let Some(msg) = panic_msg.downcast_ref::<&str>() {
assert!(msg.contains("load_default() has been removed in version 3.0.0"));
}
}
fn test_load_with_error_handles_instance_conflict() {
let test_dir = format!("/tmp/easy_prefs_test_conflict_{}", std::process::id());
let _prefs1 = TestDefaultPrefs::load_with_error(&test_dir).expect("First load should succeed");
let result = TestDefaultPrefs::load_with_error(&test_dir);
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
easy_prefs::LoadError::InstanceAlreadyLoaded
));
drop(_prefs1);
let _ = std::fs::remove_dir_all(&test_dir);
}
fn test_load_panics_on_instance_conflict() {
let test_dir = format!("/tmp/easy_prefs_test_panic_conflict_{}", std::process::id());
let _prefs1 = TestDefaultPrefs::load(&test_dir);
let result = std::panic::catch_unwind(|| {
let _prefs2 = TestDefaultPrefs::load(&test_dir);
});
assert!(result.is_err());
let panic_msg = result.unwrap_err();
if let Some(msg) = panic_msg.downcast_ref::<String>() {
assert!(msg.contains("Failed to load preferences"));
} else if let Some(msg) = panic_msg.downcast_ref::<&str>() {
assert!(msg.contains("Failed to load preferences"));
}
drop(_prefs1);
}
#[cfg(not(any(debug_assertions, test)))]
fn test_load_returns_defaults_on_error_in_release() {
let test_dir = format!("/tmp/easy_prefs_test_release_{}", std::process::id());
std::fs::create_dir_all(&test_dir).unwrap();
let file_path = format!("{}/test-default-prefs.toml", test_dir);
std::fs::write(&file_path, "invalid toml content [[[").unwrap();
let prefs = TestDefaultPrefs::load(&test_dir);
assert_eq!(*prefs.get_enabled(), true);
assert_eq!(*prefs.get_count(), 42);
assert_eq!(prefs.get_name(), "default");
let _ = std::fs::remove_dir_all(&test_dir);
}