use moonpool_sim::{Event, SimWorld};
use std::time::Duration;
#[tokio::test]
async fn test_basic_sleep() {
let mut sim = SimWorld::new();
assert_eq!(sim.current_time(), Duration::ZERO);
let sleep_future = sim.sleep(Duration::from_millis(100));
assert_eq!(sim.current_time(), Duration::ZERO);
assert!(sim.has_pending_events());
assert_eq!(sim.pending_event_count(), 1);
sim.run_until_empty();
assert_eq!(sim.current_time(), Duration::from_millis(100));
sleep_future.await.unwrap();
}
#[tokio::test]
async fn test_multiple_sleeps_sequential() {
let mut sim = SimWorld::new();
let sleep1 = sim.sleep(Duration::from_millis(50));
sim.run_until_empty();
sleep1.await.unwrap();
assert_eq!(sim.current_time(), Duration::from_millis(50));
let sleep2 = sim.sleep(Duration::from_millis(30));
sim.run_until_empty();
sleep2.await.unwrap();
assert_eq!(sim.current_time(), Duration::from_millis(80));
let sleep3 = sim.sleep(Duration::from_millis(20));
sim.run_until_empty();
sleep3.await.unwrap();
assert_eq!(sim.current_time(), Duration::from_millis(100));
}
#[tokio::test]
async fn test_multiple_sleeps_concurrent() {
let mut sim = SimWorld::new();
let sleep1 = sim.sleep(Duration::from_millis(100));
let sleep2 = sim.sleep(Duration::from_millis(50));
let sleep3 = sim.sleep(Duration::from_millis(150));
assert_eq!(sim.pending_event_count(), 3);
sim.run_until_empty();
assert_eq!(sim.current_time(), Duration::from_millis(150));
let (result1, result2, result3) = tokio::join!(sleep1, sleep2, sleep3);
assert!(result1.is_ok());
assert!(result2.is_ok());
assert!(result3.is_ok());
}
#[tokio::test]
async fn test_event_ordering_and_processing() {
let mut sim = SimWorld::new();
sim.schedule_event(Event::Timer { task_id: 1 }, Duration::from_millis(100));
sim.schedule_event(Event::Timer { task_id: 2 }, Duration::from_millis(50));
sim.schedule_event(Event::Timer { task_id: 3 }, Duration::from_millis(150));
assert!(sim.step()); assert_eq!(sim.current_time(), Duration::from_millis(50));
assert!(sim.step()); assert_eq!(sim.current_time(), Duration::from_millis(100));
assert!(!sim.step()); assert_eq!(sim.current_time(), Duration::from_millis(150));
}
#[tokio::test]
async fn test_sleep_zero_duration() {
let mut sim = SimWorld::new();
let sleep_future = sim.sleep(Duration::ZERO);
sim.run_until_empty();
assert_eq!(sim.current_time(), Duration::ZERO);
sleep_future.await.unwrap();
}
#[tokio::test]
async fn test_sleep_future_can_be_awaited_after_event_processing() {
let mut sim = SimWorld::new();
let sleep_future = sim.sleep(Duration::from_millis(100));
sim.run_until_empty();
assert_eq!(sim.current_time(), Duration::from_millis(100));
sleep_future.await.unwrap();
}
#[tokio::test]
async fn test_task_id_generation_is_unique() {
let sim = SimWorld::new();
let _sleep1 = sim.sleep(Duration::from_millis(10));
let _sleep2 = sim.sleep(Duration::from_millis(20));
let _sleep3 = sim.sleep(Duration::from_millis(30));
assert_eq!(sim.pending_event_count(), 3);
}
#[tokio::test]
async fn test_weak_sim_world_sleep_handling() {
let sim = SimWorld::new();
let _weak_sim = sim.downgrade();
let sleep_future = sim.sleep(Duration::from_millis(100));
drop(sim);
let result = sleep_future.await;
assert!(result.is_err());
}