@@ -275,6 +275,102 @@ type AsyncType() =
275275 Assert.IsTrue( t.IsCanceled)
276276 Assert.IsTrue(! cancelled)
277277
278+ [<Test>]
279+ member this.CreateImmediateAsTask () =
280+ let s = " Hello tasks!"
281+ let a = async { return s }
282+ #if FSCORE_ PORTABLE_ NEW || coreclr
283+ let t : Task < string > =
284+ #else
285+ use t : Task < string > =
286+ #endif
287+ Async.StartImmediateAsTask a
288+ this.WaitASec t
289+ Assert.IsTrue ( t.IsCompleted)
290+ Assert.AreEqual( s, t.Result)
291+
292+ [<Test>]
293+ member this.StartImmediateAsTask () =
294+ let s = " Hello tasks!"
295+ let a = async { return s }
296+ #if FSCORE_ PORTABLE_ NEW || coreclr
297+ let t =
298+ #else
299+ use t =
300+ #endif
301+ Async.StartImmediateAsTask a
302+ this.WaitASec t
303+ Assert.IsTrue ( t.IsCompleted)
304+ Assert.AreEqual( s, t.Result)
305+
306+
307+ [<Test>]
308+ member this.ExceptionPropagatesToImmediateTask () =
309+ let a = async {
310+ do raise ( Exception ())
311+ }
312+ #if FSCORE_ PORTABLE_ NEW || coreclr
313+ let t =
314+ #else
315+ use t =
316+ #endif
317+ Async.StartImmediateAsTask a
318+ let mutable exceptionThrown = false
319+ try
320+ this.WaitASec t
321+ with
322+ e -> exceptionThrown <- true
323+ Assert.IsTrue ( t.IsFaulted)
324+ Assert.IsTrue( exceptionThrown)
325+
326+ [<Test>]
327+ member this.CancellationPropagatesToImmediateTask () =
328+ let a = async {
329+ while true do ()
330+ }
331+ #if FSCORE_ PORTABLE_ NEW || coreclr
332+ let t =
333+ #else
334+ use t =
335+ #endif
336+ Async.StartImmediateAsTask a
337+ Async.CancelDefaultToken ()
338+ let mutable exceptionThrown = false
339+ try
340+ this.WaitASec t
341+ with e -> exceptionThrown <- true
342+ Assert.IsTrue ( exceptionThrown)
343+ Assert.IsTrue( t.IsCanceled)
344+
345+ [<Test>]
346+ member this.CancellationPropagatesToGroupImmediate () =
347+ let ewh = new ManualResetEvent( false )
348+ let cancelled = ref false
349+ let a = async {
350+ use! holder = Async.OnCancel ( fun _ -> cancelled := true )
351+ ewh.Set() |> Assert.IsTrue
352+ while true do ()
353+ }
354+ let cts = new CancellationTokenSource()
355+ let token = cts.Token
356+ #if FSCORE_ PORTABLE_ NEW || coreclr
357+ let t =
358+ #else
359+ use t =
360+ #endif
361+ Async.StartImmediateAsTask( a, cancellationToken= token)
362+ // printfn "%A" t.Status
363+ ewh.WaitOne() |> Assert.IsTrue
364+ cts.Cancel()
365+ // printfn "%A" t.Status
366+ let mutable exceptionThrown = false
367+ try
368+ this.WaitASec t
369+ with e -> exceptionThrown <- true
370+ Assert.IsTrue ( exceptionThrown)
371+ Assert.IsTrue( t.IsCanceled)
372+ Assert.IsTrue(! cancelled)
373+
278374
279375 [<Test>]
280376 member this.TaskAsyncValue () =
0 commit comments