@@ -4,15 +4,35 @@ open System
4
4
open System.Threading .Tasks
5
5
open Xunit
6
6
open FSharp.Control
7
+ open FsUnit.Xunit
8
+
9
+ //
10
+ // this file can be used to hand-test NuGet deploys
11
+ // esp. when there are changes in the surface area
12
+ //
13
+ // This project gets compiled in CI, but is not part
14
+ // of the structured test reports currently.
15
+ // However, a compile error will fail the CI pipeline.
16
+ //
17
+
18
+
19
+ type private MultiDispose ( disposed : int ref ) =
20
+ member _.Get1 () = 1
21
+
22
+ interface IDisposable with
23
+ member _.Dispose () = disposed.Value <- 1
24
+
25
+ interface IAsyncDisposable with
26
+ member _.DisposeAsync () = ValueTask( task { do disposed.Value <- - 1 })
7
27
8
28
[<Fact>]
9
- let ``Use and execute a taskSeq from nuget`` () =
29
+ let ``Use and execute a minimal taskSeq from nuget`` () =
10
30
taskSeq { yield 10 }
11
31
|> TaskSeq.toArray
12
32
|> fun x -> Assert.Equal< int array>( x, [| 10 |])
13
33
14
34
[<Fact>]
15
- let ``Use and execute a taskSeq from nuget with multiple keywords`` () =
35
+ let ``Use taskSeq from nuget with multiple keywords v0.2.2 `` () =
16
36
taskSeq {
17
37
do ! task { do ! Task.Delay 10 }
18
38
let! x = task { return 1 }
@@ -26,19 +46,52 @@ let ``Use and execute a taskSeq from nuget with multiple keywords`` () =
26
46
27
47
// from version 0.3.0:
28
48
29
- //[<Fact>]
30
- //let ``Use and execute a taskSeq from nuget with multiple keywords v0.3.0`` () =
31
- // taskSeq {
32
- // do! task { do! Task.Delay 10 }
33
- // do! Task.Delay 10 // only in 0.3
34
- // let! x = task { return 1 } :> Task // only in 0.3
35
- // yield 1
36
- // let! vt = ValueTask<int> ( task { return 2 } )
37
- // yield vt
38
- // let! vt = ValueTask ( task { return 2 } ) // only in 0.3
39
- // do! ValueTask ( task { return 2 } ) // only in 0.3
40
- // yield 3
41
- // yield 10
42
- // }
43
- // |> TaskSeq.toArray
44
- // |> fun x -> Assert.Equal<int array>(x, [| 1; 2; 3; 10 |])
49
+ [<Fact>]
50
+ let ``Use taskSeq from nuget with multiple keywords v0.3.0`` () =
51
+ taskSeq {
52
+ do ! task { do ! Task.Delay 10 }
53
+ do ! Task.Delay 10 // only in 0.3
54
+ let! x = task { return 1 } :> Task // only in 0.3
55
+ yield 1
56
+ let! vt = ValueTask< int>( task { return 2 })
57
+ yield vt
58
+ let! vt = ValueTask( task { return 2 }) // only in 0.3
59
+ do ! ValueTask( task { return 2 }) // only in 0.3
60
+ yield 3
61
+ yield 10
62
+ }
63
+ |> TaskSeq.toArray
64
+ |> fun x -> Assert.Equal< int array>( x, [| 1 ; 2 ; 3 ; 10 |])
65
+
66
+ [<Fact>]
67
+ let ``Use taskSeq when type implements IDisposable and IAsyncDisposable`` () =
68
+ let disposed = ref 0
69
+
70
+ let ts = taskSeq {
71
+ use! x = task { return new MultiDispose( disposed) } // Used to fail to compile (see #97, fixed in v0.3.0)
72
+ yield x.Get1()
73
+ }
74
+
75
+ ts
76
+ |> TaskSeq.length
77
+ |> Task.map ( should equal 1 )
78
+ |> Task.map ( fun _ -> disposed.Value |> should equal - 1 ) // must favor IAsyncDisposable, not IDisposable
79
+
80
+ [<Fact>]
81
+ let ``Use taskSeq as part of an F # task CE`` () = task {
82
+ let ts = taskSeq { yield ! [ 0 .. 99 ] }
83
+ let ra = ResizeArray()
84
+
85
+ // loop through a taskSeq, support added in v0.3.0
86
+ for v in ts do
87
+ ra.Add v
88
+
89
+ ra.ToArray() |> should equal [| 0 .. 99 |]
90
+ }
91
+
92
+ [<Fact>]
93
+ let ``New surface area functions availability tests v0.3.0`` () = task {
94
+ let ts = TaskSeq.singleton 10 // added in v0.3.0
95
+ let! ls = TaskSeq.toListAsync ts
96
+ List.exactlyOne ls |> should equal 10
97
+ }
0 commit comments