-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathTaskSeq.Fold.Tests.fs
95 lines (70 loc) · 2.92 KB
/
TaskSeq.Fold.Tests.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
module TaskSeq.Tests.Fold
open System.Text
open Xunit
open FsUnit.Xunit
open FSharp.Control
//
// TaskSeq.fold
// TaskSeq.foldAsync
//
module EmptySeq =
[<Fact>]
let ``Null source is invalid`` () =
assertNullArg
<| fun () -> TaskSeq.fold (fun _ _ -> 42) 0 null
assertNullArg
<| fun () -> TaskSeq.foldAsync (fun _ _ -> Task.fromResult 42) 0 null
[<Theory; ClassData(typeof<TestEmptyVariants>)>]
let ``TaskSeq-fold takes state when empty`` variant = task {
let! empty =
Gen.getEmptyVariant variant
|> TaskSeq.fold (fun _ item -> char (item + 64)) '_'
empty |> should equal '_'
}
[<Theory; ClassData(typeof<TestEmptyVariants>)>]
let ``TaskSeq-foldAsync takes state when empty`` variant = task {
let! alphabet =
Gen.getEmptyVariant variant
|> TaskSeq.foldAsync (fun _ item -> task { return char (item + 64) }) '_'
alphabet |> should equal '_'
}
module Immutable =
[<Theory; ClassData(typeof<TestImmTaskSeq>)>]
let ``TaskSeq-fold folds with every item`` variant = task {
let! letters =
(StringBuilder(), Gen.getSeqImmutable variant)
||> TaskSeq.fold (fun state item -> state.Append(char item + '@'))
letters.ToString() |> should equal "ABCDEFGHIJ"
}
[<Theory; ClassData(typeof<TestImmTaskSeq>)>]
let ``TaskSeq-foldAsync folds with every item`` variant = task {
let! letters =
(StringBuilder(), Gen.getSeqImmutable variant)
||> TaskSeq.foldAsync (fun state item -> task { return state.Append(char item + '@') })
letters.ToString() |> should equal "ABCDEFGHIJ"
}
module SideEffects =
[<Theory; ClassData(typeof<TestSideEffectTaskSeq>)>]
let ``TaskSeq-fold folds with every item, next fold has different state`` variant = task {
let ts = Gen.getSeqWithSideEffect variant
let! letters =
(StringBuilder(), ts)
||> TaskSeq.fold (fun state item -> state.Append(char item + '@'))
string letters |> should equal "ABCDEFGHIJ"
let! moreLetters =
(letters, ts)
||> TaskSeq.fold (fun state item -> state.Append(char item + '@'))
string moreLetters |> should equal "ABCDEFGHIJKLMNOPQRST"
}
[<Theory; ClassData(typeof<TestSideEffectTaskSeq>)>]
let ``TaskSeq-foldAsync folds with every item, next fold has different state`` variant = task {
let ts = Gen.getSeqWithSideEffect variant
let! letters =
(StringBuilder(), ts)
||> TaskSeq.foldAsync (fun state item -> task { return state.Append(char item + '@') })
string letters |> should equal "ABCDEFGHIJ"
let! moreLetters =
(letters, ts)
||> TaskSeq.foldAsync (fun state item -> task { return state.Append(char item + '@') })
string moreLetters |> should equal "ABCDEFGHIJKLMNOPQRST"
}