use easy_prefs::easy_prefs;
use std::time::Duration;
easy_prefs! {
pub struct EditGuardTestPrefs {
pub value1: i32 = 0 => "value1",
pub value2: String = String::new() => "value2",
pub value3: bool = false => "value3",
},
"edit-guard-test"
}
#[test]
fn test_edit_guard_saves_on_drop() {
let mut prefs = EditGuardTestPrefs::load_testing();
{
let mut edit = prefs.edit();
edit.set_value1(100);
edit.set_value2("modified".to_string());
edit.set_value3(true);
}
let _file_path = prefs.get_preferences_file_path();
#[cfg(not(target_arch = "wasm32"))]
{
let contents = std::fs::read_to_string(&_file_path).unwrap();
assert!(contents.contains("value1 = 100"));
assert!(contents.contains("value2 = \"modified\""));
assert!(contents.contains("value3 = true"));
}
}
#[test]
fn test_edit_guard_no_save_without_changes() {
let mut prefs = EditGuardTestPrefs::load_testing();
prefs.save_value1(50).unwrap();
let _file_path = prefs.get_preferences_file_path();
#[cfg(not(target_arch = "wasm32"))]
let initial_mtime = std::fs::metadata(&_file_path).unwrap().modified().unwrap();
{
let edit = prefs.edit();
let _ = edit.get_value1();
let _ = edit.get_value2();
}
#[cfg(not(target_arch = "wasm32"))]
{
let new_mtime = std::fs::metadata(&_file_path).unwrap().modified().unwrap();
assert_eq!(
initial_mtime, new_mtime,
"File should not be modified without changes"
);
}
}
#[test]
fn test_edit_guard_only_saves_on_actual_changes() {
let mut prefs = EditGuardTestPrefs::load_testing();
prefs.save_value1(42).unwrap();
{
let mut edit = prefs.edit();
edit.set_value1(42); }
{
let mut edit = prefs.edit();
edit.set_value1(43); }
assert_eq!(*prefs.get_value1(), 43);
}
#[test]
#[cfg(debug_assertions)]
fn test_edit_guard_warning_on_long_hold() {
let mut prefs = EditGuardTestPrefs::load_testing();
{
let mut edit = prefs.edit();
edit.set_value1(100);
std::thread::sleep(Duration::from_millis(1100));
}
assert_eq!(*prefs.get_value1(), 100);
}