public void CancellationCancelsReadTasks()
        {
            var sut   = new BufferedChannel <int>(0);
            var task1 = sut.TryReadSafeAsync();
            var task2 = sut.TryReadSafeAsync();

            sut.Terminate();
            task1.Result.HasValue.ShouldBeFalse();
            task2.Result.HasValue.ShouldBeFalse();
        }
        public void FailCancelsReadTasks()
        {
            var sut   = new BufferedChannel <int>(0);
            var task1 = sut.TryReadSafeAsync();
            var task2 = sut.TryReadSafeAsync();

            sut.Terminate(new InvalidOperationException());
            task1.Result.HasValue.ShouldBeFalse();
            task2.Result.HasValue.ShouldBeFalse();
        }
        public void ResetCancelsReadTasks()
        {
            var sut       = new BufferedChannel <int>(0);
            var readTask1 = sut.TryReadSafeAsync();
            var readTask2 = sut.TryReadSafeAsync();

            sut.Reset();
            readTask1.Result.HasValue.ShouldBeFalse();
            readTask2.Result.HasValue.ShouldBeFalse();
        }
        public void FailCompletesChannelEvenIfBufferIsNotEmpty()
        {
            var sut = new BufferedChannel <int>(2);

            sut.TryWriteSafe(1);
            sut.TryWriteSafe(2);
            sut.Terminate(new InvalidOperationException());
            sut.Completion.IsCompleted.ShouldBe(false);
            sut.TryReadSafe(out int _).ShouldBe(true);
            sut.TryReadSafe(out int _).ShouldBe(true);
            var result = Should.CompleteIn(() => sut.TryReadSafeAsync().AsTask(), TimeSpan.FromSeconds(1));

            result.HasValue.ShouldBeFalse();
            sut.Completion.IsFaulted.ShouldBeTrue();
        }
        public void CancellationCompletesChannel()
        {
            var sut = new BufferedChannel <int>(2);

            sut.TryWriteSafe(1);
            sut.TryWriteSafe(2);
            sut.Terminate();
            sut.Completion.IsCompleted.ShouldBe(false);
            sut.TryReadSafe(out int _).ShouldBe(true);
            sut.TryReadSafe(out int _).ShouldBe(true);
            var result = sut.TryReadSafeAsync().ShouldCompleteIn(Timeout1Sec);

            result.HasValue.ShouldBeFalse();
            sut.Completion.IsCanceled.ShouldBeTrue();
        }