@@ -211,6 +211,52 @@ let ``AsyncSeq.sum works``() =
211211 let expected = ls |> List.sum
212212 Assert.True(( expected = actual))
213213
214+ [<Test>]
215+ let ``AsyncSeq.sumBy works`` () =
216+ for i in 0 .. 10 do
217+ let ls = [ 1 .. i ]
218+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.sumBy float |> Async.RunSynchronously
219+ let expected = ls |> List.sumBy float
220+ Assert.AreEqual( expected, actual)
221+
222+ [<Test>]
223+ let ``AsyncSeq.sumByAsync works`` () =
224+ for i in 0 .. 10 do
225+ let ls = [ 1 .. i ]
226+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.sumByAsync ( float >> async.Return) |> Async.RunSynchronously
227+ let expected = ls |> List.sumBy float
228+ Assert.AreEqual( expected, actual)
229+
230+ [<Test>]
231+ let ``AsyncSeq.average works`` () =
232+ for i in 1 .. 10 do
233+ let ls = [ 1.0 .. float i ]
234+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.average |> Async.RunSynchronously
235+ let expected = ls |> List.average
236+ Assert.AreEqual( expected, actual)
237+
238+ [<Test>]
239+ let ``AsyncSeq.average raises on empty sequence`` () =
240+ Assert.Throws< System.ArgumentException>( fun () ->
241+ AsyncSeq.empty< float> |> AsyncSeq.average |> Async.RunSynchronously |> ignore
242+ ) |> ignore
243+
244+ [<Test>]
245+ let ``AsyncSeq.averageBy works`` () =
246+ for i in 1 .. 10 do
247+ let ls = [ 1 .. i ]
248+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.averageBy float |> Async.RunSynchronously
249+ let expected = ls |> List.averageBy float
250+ Assert.AreEqual( expected, actual)
251+
252+ [<Test>]
253+ let ``AsyncSeq.averageByAsync works`` () =
254+ for i in 1 .. 10 do
255+ let ls = [ 1 .. i ]
256+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.averageByAsync ( float >> async.Return) |> Async.RunSynchronously
257+ let expected = ls |> List.averageBy float
258+ Assert.AreEqual( expected, actual)
259+
214260
215261[<Test>]
216262let ``AsyncSeq.length works`` () =
@@ -2329,6 +2375,45 @@ let ``AsyncSeq.fold with empty sequence should return seed``() =
23292375 |> Async.RunSynchronously
23302376 Assert.AreEqual( 10 , result)
23312377
2378+ [<Test>]
2379+ let ``AsyncSeq.reduce sums non - empty sequence`` () =
2380+ let result = asyncSeq { yield 1 ; yield 2 ; yield 3 ; yield 4 ; yield 5 }
2381+ |> AsyncSeq.reduce (+)
2382+ |> Async.RunSynchronously
2383+ Assert.AreEqual( 15 , result)
2384+
2385+ [<Test>]
2386+ let ``AsyncSeq.reduce single element returns that element`` () =
2387+ let result = asyncSeq { yield 42 }
2388+ |> AsyncSeq.reduce (+)
2389+ |> Async.RunSynchronously
2390+ Assert.AreEqual( 42 , result)
2391+
2392+ [<Test>]
2393+ let ``AsyncSeq.reduce empty sequence raises InvalidOperationException`` () =
2394+ Assert.Throws< InvalidOperationException>( fun () ->
2395+ AsyncSeq.empty< int>
2396+ |> AsyncSeq.reduce (+)
2397+ |> Async.RunSynchronously
2398+ |> ignore) |> ignore
2399+
2400+ [<Test>]
2401+ let ``AsyncSeq.reduceAsync accumulates with async function`` () =
2402+ async {
2403+ let result =
2404+ asyncSeq { yield 10 ; yield 3 ; yield 2 }
2405+ |> AsyncSeq.reduceAsync ( fun a b -> async { return a - b })
2406+ |> Async.RunSynchronously
2407+ Assert.AreEqual( 5 , result)
2408+ } |> Async.RunSynchronously
2409+
2410+ [<Test>]
2411+ let ``AsyncSeq.reduce matches Seq.reduce`` () =
2412+ for ls in [ [ 1 ]; [ 1 ; 2 ]; [ 3 ; 1 ; 4 ; 1 ; 5 ; 9 ; 2 ; 6 ] ] do
2413+ let expected = Seq.reduce (+) ls
2414+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.reduce (+) |> Async.RunSynchronously
2415+ Assert.AreEqual( expected, actual)
2416+
23322417[<Test>]
23332418let ``AsyncSeq.ofSeq should work with large sequence`` () =
23342419 let largeSeq = seq { 1 .. 100 }
@@ -2553,6 +2638,46 @@ let ``AsyncSeq.pairwise with three elements should produce two pairs`` () =
25532638 let result = AsyncSeq.pairwise source |> AsyncSeq.toListSynchronously
25542639 Assert.AreEqual([( 1 , 2 ); ( 2 , 3 )], result)
25552640
2641+ [<Test>]
2642+ let ``AsyncSeq.windowed empty sequence returns empty`` () =
2643+ let result = AsyncSeq.windowed 3 AsyncSeq.empty< int> |> AsyncSeq.toListSynchronously
2644+ Assert.AreEqual([], result)
2645+
2646+ [<Test>]
2647+ let ``AsyncSeq.windowed fewer elements than window returns empty`` () =
2648+ let source = asyncSeq { yield 1 ; yield 2 }
2649+ let result = AsyncSeq.windowed 3 source |> AsyncSeq.toListSynchronously
2650+ Assert.AreEqual([], result)
2651+
2652+ [<Test>]
2653+ let ``AsyncSeq.windowed exact window size returns single window`` () =
2654+ let source = asyncSeq { yield 1 ; yield 2 ; yield 3 }
2655+ let result = AsyncSeq.windowed 3 source |> AsyncSeq.toListSynchronously
2656+ Assert.AreEqual([[| 1 ; 2 ; 3 |]], result)
2657+
2658+ [<Test>]
2659+ let ``AsyncSeq.windowed sliding window produces correct windows`` () =
2660+ let source = asyncSeq { yield 1 ; yield 2 ; yield 3 ; yield 4 ; yield 5 }
2661+ let result = AsyncSeq.windowed 3 source |> AsyncSeq.toListSynchronously
2662+ Assert.AreEqual([[| 1 ; 2 ; 3 |]; [| 2 ; 3 ; 4 |]; [| 3 ; 4 ; 5 |]], result)
2663+
2664+ [<Test>]
2665+ let ``AsyncSeq.windowed size 1 returns each element as singleton array`` () =
2666+ let source = asyncSeq { yield 10 ; yield 20 ; yield 30 }
2667+ let result = AsyncSeq.windowed 1 source |> AsyncSeq.toListSynchronously
2668+ Assert.AreEqual([[| 10 |]; [| 20 |]; [| 30 |]], result)
2669+
2670+ [<Test>]
2671+ let ``AsyncSeq.windowed size 2 is equivalent to pairwise as arrays`` () =
2672+ let source = asyncSeq { yield 1 ; yield 2 ; yield 3 ; yield 4 }
2673+ let result = AsyncSeq.windowed 2 source |> AsyncSeq.toListSynchronously
2674+ Assert.AreEqual([[| 1 ; 2 |]; [| 2 ; 3 |]; [| 3 ; 4 |]], result)
2675+
2676+ [<Test>]
2677+ let ``AsyncSeq.windowed with size 0 raises ArgumentException`` () =
2678+ Assert.Throws< System.ArgumentException>( fun () ->
2679+ AsyncSeq.windowed 0 ( asyncSeq { yield 1 }) |> AsyncSeq.toListSynchronously |> ignore) |> ignore
2680+
25562681[<Test>]
25572682let ``AsyncSeq.distinctUntilChangedWith should work with custom equality`` () =
25582683 let source = asyncSeq { yield " a" ; yield " A" ; yield " B" ; yield " b" ; yield " c" }
0 commit comments