diff --git a/src/FSharp.Control.TaskSeq.SmokeTests/FSharp.Control.TaskSeq.SmokeTests.fsproj b/src/FSharp.Control.TaskSeq.SmokeTests/FSharp.Control.TaskSeq.SmokeTests.fsproj index 75c962ec..a8fbec80 100644 --- a/src/FSharp.Control.TaskSeq.SmokeTests/FSharp.Control.TaskSeq.SmokeTests.fsproj +++ b/src/FSharp.Control.TaskSeq.SmokeTests/FSharp.Control.TaskSeq.SmokeTests.fsproj @@ -9,13 +9,16 @@ + + + diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.PocTests.fs b/src/FSharp.Control.TaskSeq.SmokeTests/TaskSeq.PocTests.fs similarity index 100% rename from src/FSharp.Control.TaskSeq.Test/TaskSeq.PocTests.fs rename to src/FSharp.Control.TaskSeq.SmokeTests/TaskSeq.PocTests.fs diff --git a/src/FSharp.Control.TaskSeq.SmokeTests/TestUtils.fs b/src/FSharp.Control.TaskSeq.SmokeTests/TestUtils.fs new file mode 100644 index 00000000..deb01c98 --- /dev/null +++ b/src/FSharp.Control.TaskSeq.SmokeTests/TestUtils.fs @@ -0,0 +1,131 @@ +namespace TaskSeq.Tests + +open System +open System.Threading +open System.Threading.Tasks +open System.Diagnostics +open System.Collections.Generic + +open Xunit +open Xunit.Abstractions +open FsUnit.Xunit + +open FSharp.Control + +/// Milliseconds +[] +type ms + +/// Microseconds +[] +type µs + +/// Helpers for short waits, as Task.Delay has about 15ms precision. +/// Inspired by IoT code: https://github.com/dotnet/iot/pull/235/files +module DelayHelper = + + let private rnd = Random() + + /// + /// Delay for at least the specified . + /// + /// The number of microseconds to delay. + /// + /// True to allow yielding the thread. If this is set to false, on single-proc systems + /// this will prevent all other code from running. + /// + let spinWaitDelay (microseconds: int64<µs>) (allowThreadYield: bool) = + let start = Stopwatch.GetTimestamp() + let minimumTicks = int64 microseconds * Stopwatch.Frequency / 1_000_000L + + // FIXME: though this is part of official IoT code, the `allowThreadYield` version is extremely slow + // slower than would be expected from a simple SpinOnce. Though this may be caused by scenarios with + // many tasks at once. Have to investigate. See perf smoke tests. + if allowThreadYield then + let spinWait = SpinWait() + + while Stopwatch.GetTimestamp() - start < minimumTicks do + spinWait.SpinOnce(1) + + else + while Stopwatch.GetTimestamp() - start < minimumTicks do + Thread.SpinWait(1) + + let delayTask (µsecMin: int64<µs>) (µsecMax: int64<µs>) f = task { + let rnd () = rnd.NextInt64(int64 µsecMin, int64 µsecMax) * 1L<µs> + + // ensure unequal running lengths and points-in-time for assigning the variable + // DO NOT use Thead.Sleep(), it's blocking! + // WARNING: Task.Delay only has a 15ms timer resolution!!! + + // TODO: check this! The following comment may not be correct + // this creates a resume state, which seems more efficient than SpinWait.SpinOnce, see DelayHelper. + let! _ = Task.Delay 0 + let delay = rnd () + + // typical minimum accuracy of Task.Delay is 15.6ms + // for delay-cases shorter than that, we use SpinWait + if delay < 15_000L<µs> then + do spinWaitDelay (rnd ()) false + else + do! Task.Delay(int <| float delay / 1_000.0) + + return f () + } + +/// +/// Creates dummy backgroundTasks with a randomized delay and a mutable state, +/// to ensure we properly test whether processing is done ordered or not. +/// Default for and +/// are 10,000µs and 30,000µs respectively (or 10ms and 30ms). +/// +type DummyTaskFactory(µsecMin: int64<µs>, µsecMax: int64<µs>) = + let mutable x = 0 + + /// + /// Creates dummy tasks with a randomized delay and a mutable state, + /// to ensure we properly test whether processing is done ordered or not. + /// Uses the defaults for and + /// with 10,000µs and 30,000µs respectively (or 10ms and 30ms). + /// + new() = new DummyTaskFactory(10_000L<µs>, 30_000L<µs>) + + + /// Bunch of delayed tasks that randomly have a yielding delay of 10-30ms, therefore having overlapping execution times. + member _.CreateDelayedTasks_SideEffect total = [ + for i in 0 .. total - 1 do + fun () -> DelayHelper.delayTask µsecMin µsecMax (fun _ -> Interlocked.Increment &x) + ] + +/// Just some dummy task generators, copied over from the base test project, with artificial delays, +/// mostly to ensure sequential async operation of side effects. +module Gen = + /// Joins two tasks using merely BCL methods. This approach is what you can use to + /// properly, sequentially execute a chain of tasks in a non-blocking, non-overlapping way. + let joinWithContinuation tasks = + let simple (t: unit -> Task<_>) (source: unit -> Task<_>) : unit -> Task<_> = + fun () -> + source() + .ContinueWith((fun (_: Task) -> t ()), TaskContinuationOptions.OnlyOnRanToCompletion) + .Unwrap() + :?> Task<_> + + let rec combine acc (tasks: (unit -> Task<_>) list) = + match tasks with + | [] -> acc + | t :: tail -> combine (simple t acc) tail + + match tasks with + | first :: rest -> combine first rest + | [] -> failwith "oh oh, no tasks given!" + + let joinIdentityHotStarted tasks () = task { return tasks |> List.map (fun t -> t ()) } + + let joinIdentityDelayed tasks () = task { return tasks } + + let createAndJoinMultipleTasks total joiner : Task<_> = + // the actual creation of tasks + let tasks = DummyTaskFactory().CreateDelayedTasks_SideEffect total + let combinedTask = joiner tasks + // start the combined tasks + combinedTask () diff --git a/src/FSharp.Control.TaskSeq.Test/FSharp.Control.TaskSeq.Test.fsproj b/src/FSharp.Control.TaskSeq.Test/FSharp.Control.TaskSeq.Test.fsproj index b6d84d11..43ac2020 100644 --- a/src/FSharp.Control.TaskSeq.Test/FSharp.Control.TaskSeq.Test.fsproj +++ b/src/FSharp.Control.TaskSeq.Test/FSharp.Control.TaskSeq.Test.fsproj @@ -42,7 +42,6 @@ - @@ -52,10 +51,8 @@ - - - - + + diff --git a/src/FSharp.Control.TaskSeq.Test/Nunit.Extensions.fs b/src/FSharp.Control.TaskSeq.Test/Nunit.Extensions.fs index 834afe02..eb67fecf 100644 --- a/src/FSharp.Control.TaskSeq.Test/Nunit.Extensions.fs +++ b/src/FSharp.Control.TaskSeq.Test/Nunit.Extensions.fs @@ -2,11 +2,11 @@ namespace TaskSeq.Tests open System open System.Threading.Tasks + open FsUnit open NHamcrest.Core open Microsoft.FSharp.Reflection -open FsToolkit.ErrorHandling open Xunit open Xunit.Sdk diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Append.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Append.Tests.fs index 8eb39454..32010192 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Append.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Append.Tests.fs @@ -1,13 +1,9 @@ module TaskSeq.Tests.Append -open System - open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control -open System.Collections.Generic // // TaskSeq.append diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.AsyncExtensions.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.AsyncExtensions.Tests.fs index 1f0b9efd..62d58368 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.AsyncExtensions.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.AsyncExtensions.Tests.fs @@ -1,6 +1,5 @@ module TaskSeq.Tests.AsyncExtensions -open System open Xunit open FsUnit.Xunit diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Cast.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Cast.Tests.fs index f63e9e9d..b8a423fe 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Cast.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Cast.Tests.fs @@ -4,7 +4,6 @@ open System open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Choose.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Choose.Tests.fs index b5376d5b..6258a760 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Choose.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Choose.Tests.fs @@ -1,11 +1,9 @@ module TaskSeq.Tests.Choose open System -open System.Threading.Tasks open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Collect.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Collect.Tests.fs index 6b71e075..48b1ec41 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Collect.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Collect.Tests.fs @@ -2,7 +2,6 @@ module TaskSeq.Tests.Collect open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Concat.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Concat.Tests.fs index 6b9f3d68..352aa4c7 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Concat.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Concat.Tests.fs @@ -1,13 +1,11 @@ module TaskSeq.Tests.Concat -open System +open System.Collections.Generic open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control -open System.Collections.Generic // // TaskSeq.concat diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Contains.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Contains.Tests.fs index 3d84956f..9b326a70 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Contains.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Contains.Tests.fs @@ -2,7 +2,6 @@ module TaskSeq.Tests.Contains open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Delay.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Delay.Tests.fs index a13c9111..c437bebc 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Delay.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Delay.Tests.fs @@ -1,13 +1,9 @@ module TaskSeq.Tests.Delay -open System - open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control -open System.Collections.Generic // // TaskSeq.delay diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Do.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Do.Tests.fs index 09c3c7b3..1f8badae 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Do.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Do.Tests.fs @@ -1,7 +1,7 @@ module TaskSeq.Tests.Do -open System open System.Threading.Tasks + open FsUnit open Xunit diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Empty.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Empty.Tests.fs index 0e73b90f..219b21be 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Empty.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Empty.Tests.fs @@ -3,7 +3,6 @@ module TaskSeq.Tests.Empty open System.Threading.Tasks open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control @@ -42,7 +41,7 @@ let ``TaskSeq-empty of unit in a taskSeq context`` () = task { [] let ``TaskSeq-empty of more complex type in a taskSeq context`` () = task { let! sq = - taskSeq { yield! TaskSeq.empty, int>> } + taskSeq { yield! TaskSeq.empty, int>> } // not a TaskResult, but a ResultTask lol |> TaskSeq.toArrayAsync Array.isEmpty sq |> should be True diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.ExactlyOne.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.ExactlyOne.Tests.fs index 0438086c..2a2a01d7 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.ExactlyOne.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.ExactlyOne.Tests.fs @@ -1,9 +1,9 @@ module TaskSeq.Tests.ExactlyOne open System + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Except.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Except.Tests.fs index b0cda375..db49b2c0 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Except.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Except.Tests.fs @@ -1,9 +1,7 @@ module TaskSeq.Tests.Except -open System open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Exists.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Exists.Tests.fs index 1fe3541c..04a652f5 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Exists.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Exists.Tests.fs @@ -2,7 +2,6 @@ module TaskSeq.Tests.Exists open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Filter.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Filter.Tests.fs index 0dfe5963..fb67ad9f 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Filter.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Filter.Tests.fs @@ -1,9 +1,9 @@ module TaskSeq.Tests.Filter open System + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Find.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Find.Tests.fs index 61a6e02e..9ad3ede8 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Find.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Find.Tests.fs @@ -1,11 +1,11 @@ module TaskSeq.Tests.Find +open System.Collections.Generic + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control -open System.Collections.Generic // // TaskSeq.find diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.FindIndex.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.FindIndex.Tests.fs index f65302b0..96a9e04c 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.FindIndex.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.FindIndex.Tests.fs @@ -1,11 +1,11 @@ module TaskSeq.Tests.FindIndex +open System.Collections.Generic + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control -open System.Collections.Generic // // TaskSeq.findIndex diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Fold.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Fold.Tests.fs index 1b0791b4..aa91c046 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Fold.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Fold.Tests.fs @@ -1,9 +1,9 @@ module TaskSeq.Tests.Fold open System.Text + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Head.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Head.Tests.fs index a1dc1993..af4cd8fc 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Head.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Head.Tests.fs @@ -1,9 +1,9 @@ module TaskSeq.Tests.Head open System + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Indexed.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Indexed.Tests.fs index 4ebab7b6..0d69753d 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Indexed.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Indexed.Tests.fs @@ -2,7 +2,6 @@ module TaskSeq.Tests.Indexed open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Init.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Init.Tests.fs index 0e65e47a..2c1a445c 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Init.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Init.Tests.fs @@ -4,7 +4,6 @@ open System open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.IsEmpty.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.IsEmpty.fs index 2d9de691..09925828 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.IsEmpty.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.IsEmpty.fs @@ -1,9 +1,7 @@ module TaskSeq.Tests.IsEmpty -open System.Threading.Tasks open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Item.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Item.Tests.fs index 5e922f90..d2fb2708 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Item.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Item.Tests.fs @@ -1,9 +1,9 @@ module TaskSeq.Tests.Item open System + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Last.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Last.Tests.fs index 82febc02..c74e8136 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Last.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Last.Tests.fs @@ -1,9 +1,9 @@ module TaskSeq.Tests.Last open System + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Length.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Length.Tests.fs index 900aa539..ac8c3882 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Length.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Length.Tests.fs @@ -1,9 +1,7 @@ module TaskSeq.Tests.Length -open System open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Let.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Let.Tests.fs index 5ebd14bd..e7c37844 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Let.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Let.Tests.fs @@ -2,6 +2,7 @@ module TaskSeq.Tests.Let open System open System.Threading.Tasks + open FsUnit open Xunit diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Map.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Map.Tests.fs index 1f77c1f5..e266b3c9 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Map.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Map.Tests.fs @@ -2,7 +2,6 @@ module TaskSeq.Tests.Map open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.OfXXX.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.OfXXX.Tests.fs index c32ad822..11354a3d 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.OfXXX.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.OfXXX.Tests.fs @@ -2,7 +2,6 @@ module TaskSeq.Tests.``Conversion-From`` open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Pick.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Pick.Tests.fs index 9fd7ac5c..e03c236b 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Pick.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Pick.Tests.fs @@ -1,10 +1,9 @@ module TaskSeq.Tests.Pick -open System open System.Collections.Generic + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Realworld.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Realworld.fs index 7ccf043f..f7c8594f 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Realworld.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Realworld.fs @@ -2,14 +2,13 @@ namespace TaskSeq.Tests open System open System.IO +open System.Threading.Tasks +open System.Collections.Generic + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control -open System.Threading.Tasks -open System.Diagnostics -open System.Collections.Generic open Xunit.Abstractions /// Just a naive, simple in-memory reader that acts as an IAsyncEnumerable to use with tests diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Singleton.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Singleton.Tests.fs index aec6fbbf..71a07e9e 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Singleton.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Singleton.Tests.fs @@ -2,7 +2,6 @@ module TaskSeq.Tests.Singleton open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.StateTransitionBug-delayed.Tests.CE.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.StateTransitionBug-delayed.Tests.CE.fs index e5575da1..8eb699bf 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.StateTransitionBug-delayed.Tests.CE.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.StateTransitionBug-delayed.Tests.CE.fs @@ -1,13 +1,9 @@ module TaskSeq.Tests.``Bug #42 -- asynchronous`` // see PR #42 open System -open System.Threading.Tasks -open System.Diagnostics -open System.Collections.Generic open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.StateTransitionBug.Tests.CE.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.StateTransitionBug.Tests.CE.fs index 1a421dbc..0861911e 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.StateTransitionBug.Tests.CE.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.StateTransitionBug.Tests.CE.fs @@ -2,12 +2,10 @@ module TaskSeq.Tests.``Bug #42 -- synchronous`` // see PR #42 open System open System.Threading.Tasks -open System.Diagnostics open System.Collections.Generic open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Tail.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Tail.Tests.fs index 9ba6a8af..38868127 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Tail.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Tail.Tests.fs @@ -1,9 +1,9 @@ module TaskSeq.Tests.Tail open System + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.TakeWhile.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.TakeWhile.Tests.fs index 7edc650c..30c15924 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.TakeWhile.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.TakeWhile.Tests.fs @@ -1,9 +1,9 @@ module TaskSeq.Tests.TakeWhile open System + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.TaskExtensions.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.TaskExtensions.Tests.fs index 5d5316a4..0121663f 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.TaskExtensions.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.TaskExtensions.Tests.fs @@ -1,6 +1,5 @@ module TaskSeq.Tests.TaskExtensions -open System open Xunit open FsUnit.Xunit diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Tests.CE.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Tests.CE.fs index cd7be9b1..d4fee3b0 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Tests.CE.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Tests.CE.fs @@ -4,7 +4,6 @@ open System open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.ToXXX.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.ToXXX.Tests.fs index fbb5635b..082fe98d 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.ToXXX.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.ToXXX.Tests.fs @@ -1,11 +1,11 @@ module TaskSeq.Tests.``Conversion-To`` +open System.Collections.Generic + open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control -open System.Collections.Generic //////////////////////////////////////////////////////////////////////////// /// /// diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Using.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Using.Tests.fs index bf53f14d..557381e0 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Using.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Using.Tests.fs @@ -2,6 +2,7 @@ module TaskSeq.Tests.Using open System open System.Threading.Tasks + open FSharp.Control open FsUnit open Xunit diff --git a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Zip.Tests.fs b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Zip.Tests.fs index 2ead6106..6ef461fb 100644 --- a/src/FSharp.Control.TaskSeq.Test/TaskSeq.Zip.Tests.fs +++ b/src/FSharp.Control.TaskSeq.Test/TaskSeq.Zip.Tests.fs @@ -1,9 +1,7 @@ module TaskSeq.Tests.Zip -open System open Xunit open FsUnit.Xunit -open FsToolkit.ErrorHandling open FSharp.Control diff --git a/src/FSharp.Control.TaskSeq.Test/TestUtils.fs b/src/FSharp.Control.TaskSeq.Test/TestUtils.fs index e97f3658..59c8dbb9 100644 --- a/src/FSharp.Control.TaskSeq.Test/TestUtils.fs +++ b/src/FSharp.Control.TaskSeq.Test/TestUtils.fs @@ -4,17 +4,13 @@ open System open System.Threading open System.Threading.Tasks open System.Diagnostics - -open FsToolkit.ErrorHandling - -open FSharp.Control open System.Collections.Generic -open FsUnit.Xunit + open Xunit open Xunit.Abstractions -open System.Runtime.Serialization -open System.Reflection -open Microsoft.FSharp.Reflection +open FsUnit.Xunit + +open FSharp.Control /// Milliseconds [] @@ -28,6 +24,8 @@ type µs /// Inspired by IoT code: https://github.com/dotnet/iot/pull/235/files module DelayHelper = + let private rnd = Random() + /// /// Delay for at least the specified . /// @@ -54,7 +52,6 @@ module DelayHelper = Thread.SpinWait(1) let delayTask (µsecMin: int64<µs>) (µsecMax: int64<µs>) f = task { - let rnd = Random() let rnd () = rnd.NextInt64(int64 µsecMin, int64 µsecMax) * 1L<µs> // ensure unequal running lengths and points-in-time for assigning the variable @@ -84,8 +81,6 @@ module DelayHelper = /// type DummyTaskFactory(µsecMin: int64<µs>, µsecMax: int64<µs>) = let mutable x = 0 - let rnd = Random() - let rnd () = rnd.NextInt64(int64 µsecMin, int64 µsecMax) * 1L<µs> let runTaskDelayed () = backgroundTask { return! DelayHelper.delayTask µsecMin µsecMax (fun _ -> Interlocked.Increment &x) }