public void TrySetCanceled_ThrowsIfOperationIsDisposed()
        {
            // Arrange
            var op = new AsyncCompletionSource(AsyncOperationStatus.RanToCompletion);

            op.Dispose();

            // Act/Assert
            Assert.Throws <ObjectDisposedException>(() => op.TrySetCanceled());
        }
        public void TrySetCanceled_SetsStatusToCanceled(AsyncOperationStatus status)
        {
            // Arrange
            var op = new AsyncCompletionSource(status);

            // Act
            var result = op.TrySetCanceled();

            // Assert
            Assert.True(op.IsCanceled);
            Assert.True(result);
        }
        public void TrySetCanceled_FailsIfOperationIsCompleted()
        {
            // Arrange
            var op = new AsyncCompletionSource(AsyncOperationStatus.RanToCompletion);

            // Act
            var result = op.TrySetCanceled();

            // Assert
            Assert.False(result);
            Assert.True(op.CompletedSynchronously);
            Assert.True(op.IsCompletedSuccessfully);
        }
        public void TrySetCanceled_RaisesCompletionCallbacks()
        {
            // Arrange
            var asyncCallbackCalled1 = false;
            var asyncCallbackCalled2 = false;
            var op = new AsyncCompletionSource(asyncResult => asyncCallbackCalled1 = true, null);

            op.AddCompletionCallback(asyncOp => asyncCallbackCalled2 = true, null);

            // Act
            op.TrySetCanceled();

            // Assert
            Assert.True(asyncCallbackCalled1);
            Assert.True(asyncCallbackCalled2);
        }