Skip to content

Commit 3ad4684

Browse files
authored
Merge pull request #320 from fsprojects/repo-assist/test-sumby-sideeffects-2026-03-4e02cd9337359e5a
[Repo Assist] test: add missing side-effect and Seq-equivalence tests for sum/average
2 parents 9e584cc + 89b279c commit 3ad4684

File tree

1 file changed

+80
-1
lines changed

1 file changed

+80
-1
lines changed

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

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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.001f) 2.0f
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+
198234
module 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

Comments
 (0)