123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- // Licensed to the .NET Foundation under one or more agreements.
- // The .NET Foundation licenses this file to you under the Apache 2.0 License.
- // See the LICENSE file in the project root for more information.
- using System;
- using System.Reactive;
- using System.Reactive.Disposables;
- using System.Reactive.Linq;
- using Microsoft.Reactive.Testing;
- using ReactiveTests.Dummies;
- using Xunit;
- namespace ReactiveTests.Tests
- {
- public class UsingTest : ReactiveTest
- {
- [Fact]
- public void Using_ArgumentChecking()
- {
- ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Using(null, DummyFunc<IDisposable, IObservable<int>>.Instance));
- ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Using(DummyFunc<IDisposable>.Instance, (Func<IDisposable, IObservable<int>>)null));
- ReactiveAssert.Throws</*some*/Exception>(() => Observable.Using(() => DummyDisposable.Instance, d => default(IObservable<int>)).Subscribe());
- ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Using(() => DummyDisposable.Instance, d => DummyObservable<int>.Instance).Subscribe(null));
- }
- [Fact]
- public void Using_Null()
- {
- var scheduler = new TestScheduler();
- var disposeInvoked = 0L;
- var createInvoked = 0L;
- var xs = default(ITestableObservable<long>);
- var disposable = default(MockDisposable);
- var _d = default(MockDisposable);
- var res = scheduler.Start(() =>
- Observable.Using(
- () =>
- {
- disposeInvoked++;
- disposable = default;
- return disposable;
- },
- d =>
- {
- _d = d;
- createInvoked++;
- xs = scheduler.CreateColdObservable(
- OnNext(100, scheduler.Clock),
- OnCompleted<long>(200));
- return xs;
- }
- )
- );
- Assert.Same(disposable, _d);
- res.Messages.AssertEqual(
- OnNext(300, 200L),
- OnCompleted<long>(400)
- );
- Assert.Equal(1, createInvoked);
- Assert.Equal(1, disposeInvoked);
- xs.Subscriptions.AssertEqual(
- Subscribe(200, 400)
- );
- Assert.Null(disposable);
- }
- [Fact]
- public void Using_Complete()
- {
- var scheduler = new TestScheduler();
- var disposeInvoked = 0;
- var createInvoked = 0;
- var xs = default(ITestableObservable<long>);
- var disposable = default(MockDisposable);
- var _d = default(MockDisposable);
- var res = scheduler.Start(() =>
- Observable.Using(
- () =>
- {
- disposeInvoked++;
- disposable = new MockDisposable(scheduler);
- return disposable;
- },
- d =>
- {
- _d = d;
- createInvoked++;
- xs = scheduler.CreateColdObservable(
- OnNext(100, scheduler.Clock),
- OnCompleted<long>(200));
- return xs;
- }
- )
- );
- Assert.Same(disposable, _d);
- res.Messages.AssertEqual(
- OnNext(300, 200L),
- OnCompleted<long>(400)
- );
- Assert.Equal(1, createInvoked);
- Assert.Equal(1, disposeInvoked);
- xs.Subscriptions.AssertEqual(
- Subscribe(200, 400)
- );
- disposable.AssertEqual(
- 200,
- 400
- );
- }
- [Fact]
- public void Using_Error()
- {
- var scheduler = new TestScheduler();
- var disposeInvoked = 0;
- var createInvoked = 0;
- var xs = default(ITestableObservable<long>);
- var disposable = default(MockDisposable);
- var _d = default(MockDisposable);
- var ex = new Exception();
- var res = scheduler.Start(() =>
- Observable.Using(
- () =>
- {
- disposeInvoked++;
- disposable = new MockDisposable(scheduler);
- return disposable;
- },
- d =>
- {
- _d = d;
- createInvoked++;
- xs = scheduler.CreateColdObservable(
- OnNext(100, scheduler.Clock),
- OnError<long>(200, ex));
- return xs;
- }
- )
- );
- Assert.Same(disposable, _d);
- res.Messages.AssertEqual(
- OnNext(300, 200L),
- OnError<long>(400, ex)
- );
- Assert.Equal(1, createInvoked);
- Assert.Equal(1, disposeInvoked);
- xs.Subscriptions.AssertEqual(
- Subscribe(200, 400)
- );
- disposable.AssertEqual(
- 200,
- 400
- );
- }
- [Fact]
- public void Using_Dispose()
- {
- var scheduler = new TestScheduler();
- var disposeInvoked = 0;
- var createInvoked = 0;
- var xs = default(ITestableObservable<long>);
- var disposable = default(MockDisposable);
- var _d = default(MockDisposable);
- var res = scheduler.Start(() =>
- Observable.Using(
- () =>
- {
- disposeInvoked++;
- disposable = new MockDisposable(scheduler);
- return disposable;
- },
- d =>
- {
- _d = d;
- createInvoked++;
- xs = scheduler.CreateColdObservable(
- OnNext(100, scheduler.Clock),
- OnNext(1000, scheduler.Clock + 1));
- return xs;
- }
- )
- );
- Assert.Same(disposable, _d);
- res.Messages.AssertEqual(
- OnNext(300, 200L)
- );
- Assert.Equal(1, createInvoked);
- Assert.Equal(1, disposeInvoked);
- xs.Subscriptions.AssertEqual(
- Subscribe(200, 1000)
- );
- disposable.AssertEqual(
- 200,
- 1000
- );
- }
- [Fact]
- public void Using_ThrowResourceSelector()
- {
- var scheduler = new TestScheduler();
- var disposeInvoked = 0;
- var createInvoked = 0;
- var ex = new Exception();
- var res = scheduler.Start(() =>
- Observable.Using<int, IDisposable>(
- () =>
- {
- disposeInvoked++;
- throw ex;
- },
- d =>
- {
- createInvoked++;
- return Observable.Never<int>();
- }
- )
- );
- res.Messages.AssertEqual(
- OnError<int>(200, ex)
- );
- Assert.Equal(0, createInvoked);
- Assert.Equal(1, disposeInvoked);
- }
- [Fact]
- public void Using_ThrowResourceUsage()
- {
- var scheduler = new TestScheduler();
- var ex = new Exception();
- var disposeInvoked = 0;
- var createInvoked = 0;
- var disposable = default(MockDisposable);
- var res = scheduler.Start(() =>
- Observable.Using<int, IDisposable>(
- () =>
- {
- disposeInvoked++;
- disposable = new MockDisposable(scheduler);
- return disposable;
- },
- d =>
- {
- createInvoked++;
- throw ex;
- }
- )
- );
- res.Messages.AssertEqual(
- OnError<int>(200, ex)
- );
- Assert.Equal(1, createInvoked);
- Assert.Equal(1, disposeInvoked);
- disposable.AssertEqual(
- 200,
- 200
- );
- }
- [Fact]
- public void Using_NestedCompleted()
- {
- var order = "";
- Observable.Using(() => Disposable.Create(() => order += "3"),
- _ => Observable.Using(() => Disposable.Create(() => order += "2"),
- __ => Observable.Using(() => Disposable.Create(() => order += "1"),
- ___ => Observable.Return(Unit.Default))))
- .Finally(() => order += "4")
- .Subscribe();
- Assert.Equal("1234", order);
- }
- [Fact]
- public void Using_NestedDisposed()
- {
- var order = "";
- Observable.Using(() => Disposable.Create(() => order += "3"),
- _ => Observable.Using(() => Disposable.Create(() => order += "2"),
- __ => Observable.Using(() => Disposable.Create(() => order += "1"),
- ___ => Observable.Never<Unit>())))
- .Finally(() => order += "4")
- .Subscribe()
- .Dispose();
- Assert.Equal("1234", order);
- }
- }
- }
|