Skip to content

Commit 9d27cca

Browse files
authored
Merge pull request #192 from fsprojects/feature/advanced-coverage-improvements-fold-utils
Daily Test Coverage Improver: Add 4 AsyncSeqOp FoldAsync tests achieving 100% module coverage
2 parents 9c20d3f + 7a4b66e commit 9d27cca

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

tests/FSharp.Control.AsyncSeq.Tests/AsyncSeqTests.fs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2372,4 +2372,78 @@ let ``AsyncSeq.chooseAsync with async transformation should work`` () =
23722372
Assert.AreEqual([6; 12], result)
23732373
} |> Async.RunSynchronously
23742374

2375+
// Advanced Coverage Improvement Tests - targeting specific uncovered functionality
2376+
2377+
[<Test>]
2378+
let ``AsyncSeqOp.FoldAsync with unfoldAsync should work`` () =
2379+
async {
2380+
// Create an AsyncSeq using unfoldAsync to trigger UnfoldAsyncEnumerator.FoldAsync path
2381+
let generator state = async {
2382+
if state < 5 then
2383+
return Some (state * 2, state + 1)
2384+
else
2385+
return None
2386+
}
2387+
let source = AsyncSeq.unfoldAsync generator 0
2388+
2389+
// This should hit the uncovered FoldAsync method in UnfoldAsyncEnumerator
2390+
let folder acc x = async { return acc + x }
2391+
let! result = AsyncSeq.foldAsync folder 0 source
2392+
2393+
// Expected: sum of [0, 2, 4, 6, 8] = 20
2394+
Assert.AreEqual(20, result)
2395+
} |> Async.RunSynchronously
2396+
2397+
[<Test>]
2398+
let ``AsyncSeqOp.FoldAsync with empty sequence should return init`` () =
2399+
async {
2400+
let generator _ = async { return None }
2401+
let source = AsyncSeq.unfoldAsync generator 0
2402+
let folder acc x = async { return acc + x }
2403+
let! result = AsyncSeq.foldAsync folder 42 source
2404+
Assert.AreEqual(42, result)
2405+
} |> Async.RunSynchronously
2406+
2407+
[<Test>]
2408+
let ``AsyncSeqOp.FoldAsync with exception in generator should propagate`` () =
2409+
async {
2410+
let generator state = async {
2411+
if state = 0 then
2412+
return Some (1, 1)
2413+
else
2414+
return failwith "generator error"
2415+
}
2416+
let source = AsyncSeq.unfoldAsync generator 0
2417+
2418+
try
2419+
let folder acc x = async { return acc + x }
2420+
let! _ = AsyncSeq.foldAsync folder 0 source
2421+
Assert.Fail("Expected exception to be thrown")
2422+
with
2423+
| ex when ex.Message = "generator error" ->
2424+
() // Expected
2425+
} |> Async.RunSynchronously
2426+
2427+
[<Test>]
2428+
let ``AsyncSeqOp.FoldAsync with exception in folder should propagate`` () =
2429+
async {
2430+
let generator state = async {
2431+
if state < 2 then
2432+
return Some (state, state + 1)
2433+
else
2434+
return None
2435+
}
2436+
let source = AsyncSeq.unfoldAsync generator 0
2437+
2438+
try
2439+
let folder acc x = async {
2440+
if x = 1 then failwith "folder error"
2441+
return acc + x
2442+
}
2443+
let! _ = AsyncSeq.foldAsync folder 0 source
2444+
Assert.Fail("Expected exception to be thrown")
2445+
with
2446+
| ex when ex.Message = "folder error" ->
2447+
() // Expected
2448+
} |> Async.RunSynchronously
23752449

0 commit comments

Comments
 (0)