public async void ForException()
        {
            var ex     = new Exception();
            var result = RingResult.CreateForException(PipeScheduler.ThreadPool, ex);

            Assert.Equal(ex, await Assert.ThrowsAsync <Exception>(async() => await result));
            result.Dispose();
        }
        public async void BasicCase()
        {
            var result = RingResult.Create(PipeScheduler.ThreadPool);

            result.Complete(1);

            Assert.Equal(1, await result);
        }
        public async void ThrowsErrnoException()
        {
            var result = RingResult.Create(PipeScheduler.ThreadPool);

            result.Complete(-1);

            var e = await Assert.ThrowsAsync <ErrnoException>(async() => await result);

            Assert.Equal(1, e.Errno);
        }
        public void RecreateFromHandle()
        {
            var result = RingResult.Create(PipeScheduler.ThreadPool);

            var handle = result.Handle;

            var result2 = RingResult.TaskFromHandle(handle);

            Assert.Equal(result, result2);
        }
        public async void AdvancedCase()
        {
            var result = RingResult.Create(PipeScheduler.ThreadPool);

            var tasks = new[]
            {
                Task.Run(async() => await result),
                Task.Run(() => result.Complete(2))
            };

            await Task.WhenAll(tasks);

            Assert.Equal(2, ((Task <int>)tasks[0]).Result);
        }
        public async void ReUse()
        {
            var result = RingResult.Create(PipeScheduler.ThreadPool);

            result.Complete(3);

            Assert.True(result.IsCompleted);

            Assert.Equal(3, await result);

            Assert.False(result.IsCompleted);

            result.Complete(4);

            Assert.Equal(4, await result);
        }