Skip to content

Commit 1bd4e71

Browse files
committed
Add more tests for corner cases of async-for and task-for
1 parent 2299022 commit 1bd4e71

File tree

2 files changed

+165
-10
lines changed

2 files changed

+165
-10
lines changed
Lines changed: 84 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module TaskSeq.Tests.Extensions
1+
module TaskSeq.Tests.AsyncExtensions
22

33
open System
44
open Xunit
@@ -7,14 +7,37 @@ open FsUnit.Xunit
77
open FSharp.Control
88

99
//
10-
// Task extensions
1110
// Async extensions
1211
//
1312

13+
module EmptySeq =
14+
[<Theory; ClassData(typeof<TestEmptyVariants>)>]
15+
let ``Async-for CE with empty taskSeq`` variant = async {
16+
let values = Gen.getEmptyVariant variant
1417

15-
module TaskCE =
18+
let mutable sum = 42
19+
20+
for x in values do
21+
sum <- sum + x
22+
23+
sum |> should equal 42
24+
}
25+
26+
[<Fact>]
27+
let ``Async-for CE must execute side effect in empty taskseq`` () = async {
28+
let mutable data = 0
29+
let values = taskSeq { do data <- 42 }
30+
31+
for x in values do
32+
()
33+
34+
data |> should equal 42
35+
}
36+
37+
38+
module Immutable =
1639
[<Theory; ClassData(typeof<TestImmTaskSeq>)>]
17-
let ``Task-for CE with taskSeq`` variant = task {
40+
let ``Async-for CE with taskSeq`` variant = async {
1841
let values = Gen.getSeqImmutable variant
1942

2043
let mutable sum = 0
@@ -25,15 +48,70 @@ module TaskCE =
2548
sum |> should equal 55
2649
}
2750

28-
module AsyncCE =
2951
[<Theory; ClassData(typeof<TestImmTaskSeq>)>]
30-
let ``Async-for CE with taskSeq`` variant = async {
52+
let ``Async-for CE with taskSeq multiple iterations`` variant = async {
3153
let values = Gen.getSeqImmutable variant
3254

3355
let mutable sum = 0
3456

57+
for x in values do
58+
sum <- sum + x
59+
60+
// each following iteration should start at the beginning
61+
for x in values do
62+
sum <- sum + x
63+
64+
for x in values do
65+
sum <- sum + x
66+
67+
sum |> should equal 165
68+
}
69+
70+
[<Fact>]
71+
let ``Async-for mixing both types of for loops`` () = async {
72+
// this test ensures overload resolution is correct
73+
let ts = TaskSeq.singleton 20
74+
let sq = Seq.singleton 20
75+
let mutable sum = 2
76+
77+
for x in ts do
78+
sum <- sum + x
79+
80+
for x in sq do
81+
sum <- sum + x
82+
83+
sum |> should equal 42
84+
}
85+
86+
module SideEffects =
87+
[<Theory; ClassData(typeof<TestSideEffectTaskSeq>)>]
88+
let ``Async-for CE with taskSeq`` variant = async {
89+
let values = Gen.getSeqWithSideEffect variant
90+
91+
let mutable sum = 0
92+
3593
for x in values do
3694
sum <- sum + x
3795

3896
sum |> should equal 55
3997
}
98+
99+
[<Theory; ClassData(typeof<TestSideEffectTaskSeq>)>]
100+
let ``Async-for CE with taskSeq multiple iterations`` variant = async {
101+
let values = Gen.getSeqWithSideEffect variant
102+
103+
let mutable sum = 0
104+
105+
for x in values do
106+
sum <- sum + x
107+
108+
// each following iteration should start at the beginning
109+
// with the "side effect" tests, the mutable state updates
110+
for x in values do
111+
sum <- sum + x // starts at 11
112+
113+
for x in values do
114+
sum <- sum + x // starts at 21
115+
116+
sum |> should equal 465 // eq to: List.sum [1..30]
117+
}

src/FSharp.Control.TaskSeq.Test/TaskSeq.TaskExtensions.Tests.fs

Lines changed: 81 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,33 @@ open FSharp.Control
88

99
//
1010
// Task extensions
11-
// Async extensions
1211
//
1312

13+
module EmptySeq =
14+
[<Theory; ClassData(typeof<TestEmptyVariants>)>]
15+
let ``Task-for CE with empty taskSeq`` variant = task {
16+
let values = Gen.getEmptyVariant variant
1417

15-
module TaskCE =
18+
let mutable sum = 42
19+
20+
for x in values do
21+
sum <- sum + x
22+
23+
sum |> should equal 42
24+
}
25+
26+
[<Fact>]
27+
let ``Task-for CE must execute side effect in empty taskseq`` () = task {
28+
let mutable data = 0
29+
let values = taskSeq { do data <- 42 }
30+
31+
for x in values do
32+
()
33+
34+
data |> should equal 42
35+
}
36+
37+
module Immutable =
1638
[<Theory; ClassData(typeof<TestImmTaskSeq>)>]
1739
let ``Task-for CE with taskSeq`` variant = task {
1840
let values = Gen.getSeqImmutable variant
@@ -25,15 +47,70 @@ module TaskCE =
2547
sum |> should equal 55
2648
}
2749

28-
module AsyncCE =
2950
[<Theory; ClassData(typeof<TestImmTaskSeq>)>]
30-
let ``Async-for CE with taskSeq`` variant = async {
51+
let ``Task-for CE with taskSeq multiple iterations`` variant = task {
3152
let values = Gen.getSeqImmutable variant
3253

3354
let mutable sum = 0
3455

56+
for x in values do
57+
sum <- sum + x
58+
59+
// each following iteration should start at the beginning
60+
for x in values do
61+
sum <- sum + x
62+
63+
for x in values do
64+
sum <- sum + x
65+
66+
sum |> should equal 165
67+
}
68+
69+
[<Fact>]
70+
let ``Task-for mixing both types of for loops`` () = async {
71+
// this test ensures overload resolution is correct
72+
let ts = TaskSeq.singleton 20
73+
let sq = Seq.singleton 20
74+
let mutable sum = 2
75+
76+
for x in ts do
77+
sum <- sum + x
78+
79+
for x in sq do
80+
sum <- sum + x
81+
82+
sum |> should equal 42
83+
}
84+
85+
module SideEffects =
86+
[<Theory; ClassData(typeof<TestSideEffectTaskSeq>)>]
87+
let ``Task-for CE with taskSeq`` variant = task {
88+
let values = Gen.getSeqWithSideEffect variant
89+
90+
let mutable sum = 0
91+
3592
for x in values do
3693
sum <- sum + x
3794

3895
sum |> should equal 55
3996
}
97+
98+
[<Theory; ClassData(typeof<TestSideEffectTaskSeq>)>]
99+
let ``Task-for CE with taskSeq multiple iterations`` variant = task {
100+
let values = Gen.getSeqWithSideEffect variant
101+
102+
let mutable sum = 0
103+
104+
for x in values do
105+
sum <- sum + x
106+
107+
// each following iteration should start at the beginning
108+
// with the "side effect" tests, the mutable state updates
109+
for x in values do
110+
sum <- sum + x // starts at 11
111+
112+
for x in values do
113+
sum <- sum + x // starts at 21
114+
115+
sum |> should equal 465 // eq to: List.sum [1..30]
116+
}

0 commit comments

Comments
 (0)