Skip to content

Commit f8789d1

Browse files
authored
Merge pull request #291 from fsprojects/repo-assist/test-nested-loops-2026-03-58bd8dead007436c
[Repo Assist] test: add nested for-loop tests for task and async CE extensions
2 parents 12657a9 + 36c6094 commit f8789d1

File tree

2 files changed

+180
-0
lines changed

2 files changed

+180
-0
lines changed

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

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
}

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

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
}

0 commit comments

Comments
 (0)