Skip to content

Commit 3a0ee73

Browse files
committed
AsyncSeqSrc tests
1 parent 6dd2f4d commit 3a0ee73

2 files changed

Lines changed: 72 additions & 16 deletions

File tree

src/FSharp.Control.AsyncSeq/AsyncSeq.fs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type IAsyncEnumerable<'T> =
2525
type AsyncSeq<'T> = IAsyncEnumerable<'T>
2626
// abstract GetEnumerator : unit -> IAsyncEnumerator<'T>
2727

28-
type AsyncSeqSrc<'a> = private { mutable tl : TaskCompletionSource<('a * AsyncSeqSrc<'a>) option> }
28+
type AsyncSeqSrc<'a> = private { mutable tail : TaskCompletionSource<('a * AsyncSeqSrc<'a>) option> }
2929

3030
[<AutoOpen>]
3131
module internal Utils =
@@ -1369,23 +1369,29 @@ module AsyncSeq =
13691369
module AsyncSeqSrcImpl =
13701370

13711371
let create () : AsyncSeqSrc<'a> =
1372-
{ tl = new TaskCompletionSource<_>() }
1373-
1374-
let put (a:'a) (s:AsyncSeqSrc<'a>) : unit =
1375-
let s' = create ()
1376-
s.tl.SetResult(Some(a, s'))
1377-
s.tl <- s'.tl
1372+
{ tail = new TaskCompletionSource<_>() }
13781373

1374+
let put (a:'a) (s:AsyncSeqSrc<'a>) : unit =
1375+
let newTail = create ()
1376+
let tail = s.tail
1377+
s.tail <- newTail.tail
1378+
tail.SetResult(Some(a, newTail))
1379+
13791380
let close (s:AsyncSeqSrc<'a>) : unit =
1380-
s.tl.SetResult(None)
1381+
s.tail.SetResult(None)
13811382

1382-
let rec toAsyncSeq (s:AsyncSeqSrc<'a>) : AsyncSeq<'a> = asyncSeq {
1383-
let! next = s.tl.Task |> Async.AwaitTask
1384-
match next with
1385-
| None -> ()
1386-
| Some (a,tl) ->
1387-
yield a
1388-
yield! toAsyncSeq tl }
1383+
let fail (ex:exn) (s:AsyncSeqSrc<'a>) : unit =
1384+
s.tail.SetException ex
1385+
1386+
let rec toAsyncSeq (s:AsyncSeqSrc<'a>) : AsyncSeq<'a> =
1387+
let tail = s.tail
1388+
asyncSeq {
1389+
let! next = tail.Task |> Async.AwaitTask
1390+
match next with
1391+
| None -> ()
1392+
| Some (a,tl) ->
1393+
yield a
1394+
yield! toAsyncSeq tl }
13891395

13901396

13911397
type private Group<'k, 'a> = { key : 'k ; src : AsyncSeqSrc<'a> }

tests/FSharp.Control.AsyncSeq.Tests/AsyncSeqTests.fs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@ let EQ (a:AsyncSeq<'a>) (b:AsyncSeq<'a>) =
2828
printfn "actual=%A" act
2929
false
3030

31+
type Assert with
32+
/// Determines equality of two async sequences by convering them to lists, ignoring side-effects.
33+
static member AreEqual (expected:AsyncSeq<'a>, actual:AsyncSeq<'a>) =
34+
let exp = expected |> AsyncSeq.toList
35+
let act = actual |> AsyncSeq.toList
36+
let message = sprintf "expected=%A actual=%A" exp act
37+
Assert.True((exp = act), message)
38+
39+
3140

3241
[<Test>]
3342
let ``AsyncSeq.toArray``() =
@@ -1066,4 +1075,45 @@ let ``AsyncSeq.take should work``() =
10661075
}
10671076
let ss = s |> AsyncSeq.take 1
10681077
let ls = ss |> AsyncSeq.toList
1069-
()
1078+
()
1079+
1080+
1081+
[<Test>]
1082+
let ``AsyncSeqSource.create should create empty sequence`` () =
1083+
let src = AsyncSeqSrc.create ()
1084+
let s = src |> AsyncSeqSrc.toAsyncSeq
1085+
src |> AsyncSeqSrc.close
1086+
let expected = AsyncSeq.empty
1087+
Assert.True(EQ expected s)
1088+
1089+
1090+
[<Test>]
1091+
let ``AsyncSeqSource.put should yield`` () =
1092+
let item = 1
1093+
let src = AsyncSeqSrc.create ()
1094+
let actual = src |> AsyncSeqSrc.toAsyncSeq
1095+
src |> AsyncSeqSrc.put item
1096+
src |> AsyncSeqSrc.close
1097+
let expected = AsyncSeq.singleton item
1098+
Assert.AreEqual (expected, actual)
1099+
1100+
[<Test>]
1101+
let ``AsyncSeqSource.put should yield after async sequence is created`` () =
1102+
let item1 = 1
1103+
let item2 = 2
1104+
let src = AsyncSeqSrc.create ()
1105+
src |> AsyncSeqSrc.put item1
1106+
let actual = src |> AsyncSeqSrc.toAsyncSeq
1107+
src |> AsyncSeqSrc.put item2
1108+
src |> AsyncSeqSrc.close
1109+
let expected = AsyncSeq.ofSeq [item2]
1110+
Assert.AreEqual (expected, actual)
1111+
1112+
1113+
[<Test>]
1114+
let ``AsyncSeq.groupBy should work``() =
1115+
let ls = List.init 4 id
1116+
let p i = i % 2
1117+
let expected = ls |> Seq.groupBy p |> Seq.map (snd >> Seq.toList) |> Seq.toList |> AsyncSeq.ofSeq
1118+
let actual = ls |> AsyncSeq.ofSeq |> AsyncSeq.groupBy p |> AsyncSeq.mapAsyncParallel (snd >> AsyncSeq.toListAsync)
1119+
Assert.True(EQ expected actual)

0 commit comments

Comments
 (0)