コード例 #1
0
        public void ToTaskSignaledHandleWithZeroTimeout()
        {
            var         handle = new ManualResetEvent(initialState: true);
            Task <bool> actual = TplExtensions.ToTask(handle, timeout: 0);

            Assert.Same(TplExtensions.TrueTask, actual);
        }
コード例 #2
0
        public async Task ToTaskOnDisposedHandle()
        {
            var handle = new ManualResetEvent(false);

            handle.Dispose();
            await Assert.ThrowsAsync <ObjectDisposedException>(() => TplExtensions.ToTask(handle));
        }
コード例 #3
0
        public void ToTaskReturnsCompletedTaskPreSignaled()
        {
            var         handle = new ManualResetEvent(initialState: true);
            Task <bool> actual = TplExtensions.ToTask(handle);

            Assert.Same(TplExtensions.TrueTask, actual);
        }
コード例 #4
0
        public void WithTimeout_NullTask(bool generic)
        {
            // Verify that a faulted task is returned instead of throwing.
            Task timeoutTask = generic
                ? TplExtensions.WithTimeout <int>(null, TimeSpan.FromSeconds(1))
                : TplExtensions.WithTimeout(null, TimeSpan.FromSeconds(1));

            Assert.Throws <ArgumentNullException>(() => timeoutTask.GetAwaiter().GetResult());
        }
コード例 #5
0
        public void ToTaskOnHandleSignaledAfterCancellation()
        {
            var         handle = new ManualResetEvent(initialState: false);
            var         cts    = new CancellationTokenSource();
            Task <bool> actual = TplExtensions.ToTask(handle, cancellationToken: cts.Token);

            cts.Cancel();
            Assert.True(actual.IsCanceled);
            handle.Set();
        }
コード例 #6
0
        public async Task ToTaskOnHandleSignaledAfterNonZeroTimeout()
        {
            using (var handle = new ManualResetEvent(initialState: false))
            {
                Task <bool> actual = TplExtensions.ToTask(handle, timeout: 1);
                bool        result = await actual.WithTimeout(TimeSpan.FromMilliseconds(AsyncDelay));

                Assert.False(result);
            }
        }
コード例 #7
0
        public async Task ToTaskOnHandleSignaledLater()
        {
            var         handle = new ManualResetEvent(initialState: false);
            Task <bool> actual = TplExtensions.ToTask(handle);

            Assert.False(actual.IsCompleted);
            handle.Set();
            bool result = await actual;

            Assert.True(result);
        }
コード例 #8
0
        public async Task ToTaskOnHandleSignaledAfterNonZeroTimeout()
        {
            var         handle = new ManualResetEvent(initialState: false);
            Task <bool> actual = TplExtensions.ToTask(handle, timeout: 1);
            await Task.Delay(2);

            handle.Set();
            bool result = await actual;

            Assert.False(result);
        }
コード例 #9
0
 public void WithTimeout_MinusOneMeansInfiniteTimeout(bool generic)
 {
     this.ExecuteOnDispatcher(async delegate
     {
         var tcs         = new TaskCompletionSource <object>();
         var timeoutTask = generic
             ? TplExtensions.WithTimeout <object>(tcs.Task, TimeSpan.FromMilliseconds(-1))
             : TplExtensions.WithTimeout((Task)tcs.Task, TimeSpan.FromMilliseconds(-1));
         Assert.False(timeoutTask.IsCompleted);
         await Task.Delay(AsyncDelay / 2);
         Assert.False(timeoutTask.IsCompleted);
         tcs.SetResult(null);
         timeoutTask.GetAwaiter().GetResult();
     });
 }
コード例 #10
0
        public void FollowCancelableTaskToCompletionEndsInFault()
        {
            var        currentTCS    = new TaskCompletionSource <int>();
            Task <int> latestTask    = currentTCS.Task;
            var        followingTask = TplExtensions.FollowCancelableTaskToCompletion(() => latestTask, CancellationToken.None);

            for (int i = 0; i < 3; i++)
            {
                var oldTCS = currentTCS;
                currentTCS = new TaskCompletionSource <int>();
                latestTask = currentTCS.Task;
                oldTCS.SetCanceled();
            }

            currentTCS.SetException(new InvalidOperationException());
            Assert.IsType(typeof(InvalidOperationException), followingTask.Exception.InnerException);
        }
コード例 #11
0
        public void FollowCancelableTaskToCompletionEndsInCompletion()
        {
            var        currentTCS    = new TaskCompletionSource <int>();
            Task <int> latestTask    = currentTCS.Task;
            var        followingTask = TplExtensions.FollowCancelableTaskToCompletion(() => latestTask, CancellationToken.None);

            for (int i = 0; i < 3; i++)
            {
                var oldTCS = currentTCS;
                currentTCS = new TaskCompletionSource <int>();
                latestTask = currentTCS.Task;
                oldTCS.SetCanceled();
            }

            currentTCS.SetResult(3);
            Assert.Equal(3, followingTask.Result);
        }
コード例 #12
0
        public void FollowCancelableTaskToCompletionEndsInUltimateCancellation()
        {
            var        currentTCS    = new TaskCompletionSource <int>();
            Task <int> latestTask    = currentTCS.Task;
            var        cts           = new CancellationTokenSource();
            var        followingTask = TplExtensions.FollowCancelableTaskToCompletion(() => latestTask, cts.Token);

            for (int i = 0; i < 3; i++)
            {
                var oldTCS = currentTCS;
                currentTCS = new TaskCompletionSource <int>();
                latestTask = currentTCS.Task;
                oldTCS.SetCanceled();
            }

            cts.Cancel();
            Assert.True(followingTask.IsCanceled);
        }
コード例 #13
0
    public void FollowCancelableTaskToCompletionEndsInCompletionWithSpecifiedTaskSource()
    {
        var        specifiedTaskSource = new TaskCompletionSource <int>();
        var        currentTCS          = new TaskCompletionSource <int>();
        Task <int> latestTask          = currentTCS.Task;
        Task <int>?followingTask       = TplExtensions.FollowCancelableTaskToCompletion(() => latestTask, CancellationToken.None, specifiedTaskSource);

        Assert.Same(specifiedTaskSource.Task, followingTask);

        for (int i = 0; i < 3; i++)
        {
            TaskCompletionSource <int>?oldTCS = currentTCS;
            currentTCS = new TaskCompletionSource <int>();
            latestTask = currentTCS.Task;
            oldTCS.SetCanceled();
        }

        currentTCS.SetResult(3);
        Assert.Equal(3, followingTask.Result);
    }
コード例 #14
0
 public void ApplyResultToNullTaskNonGeneric()
 {
     Assert.Throws <ArgumentNullException>(() => TplExtensions.ApplyResultTo((Task)null, new TaskCompletionSource <object>()));
 }
コード例 #15
0
        public void ApplyResultToNullTaskSource()
        {
            var tcs = new TaskCompletionSource <object>();

            Assert.Throws <ArgumentNullException>(() => TplExtensions.ApplyResultTo(tcs.Task, null));
        }
コード例 #16
0
        public void ApplyResultToNullTaskSourceNonGeneric()
        {
            var tcs = new TaskCompletionSource <object>();

            Assert.Throws <ArgumentNullException>(() => TplExtensions.ApplyResultTo((Task)tcs.Task, (TaskCompletionSource <object?>)null !));
        }