public async Task LifetimeProperties_HaveAppropriateValues()
        {
            var ready  = new ManualResetEventSlim();
            var signal = new ManualResetEventSlim();

            var disposable = new DelegateSingleDisposable <object>(new object(), _ =>
            {
                ready.Set();
                signal.Wait();
            });

            Assert.False(disposable.IsDisposing);
            Assert.False(disposable.IsDisposeStarted);
            Assert.False(disposable.IsDisposed);

            var task1 = Task.Run(() => disposable.Dispose());

            ready.Wait();

            Assert.True(disposable.IsDisposing);
            Assert.True(disposable.IsDisposeStarted);
            Assert.False(disposable.IsDisposed);

            signal.Set();
            await task1;

            Assert.False(disposable.IsDisposing);
            Assert.True(disposable.IsDisposeStarted);
            Assert.True(disposable.IsDisposed);
        }
Example #2
0
        public async Task LifetimeProperties_HaveAppropriateValues()
        {
            var ready  = new TaskCompletionSource <object>();
            var signal = new TaskCompletionSource <object>();

            var disposable = new DelegateSingleDisposable <object>(new object(), async _ =>
            {
                ready.TrySetResult(null);
                await signal.Task;
            });

            Assert.False(disposable.IsDisposing);
            Assert.False(disposable.IsDisposeStarted);
            Assert.False(disposable.IsDisposed);

            var task1 = Task.Run(async() => await disposable.DisposeAsync());
            await ready.Task;

            Assert.True(disposable.IsDisposing);
            Assert.True(disposable.IsDisposeStarted);
            Assert.False(disposable.IsDisposed);

            signal.TrySetResult(null);
            await task1;

            Assert.False(disposable.IsDisposing);
            Assert.True(disposable.IsDisposeStarted);
            Assert.True(disposable.IsDisposed);
        }
        public void DisposeOnlyCalledOnce()
        {
            var counter    = 0;
            var disposable = new DelegateSingleDisposable <object>(new object(), _ => { ++counter; });

            disposable.Dispose();
            disposable.Dispose();
            Assert.AreEqual(1, counter);
        }
        public void ConstructedWithContext_DisposeReceivesThatContext()
        {
            var    providedContext = new object();
            object seenContext     = null;
            var    disposable      = new DelegateSingleDisposable <object>(providedContext, context => { seenContext = context; });

            disposable.Dispose();
            Assert.AreSame(providedContext, seenContext);
        }
        public async Task Dispose_ConstructedWithContext_ReceivesThatContext()
        {
            var    providedContext = new object();
            object seenContext     = null;
            var    disposable      = new DelegateSingleDisposable <object>(providedContext, async context => { seenContext = context; });
            await disposable.DisposeAsync();

            Assert.Same(providedContext, seenContext);
        }
        public async Task DisposeOnlyCalledOnce()
        {
            var counter    = 0;
            var disposable = new DelegateSingleDisposable <object>(new object(), async _ => { ++counter; });
            await disposable.DisposeAsync();

            await disposable.DisposeAsync();

            Assert.Equal(1, counter);
        }
        public void TryUpdateContext_AfterDisposeCompletes_ReturnsFalse()
        {
            var    originalContext                = new object();
            var    updatedContext                 = new object();
            object contextPassedToDispose         = null;
            bool   tryUpdateContextDelegateCalled = false;
            var    disposable = new DelegateSingleDisposable <object>(originalContext, context => { contextPassedToDispose = context; });

            disposable.Dispose();
            Assert.False(disposable.TryUpdateContext(context => { tryUpdateContextDelegateCalled = true; return(updatedContext); }));
            Assert.False(tryUpdateContextDelegateCalled);
            Assert.Same(originalContext, contextPassedToDispose);
        }
        public void Dispose_UpdatedContext_ReceivesUpdatedContext()
        {
            var    originalContext        = new object();
            var    updatedContext         = new object();
            object contextPassedToDispose = null;
            object contextPassedToTryUpdateContextDelegate = null;
            var    disposable = new DelegateSingleDisposable <object>(originalContext, context => { contextPassedToDispose = context; });

            Assert.True(disposable.TryUpdateContext(context => { contextPassedToTryUpdateContextDelegate = context; return(updatedContext); }));
            disposable.Dispose();
            Assert.Same(originalContext, contextPassedToTryUpdateContextDelegate);
            Assert.Same(updatedContext, contextPassedToDispose);
        }
        public async Task DisposeIsNonblocking()
        {
            var ready      = new TaskCompletionSource <object>();
            var signal     = new TaskCompletionSource <object>();
            var disposable = new DelegateSingleDisposable <object>(new object(), async _ =>
            {
                ready.TrySetResult(null);
                await signal.Task;
            });

            var task1 = Task.Run(async() => await disposable.DisposeAsync());
            await ready.Task;

            await Task.Run(async() => await disposable.DisposeAsync());

            signal.TrySetResult(null);
            await task1;
        }
