Files

77 lines
1.7 KiB
Rust

//! Tests for empty DAGs and minimal task configurations
use dagx::{task, DagResult, DagRunner};
use dagx_test::task_fn;
use tokio::task::yield_now;
#[tokio::test]
async fn test_dag_with_only_source_tasks() -> DagResult<()> {
// Test a DAG with multiple source tasks but no dependencies
let mut dag = DagRunner::new();
let tasks: Vec<_> = (0..100)
.map(|i| dag.add_task(task_fn::<(), _, _>(move |_: ()| 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);
}
Ok(())
}
#[tokio::test]
async fn test_single_self_contained_stateful_task() -> DagResult<()> {
// Test a single stateful task with internal state
struct Counter {
value: i32,
}
#[task]
impl Counter {
async fn run(&self) -> i32 {
self.value * 2
}
}
let mut dag = DagRunner::new();
let task = dag.add_task(Counter { value: 21 });
let mut output = dag
.run(|fut| async move { tokio::spawn(fut).await.unwrap() })
.await?;
assert_eq!(output.get(task), 42);
Ok(())
}
#[tokio::test]
async fn test_minimal_task_with_minimal_async_work() -> DagResult<()> {
// Test a task that does the absolute minimum async work
let mut dag = DagRunner::new();
struct YieldTask;
#[task]
impl YieldTask {
async fn run() -> i32 {
yield_now().await;
1337
}
}
let task = dag.add_task(YieldTask);
let mut output = dag
.run(|fut| async move { tokio::spawn(fut).await.unwrap() })
.await?;
assert_eq!(output.get(task), 1337);
Ok(())
}