use operese_dagx::{DagResult, DagRunner};
use operese_dagx_test::task_fn;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
#[tokio::test]
async fn test_spawner_actually_spawns_tasks() -> DagResult<()> {
let mut dag = DagRunner::new();
let spawn_count = Arc::new(AtomicUsize::new(0));
let tasks: Vec<_> = (0..10)
.map(|i| {
dag.add_task(task_fn::<(), _, _>({
let value = spawn_count.clone();
move |_: ()| {
let value = value.clone();
value.fetch_add(1, Ordering::SeqCst);
i
}
}))
})
.collect();
let mut output = dag
.run(|fut| async move { tokio::spawn(fut).await.unwrap() })
.await?;
for (i, task) in tasks.into_iter().enumerate() {
assert_eq!(output.get(task), i as i32);
}
let spawns = spawn_count.load(Ordering::SeqCst);
assert_eq!(
spawns, 10,
"Expected spawner to be called 10 times, but was called {} times",
spawns
);
Ok(())
}