Example #10
0
        public async Task DisposeIsNonblocking()
        {
            var ready      = new ManualResetEventSlim();
            var signal     = new ManualResetEventSlim();
            var disposable = new DelegateSingleDisposable <object>(new object(), _ =>
            {
                ready.Set();
                signal.Wait();
            });

            var task1 = Task.Run(() => disposable.Dispose());

            ready.Wait();

            await Task.Run(() => disposable.Dispose());

            signal.Set();
            await task1;
        }
Example #11
0
        public async Task DisposableWaitsForDisposeToComplete()
        {
            var ready      = new TaskCompletionSource <object>();
            var signal     = new TaskCompletionSource <object>();
            var disposable = new DelegateSingleDisposable <object>(new object(), async _ =>
            {
                ready.TrySetResult(null);
                await signal.Task;
            });

            var task1 = Task.Run(async() => await disposable.DisposeAsync());
            await ready.Task;

            var task2 = Task.Run(async() => await disposable.DisposeAsync());
            var timer = Task.Delay(500);

            Assert.Same(timer, await Task.WhenAny(task1, task2, timer));

            signal.TrySetResult(null);
            await task1;
            await task2;
        }
        public async Task DisposableWaitsForDisposeToComplete()
        {
            var ready      = new ManualResetEventSlim();
            var signal     = new ManualResetEventSlim();
            var disposable = new DelegateSingleDisposable <object>(new object(), _ =>
            {
                ready.Set();
                signal.Wait();
            });

            var task1 = Task.Run(() => disposable.Dispose());

            ready.Wait();

            var task2 = Task.Run(() => disposable.Dispose());
            var timer = Task.Delay(500);

            Assert.AreSame(timer, await Task.WhenAny(task1, task2, timer));

            signal.Set();
            await task1;
            await task2;
        }
        public async Task TryUpdateContext_AfterDisposeStarts_ReturnsFalse()
        {
            var    originalContext                = new object();
            var    updatedContext                 = new object();
            object contextPassedToDispose         = null;
            bool   tryUpdateContextDelegateCalled = false;
            var    ready      = new ManualResetEventSlim();
            var    signal     = new ManualResetEventSlim();
            var    disposable = new DelegateSingleDisposable <object>(originalContext, context =>
            {
                ready.Set();
                signal.Wait();
                contextPassedToDispose = context;
            });
            var task = Task.Run(() => disposable.Dispose());

            ready.Wait();
            Assert.False(disposable.TryUpdateContext(context => { tryUpdateContextDelegateCalled = true; return(updatedContext); }));
            signal.Set();
            await task;

            Assert.False(tryUpdateContextDelegateCalled);
            Assert.Same(originalContext, contextPassedToDispose);
        }
Example #14
0
        public async Task TryUpdateContext_AfterDisposeStarts_ReturnsFalse()
        {
            var    originalContext                = new object();
            var    updatedContext                 = new object();
            object contextPassedToDispose         = null;
            bool   tryUpdateContextDelegateCalled = false;
            var    ready      = new TaskCompletionSource <object>();
            var    signal     = new TaskCompletionSource <object>();
            var    disposable = new DelegateSingleDisposable <object>(originalContext, async context =>
            {
                ready.TrySetResult(null);
                await signal.Task;
                contextPassedToDispose = context;
            });
            var task = Task.Run(async() => await disposable.DisposeAsync());
            await ready.Task;

            Assert.False(disposable.TryUpdateContext(context => { tryUpdateContextDelegateCalled = true; return(updatedContext); }));
            signal.TrySetResult(null);
            await task;

            Assert.False(tryUpdateContextDelegateCalled);
            Assert.Same(originalContext, contextPassedToDispose);
        }