@@ -41,7 +41,7 @@ let ``CE taskSeq: use 'do!' with a non-generic valuetask`` () =
4141let ``CE taskSeq : use 'do ! ' with a non- generic task`` () =
4242 let mutable value = 0
4343
44- taskSeq { do ! ( task { do value <- value + 1 }) |> Task.ignore }
44+ taskSeq { do ! task { do value <- value + 1 } |> Task.ignore }
4545 |> verifyEmpty
4646 |> Task.map ( fun _ -> value |> should equal 1 )
4747
@@ -56,3 +56,47 @@ let ``CE taskSeq: use 'do!' with a task-delay`` () =
5656 }
5757 |> verifyEmpty
5858 |> Task.map ( fun _ -> value |> should equal 2 )
59+
60+ [<Fact>]
61+ let ``CE taskSeq : use 'do ! ' with Async`` () =
62+ let mutable value = 0
63+
64+ taskSeq {
65+ do value <- value + 1
66+ do ! Async.Sleep 50
67+ do value <- value + 1
68+ }
69+ |> verifyEmpty
70+ |> Task.map ( fun _ -> value |> should equal 2 )
71+
72+ [<Fact>]
73+ let ``CE taskSeq : use 'do ! ' with Async - mutables`` () =
74+ let mutable value = 0
75+
76+ taskSeq {
77+ do ! async { value <- value + 1 }
78+ do ! Async.Sleep 50
79+ do ! async { value <- value + 1 }
80+ }
81+ |> verifyEmpty
82+ |> Task.map ( fun _ -> value |> should equal 2 )
83+
84+ [<Fact>]
85+ let ``CE taskSeq : use 'do ! ' with all kinds of overloads at once`` () =
86+ let mutable value = 0
87+
88+ // this test should be expanded in case any new overload is added
89+ // that is supported by `do!`, to ensure the high/low priority
90+ // overloads still work properly
91+ taskSeq {
92+ do ! task { do value <- value + 1 } |> Task.ignore
93+ do ! ValueTask <| task { do value <- value + 1 }
94+ do ! ValueTask.ofTask ( task { do value <- value + 1 })
95+ do ! ValueTask<_>(()) // unit valuetask that completes immediately
96+ do ! Task.fromResult (()) // unit Task that completes immediately
97+ do ! Task.Delay 0
98+ do ! Async.Sleep 0
99+ do ! async { value <- value + 1 } // eq 4
100+ }
101+ |> verifyEmpty
102+ |> Task.map ( fun _ -> value |> should equal 4 )
0 commit comments