Address soundness hole in cycle prevention

This commit is contained in:
TechnoPorg committed 2026-01-29 06:56:17 +01:00
1 parent 4ad88bcd68
commit f82205baf4
80 files changed
+730 -717

No files matched your search

+11 -9
View File
@@ -9,9 +9,9 @@ use futures::FutureExt;
async fn test_example_a_fan_out() {
let dag = DagRunner::new();
let base = dag.add_task(Seed::new(10)); // Input=() → no depends_on, returns TaskHandle
let plus1 = dag.add_task(Inc::new()).depends_on(&base); // 11
let plus2 = dag.add_task(Inc::new()).depends_on(&base); // 11
let base: TaskHandle<_> = dag.add_task(Seed::new(10)).into(); // Input=() → no depends_on, returns TaskHandle
let plus1 = dag.add_task(Inc::new()).depends_on(base); // 11
let plus2 = dag.add_task(Inc::new()).depends_on(base); // 11
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
.await
@@ -29,7 +29,7 @@ async fn test_example_b_fan_in() {
let n = dag.add_task(task_fn(|_: ()| async { 42usize }));
let f = dag.add_task(task_fn(|_: ()| async { true }));
let output = dag.add_task(OutputResult::new()).depends_on((&s, &n, &f));
let output = dag.add_task(OutputResult::new()).depends_on((s, n, f));
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
.await
@@ -42,11 +42,11 @@ async fn test_example_c_many_to_many() {
let dag = DagRunner::new();
let x = dag.add_task(Seed::new(2));
let y = dag.add_task(Seed::new(3));
let y = dag.add_task(Seed::new(3)).into();
let z = dag.add_task(Seed::new(5));
let sum_xy = dag.add_task(Add::new()).depends_on((&x, &y)); // 5
let prod_yz = dag.add_task(Mul::new()).depends_on((&y, &z)); // 15
let sum_xy = dag.add_task(Add::new()).depends_on((x, &y)); // 5
let prod_yz = dag.add_task(Mul::new()).depends_on((&y, z)); // 15
let total = dag.add_task(Add::new()).depends_on((&sum_xy, &prod_yz)); // 20
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
@@ -59,12 +59,14 @@ async fn test_example_c_many_to_many() {
async fn test_single_input_forms() {
let dag = DagRunner::new();
let s = dag.add_task(task_fn(|_: ()| async { "hello".to_owned() }));
let s = dag
.add_task(task_fn(|_: ()| async { "hello".to_owned() }))
.into();
// Preferred form: &node
let upper1 = dag
.add_task(task_fn(|s: String| async move { s.to_uppercase() }))
.depends_on(&s);
.depends_on(s);
// Also allowed: (&node,)
let upper2 = dag