Skip to content

Commit d5c5bbf

Browse files
committed
Add tests for TaskSeq.singleton
1 parent 8ede61b commit d5c5bbf

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-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
@@ -39,6 +39,7 @@
3939
<Compile Include="TaskSeq.Map.Tests.fs" />
4040
<Compile Include="TaskSeq.OfXXX.Tests.fs" />
4141
<Compile Include="TaskSeq.Pick.Tests.fs" />
42+
<Compile Include="TaskSeq.Singleton.Tests.fs" />
4243
<Compile Include="TaskSeq.Tail.Tests.fs" />
4344
<Compile Include="TaskSeq.ToXXX.Tests.fs" />
4445
<Compile Include="TaskSeq.Zip.Tests.fs" />
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
module TaskSeq.Tests.Singleton
2+
3+
open System.Threading.Tasks
4+
open Xunit
5+
open FsUnit.Xunit
6+
open FsToolkit.ErrorHandling
7+
8+
open FSharp.Control
9+
10+
module EmptySeq =
11+
12+
[<Theory; ClassData(typeof<TestEmptyVariants>)>]
13+
let ``TaskSeq-singleton with empty has length one`` variant =
14+
taskSeq {
15+
yield! TaskSeq.singleton 10
16+
yield! Gen.getEmptyVariant variant
17+
}
18+
|> TaskSeq.exactlyOne
19+
|> Task.map (should equal 10)
20+
21+
module Other =
22+
[<Fact>]
23+
let ``TaskSeq-singleton creates a sequence of one`` () =
24+
TaskSeq.singleton 42
25+
|> TaskSeq.exactlyOne
26+
|> Task.map (should equal 42)
27+
28+
[<Fact>]
29+
let ``TaskSeq-singleton can be yielded multiple times`` () =
30+
let singleton = TaskSeq.singleton 42
31+
32+
taskSeq {
33+
yield! singleton
34+
yield! singleton
35+
yield! singleton
36+
yield! singleton
37+
}
38+
|> TaskSeq.toList
39+
|> should equal [ 42; 42; 42; 42 ]
40+
41+
[<Fact>]
42+
let ``TaskSeq-singleton with isEmpty`` () =
43+
TaskSeq.singleton 42
44+
|> TaskSeq.isEmpty
45+
|> Task.map (should be False)
46+
47+
[<Fact>]
48+
let ``TaskSeq-singleton with append`` () =
49+
TaskSeq.singleton 42
50+
|> TaskSeq.append (TaskSeq.singleton 42)
51+
|> TaskSeq.toList
52+
|> should equal [ 42; 42 ]
53+
54+
[<Theory; ClassData(typeof<TestImmTaskSeq>)>]
55+
let ``TaskSeq-singleton with collect`` variant =
56+
Gen.getSeqImmutable variant
57+
|> TaskSeq.collect TaskSeq.singleton
58+
|> verify1To10
59+
60+
[<Fact>]
61+
let ``TaskSeq-singleton does not throw when getting Current before MoveNext`` () = task {
62+
let enumerator = (TaskSeq.singleton 42).GetAsyncEnumerator()
63+
let defaultValue = enumerator.Current // should return the default value for int
64+
defaultValue |> should equal 0
65+
}
66+
67+
[<Fact>]
68+
let ``TaskSeq-singleton does not throw when getting Current after last MoveNext`` () = task {
69+
let enumerator = (TaskSeq.singleton 42).GetAsyncEnumerator()
70+
let! isNext = enumerator.MoveNextAsync()
71+
isNext |> should be True
72+
let value = enumerator.Current // the first and only value
73+
value |> should equal 42
74+
75+
// move past the end
76+
let! isNext = enumerator.MoveNextAsync()
77+
isNext |> should be False
78+
let defaultValue = enumerator.Current // should return the default value for int
79+
defaultValue |> should equal 0
80+
}

src/FSharp.Control.TaskSeq.Test/TestUtils.fs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ module TestUtils =
141141
|> TaskSeq.toArrayAsync
142142
|> Task.map (Array.isEmpty >> should be True)
143143

144+
let verify1To10 ts =
145+
ts
146+
|> TaskSeq.toArrayAsync
147+
|> Task.map (should equal [| 1..10 |])
148+
144149
/// Delays (no spin-wait!) between 20 and 70ms, assuming a 15.6ms resolution clock
145150
let longDelay () = task { do! Task.Delay(Random().Next(20, 70)) }
146151

0 commit comments

Comments
 (0)