use effect_rs::{Effect, Exit, Schedule, TestRuntime};
use std::sync::{Arc, Mutex};
use std::time::Duration;
#[test]
fn test_virtual_clock() {
let rt = TestRuntime::new();
let duration = Duration::from_secs(10);
let program: Effect<(), (), i32> = Effect::<(), (), ()>::sleep(duration).map(|_| 42);
let handle = rt.spawn(program, ());
std::thread::sleep(Duration::from_millis(100));
rt.advance_blocking(Duration::from_secs(10));
let result = rt.block_on_future(handle).unwrap();
match result {
Exit::Success(val) => assert_eq!(val, 42),
Exit::Failure(_) => panic!("Expected success"),
}
}
#[test]
fn test_retry_virtual_time() {
let rt = TestRuntime::new();
let counter = Arc::new(Mutex::new(0));
let counter_clone = counter.clone();
let program = Effect::sync(move || {
let mut c = counter_clone.lock().unwrap();
*c += 1;
if *c <= 2 { Err(()) } else { Ok(42) }
})
.flat_map(|res| match res {
Ok(v) => Effect::succeed(v),
Err(_) => Effect::fail(()),
})
.retry(Schedule::<(), ()>::spaced(Duration::from_secs(5)));
let handle = rt.spawn(program, ());
std::thread::sleep(Duration::from_millis(100));
assert_eq!(*counter.lock().unwrap(), 1);
rt.advance_blocking(Duration::from_secs(5));
std::thread::sleep(Duration::from_millis(100)); assert_eq!(*counter.lock().unwrap(), 2);
rt.advance_blocking(Duration::from_secs(5));
let result = rt.block_on_future(handle).unwrap();
match result {
Exit::Success(val) => assert_eq!(val, 42),
Exit::Failure(_) => panic!("Expected success"),
}
assert_eq!(*counter.lock().unwrap(), 3);
}