Skip to content

Commit 339d0ee

Browse files
peterfaria-lulaabelbraaksma
authored andcommitted
Added test cases to showcase bug.
When a type implements both IDisposable and IAsyncDisposable, F# cannot determine which overload of TaskSeqBuilder.Using to use.
1 parent 201f5c4 commit 339d0ee

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

src/FSharp.Control.TaskSeq.Test/FSharp.Control.TaskSeq.Test.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
<Compile Include="TaskSeq.Realworld.fs" />
5151
<Compile Include="TaskSeq.AsyncExtensions.Tests.fs" />
5252
<Compile Include="TaskSeq.TaskExtensions.Tests.fs" />
53+
<Compile Include="TaskSeq.Using.Tests.fs" />
5354
<Compile Include="Program.fs" />
5455
</ItemGroup>
5556

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
module FSharp.Control.TaskSeq.Test
2+
3+
open System
4+
open System.Threading.Tasks
5+
open FSharp.Control
6+
open FsUnit
7+
open Xunit
8+
9+
10+
type private OneGetter() =
11+
member _.Get1() = 1
12+
13+
type private Disposable() =
14+
inherit OneGetter()
15+
16+
interface IDisposable with
17+
member _.Dispose() = ()
18+
19+
type private AsyncDisposable() =
20+
inherit OneGetter()
21+
22+
interface IAsyncDisposable with
23+
member _.DisposeAsync() = ValueTask()
24+
25+
type private MultiDispose() =
26+
inherit OneGetter()
27+
28+
interface IDisposable with
29+
member _.Dispose() =
30+
()
31+
32+
interface IAsyncDisposable with
33+
member _.DisposeAsync() =
34+
ValueTask()
35+
36+
let private check ts = task {
37+
let! length = ts |> TaskSeq.length
38+
length |> should equal 1
39+
}
40+
41+
[<Fact>]
42+
let ``CE task: Using when type implements IDisposable``() =
43+
let ts = taskSeq {
44+
use x = new Disposable()
45+
46+
yield x.Get1()
47+
}
48+
49+
check ts
50+
51+
[<Fact>]
52+
let ``CE task: Using when type implements IAsyncDisposable``() =
53+
let ts = taskSeq {
54+
use x = AsyncDisposable()
55+
yield x.Get1()
56+
}
57+
58+
check ts
59+
60+
61+
[<Fact>]
62+
let ``CE task: Using when type implements IDisposable and IAsyncDisposable``() =
63+
let ts = taskSeq {
64+
use x = new MultiDispose()
65+
yield x.Get1()
66+
}
67+
68+
check ts
69+
70+
[<Fact>]
71+
let ``CE task: Using! when type implements IDisposable``() =
72+
let ts = taskSeq {
73+
use! x = task { return new Disposable() }
74+
yield x.Get1()
75+
}
76+
77+
check ts
78+
79+
80+
[<Fact>]
81+
let ``CE task: Using! when type implements IAsyncDisposable``() =
82+
let ts = taskSeq {
83+
use! x = task { return AsyncDisposable() }
84+
yield x.Get1()
85+
}
86+
87+
check ts
88+
89+
90+
[<Fact>]
91+
let ``CE task: Using! when type implements IDisposable and IAsyncDisposable``() =
92+
let ts = taskSeq {
93+
use! x = task { return new MultiDispose() }
94+
yield x.Get1()
95+
}
96+
97+
check ts

0 commit comments

Comments
 (0)