File tree Expand file tree Collapse file tree 2 files changed +180
-0
lines changed
src/FSharp.Control.TaskSeq.Test Expand file tree Collapse file tree 2 files changed +180
-0
lines changed Original file line number Diff line number Diff line change @@ -141,3 +141,84 @@ module Other =
141141 disposed.Value |> should equal 1
142142 sum |> should equal 42
143143 }
144+
145+ // Tests for nested for loops in the async CE with IAsyncEnumerable as the outer sequence.
146+ // Related to: https://github.com/fsprojects/FSharp.Control.TaskSeq/issues/269
147+ module NestedLoops =
148+ [<Fact>]
149+ let ``Async - for CE with nested regular list inside taskSeq loop`` () = async {
150+ // outer: IAsyncEnumerable<int list>, inner: regular list
151+ let outer = taskSeq {
152+ yield [ 1 ; 2 ; 3 ]
153+ yield [ 4 ; 5 ]
154+ yield [ 6 ; 7 ; 8 ; 9 ; 10 ]
155+ }
156+
157+ let mutable sum = 0
158+
159+ for inner in outer do
160+ for x in inner do
161+ sum <- sum + x
162+
163+ sum |> should equal 55
164+ }
165+
166+ [<Fact>]
167+ let ``Async - for CE with nested array inside taskSeq loop`` () = async {
168+ // outer: IAsyncEnumerable<int[]>, inner: regular array
169+ let outer = taskSeq {
170+ yield [| 1 ; 2 ; 3 |]
171+ yield [| 4 ; 5 |]
172+ }
173+
174+ let mutable sum = 0
175+
176+ for inner in outer do
177+ for x in inner do
178+ sum <- sum + x
179+
180+ sum |> should equal 15
181+ }
182+
183+ [<Fact>]
184+ let ``Async - for CE with nested tuple - destructuring array inside taskSeq loop`` () = async {
185+ // outer: IAsyncEnumerable<int[]>, inner: zipped array with tuple destructuring
186+ // this pattern reproduces the scenario from issue #269
187+ let outer = taskSeq { yield [| 1 ; 2 ; 3 |] }
188+ let mutable sum = 0
189+
190+ for arr in outer do
191+ for ( a, b) in Array.zip arr arr do
192+ sum <- sum + a + b
193+
194+ // (1+1) + (2+2) + (3+3) = 12
195+ sum |> should equal 12
196+ }
197+
198+ [<Fact>]
199+ let ``Async - for CE with nested taskSeq inside taskSeq loop`` () = async {
200+ // outer: IAsyncEnumerable<IAsyncEnumerable<int>>, inner: taskSeq
201+ let inner1 = taskSeq {
202+ yield 1
203+ yield 2
204+ yield 3
205+ }
206+
207+ let inner2 = taskSeq {
208+ yield 4
209+ yield 5
210+ }
211+
212+ let outer = taskSeq {
213+ yield inner1
214+ yield inner2
215+ }
216+
217+ let mutable sum = 0
218+
219+ for inner in outer do
220+ for x in inner do
221+ sum <- sum + x
222+
223+ sum |> should equal 15
224+ }
Original file line number Diff line number Diff line change @@ -140,3 +140,102 @@ module Other =
140140 disposed.Value |> should equal 1
141141 sum |> should equal 42
142142 }
143+
144+ // Tests for nested for loops in the task CE with IAsyncEnumerable as the outer sequence.
145+ // Related to: https://github.com/fsprojects/FSharp.Control.TaskSeq/issues/269
146+ module NestedLoops =
147+ [<Fact>]
148+ let ``Task - for CE with nested regular list inside taskSeq loop`` () = task {
149+ // outer: IAsyncEnumerable<int list>, inner: regular list
150+ let outer = taskSeq {
151+ yield [ 1 ; 2 ; 3 ]
152+ yield [ 4 ; 5 ]
153+ yield [ 6 ; 7 ; 8 ; 9 ; 10 ]
154+ }
155+
156+ let mutable sum = 0
157+
158+ for inner in outer do
159+ for x in inner do
160+ sum <- sum + x
161+
162+ sum |> should equal 55
163+ }
164+
165+ [<Fact>]
166+ let ``Task - for CE with nested array inside taskSeq loop`` () = task {
167+ // outer: IAsyncEnumerable<int[]>, inner: regular array
168+ let outer = taskSeq {
169+ yield [| 1 ; 2 ; 3 |]
170+ yield [| 4 ; 5 |]
171+ }
172+
173+ let mutable sum = 0
174+
175+ for inner in outer do
176+ for x in inner do
177+ sum <- sum + x
178+
179+ sum |> should equal 15
180+ }
181+
182+ [<Fact>]
183+ let ``Task - for CE with nested tuple - destructuring array inside taskSeq loop`` () = task {
184+ // outer: IAsyncEnumerable<int[]>, inner: zipped array with tuple destructuring
185+ // this pattern reproduces the scenario from issue #269
186+ let outer = taskSeq { yield [| 1 ; 2 ; 3 |] }
187+ let mutable sum = 0
188+
189+ for arr in outer do
190+ for ( a, b) in Array.zip arr arr do
191+ sum <- sum + a + b
192+
193+ // (1+1) + (2+2) + (3+3) = 12
194+ sum |> should equal 12
195+ }
196+
197+ [<Fact>]
198+ let ``Task - for CE with nested taskSeq inside taskSeq loop`` () = task {
199+ // outer: IAsyncEnumerable<IAsyncEnumerable<int>>, inner: taskSeq
200+ let inner1 = taskSeq {
201+ yield 1
202+ yield 2
203+ yield 3
204+ }
205+
206+ let inner2 = taskSeq {
207+ yield 4
208+ yield 5
209+ }
210+
211+ let outer = taskSeq {
212+ yield inner1
213+ yield inner2
214+ }
215+
216+ let mutable sum = 0
217+
218+ for inner in outer do
219+ for x in inner do
220+ sum <- sum + x
221+
222+ sum |> should equal 15
223+ }
224+
225+ [<Fact>]
226+ let ``Task - for CE with three levels of nesting`` () = task {
227+ // outer: IAsyncEnumerable<int[][]>, mid: array, inner: array
228+ let outer = taskSeq {
229+ yield [| [| 1 ; 2 |]; [| 3 ; 4 |] |]
230+ yield [| [| 5 |] |]
231+ }
232+
233+ let mutable sum = 0
234+
235+ for mid in outer do
236+ for inner in mid do
237+ for x in inner do
238+ sum <- sum + x
239+
240+ sum |> should equal 15
241+ }
You can’t perform that action at this time.
0 commit comments