public void SetFromCompletedTaskVoid() {
        var cex = new Exception[] { new InvalidEnumArgumentException(), new InvalidProgramException() };

        var r1 = new TaskCompletionSource();
        r1.SetFromCompletedTask(Tasks.RanToCompletion());
        r1.Task.AssertRanToCompletion();

        var r2 = new TaskCompletionSource();
        r2.SetFromCompletedTask(Tasks.Cancelled());
        r2.Task.AssertCancelled();

        var r3 = new TaskCompletionSource();
        r3.SetFromCompletedTask(Tasks.Faulted(new InvalidEnumArgumentException()));
        r3.Task.AssertFailed<InvalidEnumArgumentException>();

        var r4 = new TaskCompletionSource();
        r4.SetFromCompletedTask(Tasks.Faulted(cex));
        r4.Task.AssertFailed<AggregateException>().InnerExceptions.AssertSequenceEquals(cex);

        // failed transitions
        Util.ExpectException<InvalidOperationException>(() => r1.SetFromCompletedTask(Tasks.RanToCompletion()));
        Util.ExpectException<InvalidOperationException>(() => r1.SetFromCompletedTask(Tasks.Cancelled()));
        Util.ExpectException<InvalidOperationException>(() => r1.SetFromCompletedTask(Tasks.Faulted(new InvalidEnumArgumentException())));
        Util.ExpectException<InvalidOperationException>(() => r1.SetFromCompletedTask(Tasks.Faulted(cex)));
    }
        ///<summary>Posts an action to the synchronization context, exposing its eventual completion as a task.</summary>
        public static Task PostAction(this SynchronizationContext context, Action action)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }
            var t = new TaskCompletionSource();

            context.Post(x => t.SetFromCompletedTask(Tasks.FromExecution(action)), null);
            return(t.Task);
        }
        ///<summary>Posts a function to the synchronization context, exposing its eventual result as a task.</summary>
        public static Task <T> PostFunc <T>(this SynchronizationContext context, Func <T> func)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (func == null)
            {
                throw new ArgumentNullException("func");
            }
            var t = new TaskCompletionSource <T>();

            context.Post(x => t.SetFromCompletedTask(Tasks.FromEvaluation(func)), null);
            return(t.Task);
        }
        ///<summary>A task that faults if the given task is cancelled, or else contains the same eventual result.</summary>
        public static Task WithCancellationToTaskCanceledException(this Task task)
        {
            if (task == null)
            {
                throw new ArgumentNullException("task");
            }
            var r = new TaskCompletionSource();

            task.ContinueWith(
                t => {
                if (t.IsCanceled)
                {
                    r.SetException(new TaskCanceledException());
                }
                else
                {
                    r.SetFromCompletedTask(t);
                }
            },
                TaskContinuationOptions.ExecuteSynchronously);
            return(r.Task);
        }
        ///<summary>A task that is cancelled if the given task contains an OperationCanceledException, or else contains the same eventual result.</summary>
        public static Task <T> WithCanceledExceptionToCancellation <T>(this Task <T> task)
        {
            if (task == null)
            {
                throw new ArgumentNullException("task");
            }
            var r = new TaskCompletionSource <T>();

            task.ContinueWith(
                t => {
                if (t.IsFaulted && t.Exception.InnerExceptions.Count == 1 && t.Exception.InnerExceptions[0] is OperationCanceledException)
                {
                    r.SetCanceled();
                }
                else
                {
                    r.SetFromCompletedTask(t);
                }
            },
                TaskContinuationOptions.ExecuteSynchronously);
            return(r.Task);
        }