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); }
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; }
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; }
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); }
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); }