protected void RunTest_CanSetCompleted_SingleThread <TResult> (Func <AsyncProcessingRequest <TResult> > rqFn,
                                                                       TResult expectedResult,
                                                                       bool expectSame)
        {
            AsyncProcessingRequest <TResult> rq = rqFn
                                                  .Invoke();

            rq.SetCompleted(expectedResult);

            TResult actualResult = rq.Task
                                   .Result;

            Assert.AreEqual(TaskStatus.RanToCompletion,
                            rq.Task.Status);

            if (!expectSame)
            {
                Assert.AreEqual(expectedResult,
                                actualResult);
            }
            else
            {
                Assert.AreSame(expectedResult,
                               actualResult);
            }
        }
        protected async Task RunTest_CanSetCompleted_MultiThread <TResult> (Func <AsyncProcessingRequest <TResult> > rqFn,
                                                                            bool syncOnCheckpoints,
                                                                            int nThreads,
                                                                            TResult expectedResult,
                                                                            bool expectSame)
        {
            Barrier syncCheckpoint =
                new Barrier(nThreads);

            List <Task> allThreads =
                new List <Task>();

            AsyncProcessingRequest <TResult> rq = rqFn
                                                  .Invoke();

            for (int i = 0; i < nThreads; i++)
            {
                allThreads.Add(Task.Run(() =>
                {
                    if (syncOnCheckpoints)
                    {
                        syncCheckpoint.SignalAndWait();
                    }
                    rq.SetCompleted(expectedResult);
                }));
            }

            await Task.WhenAll(allThreads);

            TResult actualResult = rq.Task
                                   .Result;

            Assert.AreEqual(TaskStatus.RanToCompletion,
                            rq.Task.Status);

            if (!expectSame)
            {
                Assert.AreEqual(expectedResult,
                                actualResult);
            }
            else
            {
                Assert.AreSame(expectedResult,
                               actualResult);
            }
        }