Ejemplo n.º 1
0
        public async ValueTask DisposeAsyncThrows()
        {
            var classUnderTest = new DisposalTracker();
            await classUnderTest.DisposeAsync();

            var ex = await Record.ExceptionAsync(() => classUnderTest.DisposeAsync());

            Assert.NotNull(ex);
            Assert.IsType <ObjectDisposedException>(ex);
        }
Ejemplo n.º 2
0
        public ValueTask DisposeAsync()
        {
            if (disposed)
            {
                throw new ObjectDisposedException(GetType().FullName);
            }

            disposed = true;

            return(disposalTracker.DisposeAsync());
        }
Ejemplo n.º 3
0
        public async ValueTask NoExceptions_DoesNotThrow()
        {
            var classUnderTest = new DisposalTracker();
            var obj            = Substitute.For <IDisposable, InterfaceProxy <IDisposable> >();

            classUnderTest.Add(obj);

            var ex = await Record.ExceptionAsync(() => classUnderTest.DisposeAsync());

            Assert.Null(ex);
            obj.Received().Dispose();
        }
Ejemplo n.º 4
0
        /// <inheritdoc/>
        public async ValueTask DisposeAsync()
        {
            if (disposed)
            {
                throw new ObjectDisposedException(GetType().FullName);
            }

            disposed = true;

            await disposalTracker.DisposeAsync();

            executor?.Dispose();
        }
Ejemplo n.º 5
0
        public async ValueTask MultipleExceptions_ThrowsAggregateException()
        {
            var classUnderTest = new DisposalTracker();
            var obj1           = Substitute.For <IDisposable, InterfaceProxy <IDisposable> >();

            obj1.When(x => x.Dispose()).Throw <DivideByZeroException>();
            classUnderTest.Add(obj1);
            var obj2 = Substitute.For <IDisposable, InterfaceProxy <IDisposable> >();

            obj2.When(x => x.Dispose()).Throw <InvalidOperationException>();
            classUnderTest.Add(obj2);

            var ex = await Record.ExceptionAsync(() => classUnderTest.DisposeAsync());

            var aggEx = Assert.IsType <AggregateException>(ex);

            Assert.Collection(
                aggEx.InnerExceptions,
                ex => Assert.IsType <InvalidOperationException>(ex),
                ex => Assert.IsType <DivideByZeroException>(ex)
                );
        }
Ejemplo n.º 6
0
        public async ValueTask SingleException_CleansUpAllObjects_ThrowsTheSingleException()
        {
            var classUnderTest = new DisposalTracker();
            var obj1           = Substitute.For <IDisposable, InterfaceProxy <IDisposable> >();

            classUnderTest.Add(obj1);
            var thrown = new DivideByZeroException();
            var obj2   = Substitute.For <IDisposable, InterfaceProxy <IDisposable> >();

            obj2.When(x => x.Dispose()).Throw(thrown);
            classUnderTest.Add(obj2);
            var obj3 = Substitute.For <IDisposable, InterfaceProxy <IDisposable> >();

            classUnderTest.Add(obj3);

            var ex = await Record.ExceptionAsync(() => classUnderTest.DisposeAsync());

            Assert.Same(thrown, ex);
            obj1.Received().Dispose();
            obj2.Received().Dispose();
            obj3.Received().Dispose();
        }
 /// <inheritdoc/>
 public void Dispose()
 {
     // Have to do disposal on a background thread, since we can't guarantee that disposal
     // will be synchronous (and we can't change the contract of ISourceInformationProvider).
     Task.Run(async() => await disposalTracker.DisposeAsync());
 }