public static void CompletesSynchronouslyIfAllTasksWereCompletedSynchronously(int arity)
    {
        var tasks = Enumerable.Repeat(CompletedTask, arity).ToArray();

        var adapters = AwaiterAdapter.CreateAllAdapters(tasks);

        AssertAllAdapters(adapters, adapter => adapter.IsCompleted);
    }
    public static void FirstExceptionIsThrown(int arity)
    {
        var sources = Enumerable.Range(0, arity).Select(_ => new TaskCompletionSource <object>()).ToArray();

        var adapters = AwaiterAdapter.CreateAllAdapters(sources.Select(source => source.Task).ToArray());

        for (var i = sources.Length - 1; i >= 0; i--)
        {
            sources[i].SetException(new DummyException());
        }

        AssertAllAdapters(adapters, adapter => ReferenceEquals(sources[0].Task.Exception?.InnerException, Assert.ThrowsAny <DummyException>(adapter.GetResult)));
    }
    public static async Task WaitsForAllTasksToCompleteWhenAllFail(int arity, int whichToWaitFor)
    {
        var source = new TaskCompletionSource <object>();

        var tasks = Enumerable.Range(0, arity)
                    .Select(index =>
                            index == whichToWaitFor ? source.Task : FailedTask).ToArray();

        var adapters = AwaiterAdapter.CreateAllAdapters(tasks);

        AssertAllAdapters(adapters, adapter => !adapter.IsCompleted);

        source.SetException(new DummyException());

        foreach (var adapter in adapters)
        {
            await Assert.ThrowsAnyAsync <DummyException>(async() => await adapter);
        }

        AssertAllAdapters(adapters, adapter => adapter.IsCompleted);
    }
    public static async Task WaitsForAllTasksToCompleteWhenAllSucceed(int arity, int whichToWaitFor)
    {
        var source = new TaskCompletionSource <object>();

        var tasks = (
            from index in Enumerable.Range(0, arity)
            select index == whichToWaitFor ? source.Task : CompletedTask).ToArray();

        var adapters = AwaiterAdapter.CreateAllAdapters(tasks);

        AssertAllAdapters(adapters, adapter => !adapter.IsCompleted);

        source.SetResult(null);

        foreach (var adapter in adapters)
        {
            await adapter;
        }

        AssertAllAdapters(adapters, adapter => adapter.IsCompleted);
    }