public void SetCompleted_ThrowsIfOperationIsCompleted(AsyncOperationStatus status)
        {
            // Arrange
            var op = new AsyncCompletionSource(status);

            // Act/Assert
            Assert.Throws <InvalidOperationException>(() => op.SetCompleted());
            Assert.True(op.CompletedSynchronously);
        }
Exemple #2
0
        public void TryAddContinuation_ExecutesWhenOperationCompletes()
        {
            // Arrange
            var op           = new AsyncCompletionSource();
            var continuation = Substitute.For <IAsyncContinuation>();

            op.TryAddCompletionCallback(continuation);

            // Act
            op.SetCompleted();

            // Assert
            continuation.Received(1).Invoke(op);
        }
Exemple #3
0
        public async Task Await_CollbackIsTriggered()
        {
            // Arrange
            var op   = new AsyncCompletionSource();
            var task = Task.Run(() =>
            {
                Thread.Sleep(10);
                op.SetCompleted();
            });

            // Act
            await op;

            // Assert
            AssertCompleted(op);
        }
Exemple #4
0
        public async Task TryAddCompletionCallback_IsThreadSafe()
        {
            // Arrange
            var op      = new AsyncCompletionSource();
            var counter = 0;
            var d       = new Action <IAsyncOperation>(CompletionCallback);

            void CompletionCallback(IAsyncOperation o)
            {
                Interlocked.Increment(ref counter);
            }

            void TestMethod()
            {
                for (var i = 0; i < 10000; ++i)
                {
                    op.TryAddCompletionCallback(d);
                }
            }

            void TestMethod2()
            {
                for (var i = 0; i < 10000; ++i)
                {
                    op.RemoveCompletionCallback(d);
                }
            }

            TestMethod();

            // Act
            await Task.WhenAll(
                Task.Run(new Action(TestMethod)),
                Task.Run(new Action(TestMethod)),
                Task.Run(new Action(TestMethod2)),
                Task.Run(new Action(TestMethod)));

            // Assert
            op.SetCompleted();
            Assert.Equal(30000, counter);
        }
Exemple #5
0
        public async Task TryAddCompletionCallback_ContinuationsAreRunOnCorrectSynchronozationContext()
        {
            // Arrange
            var op        = new AsyncCompletionSource();
            var op2       = new AsyncCompletionSource();
            var sc        = Substitute.For <SynchronizationContext>();
            var tid       = 0;
            var tidActual = 0;

            op.TryAddCompletionCallback(_ => { }, sc);
            op2.TryAddCompletionCallback(_ => tidActual = Thread.CurrentThread.ManagedThreadId, null);

            // Act
            await Task.Run(() => op.SetCompleted());

            await Task.Run(() => { tid = Thread.CurrentThread.ManagedThreadId; op2.SetCompleted(); });

            // Assert
            sc.Received(1).Post(Arg.Any <SendOrPostCallback>(), Arg.Any <object>());
            Assert.Equal(tid, tidActual);
        }
        public void SetCompleted_RaisesProgressChanged()
        {
            // Arrange
            var asyncCallbackCalled  = false;
            var asyncCallbackCalled2 = false;
            var progress             = 0;
            var progress2            = 0f;
            var op = new AsyncCompletionSource();
            var pc = Substitute.For <IProgress <float> >();

            op.ProgressChanged += (sender, args) =>
            {
                asyncCallbackCalled = true;
                progress            = args.ProgressPercentage;
            };

            op.AddProgressCallback(
                p =>
            {
                asyncCallbackCalled2 = true;
                progress2            = p;
            },
                null);

            op.AddProgressCallback(pc, null);

            // Act
            op.SetCompleted();

            // Assert
            Assert.True(asyncCallbackCalled);
            Assert.True(asyncCallbackCalled2);
            Assert.Equal(100, progress);
            Assert.Equal(1, progress2);
            pc.Received(1).Report(1);
        }