@@ -259,6 +259,53 @@ let ``AsyncSeq.maxByAsync uses async projection``() =
259259 let actual = AsyncSeq.ofSeq ls |> AsyncSeq.maxByAsync ( fun x -> async.Return x) |> Async.RunSynchronously
260260 Assert.AreEqual( 9 , actual)
261261
262+ [<Test>]
263+ let ``AsyncSeq.sumBy works`` () =
264+ for i in 0 .. 10 do
265+ let ls = [ 1 .. i ]
266+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.sumBy float |> Async.RunSynchronously
267+ let expected = ls |> List.sumBy float
268+ Assert.AreEqual( expected, actual)
269+
270+ [<Test>]
271+ let ``AsyncSeq.sumByAsync works`` () =
272+ for i in 0 .. 10 do
273+ let ls = [ 1 .. i ]
274+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.sumByAsync ( float >> async.Return) |> Async.RunSynchronously
275+ let expected = ls |> List.sumBy float
276+ Assert.AreEqual( expected, actual)
277+
278+ [<Test>]
279+ let ``AsyncSeq.average works`` () =
280+ for i in 1 .. 10 do
281+ let ls = [ 1.0 .. float i ]
282+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.average |> Async.RunSynchronously
283+ let expected = ls |> List.average
284+ Assert.AreEqual( expected, actual)
285+
286+ [<Test>]
287+ let ``AsyncSeq.average raises on empty sequence`` () =
288+ Assert.Throws< System.ArgumentException>( fun () ->
289+ AsyncSeq.empty< float> |> AsyncSeq.average |> Async.RunSynchronously |> ignore
290+ ) |> ignore
291+
292+ [<Test>]
293+ let ``AsyncSeq.averageBy works`` () =
294+ for i in 1 .. 10 do
295+ let ls = [ 1 .. i ]
296+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.averageBy float |> Async.RunSynchronously
297+ let expected = ls |> List.averageBy float
298+ Assert.AreEqual( expected, actual)
299+
300+ [<Test>]
301+ let ``AsyncSeq.averageByAsync works`` () =
302+ for i in 1 .. 10 do
303+ let ls = [ 1 .. i ]
304+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.averageByAsync ( float >> async.Return) |> Async.RunSynchronously
305+ let expected = ls |> List.averageBy float
306+ Assert.AreEqual( expected, actual)
307+
308+
262309[<Test>]
263310let ``AsyncSeq.length works`` () =
264311 for i in 0 .. 10 do
@@ -2376,6 +2423,45 @@ let ``AsyncSeq.fold with empty sequence should return seed``() =
23762423 |> Async.RunSynchronously
23772424 Assert.AreEqual( 10 , result)
23782425
2426+ [<Test>]
2427+ let ``AsyncSeq.reduce sums non - empty sequence`` () =
2428+ let result = asyncSeq { yield 1 ; yield 2 ; yield 3 ; yield 4 ; yield 5 }
2429+ |> AsyncSeq.reduce (+)
2430+ |> Async.RunSynchronously
2431+ Assert.AreEqual( 15 , result)
2432+
2433+ [<Test>]
2434+ let ``AsyncSeq.reduce single element returns that element`` () =
2435+ let result = asyncSeq { yield 42 }
2436+ |> AsyncSeq.reduce (+)
2437+ |> Async.RunSynchronously
2438+ Assert.AreEqual( 42 , result)
2439+
2440+ [<Test>]
2441+ let ``AsyncSeq.reduce empty sequence raises InvalidOperationException`` () =
2442+ Assert.Throws< InvalidOperationException>( fun () ->
2443+ AsyncSeq.empty< int>
2444+ |> AsyncSeq.reduce (+)
2445+ |> Async.RunSynchronously
2446+ |> ignore) |> ignore
2447+
2448+ [<Test>]
2449+ let ``AsyncSeq.reduceAsync accumulates with async function`` () =
2450+ async {
2451+ let result =
2452+ asyncSeq { yield 10 ; yield 3 ; yield 2 }
2453+ |> AsyncSeq.reduceAsync ( fun a b -> async { return a - b })
2454+ |> Async.RunSynchronously
2455+ Assert.AreEqual( 5 , result)
2456+ } |> Async.RunSynchronously
2457+
2458+ [<Test>]
2459+ let ``AsyncSeq.reduce matches Seq.reduce`` () =
2460+ for ls in [ [ 1 ]; [ 1 ; 2 ]; [ 3 ; 1 ; 4 ; 1 ; 5 ; 9 ; 2 ; 6 ] ] do
2461+ let expected = Seq.reduce (+) ls
2462+ let actual = AsyncSeq.ofSeq ls |> AsyncSeq.reduce (+) |> Async.RunSynchronously
2463+ Assert.AreEqual( expected, actual)
2464+
23792465[<Test>]
23802466let ``AsyncSeq.ofSeq should work with large sequence`` () =
23812467 let largeSeq = seq { 1 .. 100 }
@@ -2600,6 +2686,46 @@ let ``AsyncSeq.pairwise with three elements should produce two pairs`` () =
26002686 let result = AsyncSeq.pairwise source |> AsyncSeq.toListSynchronously
26012687 Assert.AreEqual([( 1 , 2 ); ( 2 , 3 )], result)
26022688
2689+ [<Test>]
2690+ let ``AsyncSeq.windowed empty sequence returns empty`` () =
2691+ let result = AsyncSeq.windowed 3 AsyncSeq.empty< int> |> AsyncSeq.toListSynchronously
2692+ Assert.AreEqual([], result)
2693+
2694+ [<Test>]
2695+ let ``AsyncSeq.windowed fewer elements than window returns empty`` () =
2696+ let source = asyncSeq { yield 1 ; yield 2 }
2697+ let result = AsyncSeq.windowed 3 source |> AsyncSeq.toListSynchronously
2698+ Assert.AreEqual([], result)
2699+
2700+ [<Test>]
2701+ let ``AsyncSeq.windowed exact window size returns single window`` () =
2702+ let source = asyncSeq { yield 1 ; yield 2 ; yield 3 }
2703+ let result = AsyncSeq.windowed 3 source |> AsyncSeq.toListSynchronously
2704+ Assert.AreEqual([[| 1 ; 2 ; 3 |]], result)
2705+
2706+ [<Test>]
2707+ let ``AsyncSeq.windowed sliding window produces correct windows`` () =
2708+ let source = asyncSeq { yield 1 ; yield 2 ; yield 3 ; yield 4 ; yield 5 }
2709+ let result = AsyncSeq.windowed 3 source |> AsyncSeq.toListSynchronously
2710+ Assert.AreEqual([[| 1 ; 2 ; 3 |]; [| 2 ; 3 ; 4 |]; [| 3 ; 4 ; 5 |]], result)
2711+
2712+ [<Test>]
2713+ let ``AsyncSeq.windowed size 1 returns each element as singleton array`` () =
2714+ let source = asyncSeq { yield 10 ; yield 20 ; yield 30 }
2715+ let result = AsyncSeq.windowed 1 source |> AsyncSeq.toListSynchronously
2716+ Assert.AreEqual([[| 10 |]; [| 20 |]; [| 30 |]], result)
2717+
2718+ [<Test>]
2719+ let ``AsyncSeq.windowed size 2 is equivalent to pairwise as arrays`` () =
2720+ let source = asyncSeq { yield 1 ; yield 2 ; yield 3 ; yield 4 }
2721+ let result = AsyncSeq.windowed 2 source |> AsyncSeq.toListSynchronously
2722+ Assert.AreEqual([[| 1 ; 2 |]; [| 2 ; 3 |]; [| 3 ; 4 |]], result)
2723+
2724+ [<Test>]
2725+ let ``AsyncSeq.windowed with size 0 raises ArgumentException`` () =
2726+ Assert.Throws< System.ArgumentException>( fun () ->
2727+ AsyncSeq.windowed 0 ( asyncSeq { yield 1 }) |> AsyncSeq.toListSynchronously |> ignore) |> ignore
2728+
26032729[<Test>]
26042730let ``AsyncSeq.distinctUntilChangedWith should work with custom equality`` () =
26052731 let source = asyncSeq { yield " a" ; yield " A" ; yield " B" ; yield " b" ; yield " c" }
0 commit comments