@@ -175,7 +175,7 @@ module Immutable =
175175 }
176176
177177 [<Fact>]
178- let ``TaskSeq - sumBy works with float projection`` () = task {
178+ let ``TaskSeq - sum works with float projection`` () = task {
179179 let! result = TaskSeq.ofSeq [ 1 ; 2 ; 3 ; 4 ; 5 ] |> TaskSeq.sumBy float
180180
181181 result |> should ( equalWithin 0.001 ) 15.0
@@ -195,6 +195,42 @@ module Immutable =
195195 result |> should ( equalWithin 0.001 f) 2.0 f
196196 }
197197
198+ [<Fact>]
199+ let ``TaskSeq - sum result matches Seq - sum`` () = task {
200+ let items = [ 3 ; 1 ; 4 ; 1 ; 5 ; 9 ; 2 ; 6 ; 5 ; 3 ]
201+ let expected = Seq.sum items
202+
203+ let! result = TaskSeq.ofList items |> TaskSeq.sum
204+ result |> should equal expected
205+ }
206+
207+ [<Fact>]
208+ let ``TaskSeq - average result matches Seq - average`` () = task {
209+ let items = [ 3.0 ; 1.0 ; 4.0 ; 1.0 ; 5.0 ; 9.0 ; 2.0 ; 6.0 ; 5.0 ; 3.0 ]
210+ let expected = Seq.average items
211+
212+ let! result = TaskSeq.ofList items |> TaskSeq.average
213+ result |> should ( equalWithin 0.0001 ) expected
214+ }
215+
216+ [<Fact>]
217+ let ``TaskSeq - sumBy result matches Seq - sumBy`` () = task {
218+ let items = [ 1 ; 2 ; 3 ; 4 ; 5 ]
219+ let expected = Seq.sumBy ( fun x -> x * x) items
220+
221+ let! result = TaskSeq.ofList items |> TaskSeq.sumBy ( fun x -> x * x)
222+ result |> should equal expected
223+ }
224+
225+ [<Fact>]
226+ let ``TaskSeq - averageBy result matches Seq - averageBy`` () = task {
227+ let items = [ 1 ; 2 ; 3 ; 4 ; 5 ]
228+ let expected = Seq.averageBy float items
229+
230+ let! result = TaskSeq.ofList items |> TaskSeq.averageBy float
231+ result |> should ( equalWithin 0.0001 ) expected
232+ }
233+
198234module SideEffects =
199235 [<Theory; ClassData( typeof< TestSideEffectTaskSeq>) >]
200236 let ``TaskSeq - sum iterates exactly once`` variant = task {
@@ -210,9 +246,52 @@ module SideEffects =
210246 result |> should equal 55
211247 }
212248
249+ [<Theory; ClassData( typeof< TestSideEffectTaskSeq>) >]
250+ let ``TaskSeq - sumByAsync iterates exactly once`` variant = task {
251+ let ts = Gen.getSeqWithSideEffect variant
252+ let! result = ts |> TaskSeq.sumByAsync Task.fromResult
253+ result |> should equal 55
254+ }
255+
256+ [<Theory; ClassData( typeof< TestSideEffectTaskSeq>) >]
257+ let ``TaskSeq - average iterates exactly once`` variant = task {
258+ let ts = Gen.getSeqWithSideEffect variant
259+ let! result = ts |> TaskSeq.map float |> TaskSeq.average
260+ result |> should ( equalWithin 0.001 ) 5.5
261+ }
262+
213263 [<Theory; ClassData( typeof< TestSideEffectTaskSeq>) >]
214264 let ``TaskSeq - averageBy iterates exactly once`` variant = task {
215265 let ts = Gen.getSeqWithSideEffect variant
216266 let! result = ts |> TaskSeq.averageBy float
217267 result |> should ( equalWithin 0.001 ) 5.5
218268 }
269+
270+ [<Theory; ClassData( typeof< TestSideEffectTaskSeq>) >]
271+ let ``TaskSeq - averageByAsync iterates exactly once`` variant = task {
272+ let ts = Gen.getSeqWithSideEffect variant
273+ let! result = ts |> TaskSeq.averageByAsync ( float >> Task.fromResult)
274+ result |> should ( equalWithin 0.001 ) 5.5
275+ }
276+
277+ [<Theory; ClassData( typeof< TestSideEffectTaskSeq>) >]
278+ let ``TaskSeq - sum second iteration sees side - effect values`` variant = task {
279+ let ts = Gen.getSeqWithSideEffect variant
280+ let! first = ts |> TaskSeq.sum
281+ first |> should equal 55 // 1+2+...+10
282+
283+ // side-effect sequences yield next 10 items (11..20) on second consumption
284+ let! second = ts |> TaskSeq.sum
285+ second |> should equal 155 // 11+12+...+20
286+ }
287+
288+ [<Theory; ClassData( typeof< TestSideEffectTaskSeq>) >]
289+ let ``TaskSeq - averageBy second iteration sees side - effect values`` variant = task {
290+ let ts = Gen.getSeqWithSideEffect variant
291+ let! first = ts |> TaskSeq.averageBy float
292+ first |> should ( equalWithin 0.001 ) 5.5 // avg(1..10) = 5.5
293+
294+ // side-effect sequences yield next 10 items (11..20) on second consumption
295+ let! second = ts |> TaskSeq.averageBy float
296+ second |> should ( equalWithin 0.001 ) 15.5 // avg(11..20) = 15.5
297+ }
0 commit comments