UsingTest.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Reactive;
  10. using System.Reactive.Concurrency;
  11. using System.Reactive.Linq;
  12. using Microsoft.Reactive.Testing;
  13. using Xunit;
  14. using ReactiveTests.Dummies;
  15. using System.Reflection;
  16. using System.Threading;
  17. using System.Reactive.Disposables;
  18. using System.Reactive.Subjects;
  19. namespace ReactiveTests.Tests
  20. {
  21. public class UsingTest : ReactiveTest
  22. {
  23. [Fact]
  24. public void Using_ArgumentChecking()
  25. {
  26. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Using((Func<IDisposable>)null, DummyFunc<IDisposable, IObservable<int>>.Instance));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Using(DummyFunc<IDisposable>.Instance, (Func<IDisposable, IObservable<int>>)null));
  28. ReactiveAssert.Throws</*some*/Exception>(() => Observable.Using(() => DummyDisposable.Instance, d => default(IObservable<int>)).Subscribe());
  29. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Using(() => DummyDisposable.Instance, d => DummyObservable<int>.Instance).Subscribe(null));
  30. }
  31. [Fact]
  32. public void Using_Null()
  33. {
  34. var scheduler = new TestScheduler();
  35. var disposeInvoked = 0L;
  36. var createInvoked = 0L;
  37. var xs = default(ITestableObservable<long>);
  38. var disposable = default(MockDisposable);
  39. var _d = default(MockDisposable);
  40. var res = scheduler.Start(() =>
  41. Observable.Using(
  42. () =>
  43. {
  44. disposeInvoked++;
  45. disposable = default(MockDisposable);
  46. return disposable;
  47. },
  48. d =>
  49. {
  50. _d = d;
  51. createInvoked++;
  52. xs = scheduler.CreateColdObservable(
  53. OnNext<long>(100, scheduler.Clock),
  54. OnCompleted<long>(200));
  55. return xs;
  56. }
  57. )
  58. );
  59. Assert.Same(disposable, _d);
  60. res.Messages.AssertEqual(
  61. OnNext(300, 200L),
  62. OnCompleted<long>(400)
  63. );
  64. Assert.Equal(1, createInvoked);
  65. Assert.Equal(1, disposeInvoked);
  66. xs.Subscriptions.AssertEqual(
  67. Subscribe(200, 400)
  68. );
  69. Assert.Null(disposable);
  70. }
  71. [Fact]
  72. public void Using_Complete()
  73. {
  74. var scheduler = new TestScheduler();
  75. var disposeInvoked = 0;
  76. var createInvoked = 0;
  77. var xs = default(ITestableObservable<long>);
  78. var disposable = default(MockDisposable);
  79. var _d = default(MockDisposable);
  80. var res = scheduler.Start(() =>
  81. Observable.Using(
  82. () =>
  83. {
  84. disposeInvoked++;
  85. disposable = new MockDisposable(scheduler);
  86. return disposable;
  87. },
  88. d =>
  89. {
  90. _d = d;
  91. createInvoked++;
  92. xs = scheduler.CreateColdObservable(
  93. OnNext<long>(100, scheduler.Clock),
  94. OnCompleted<long>(200));
  95. return xs;
  96. }
  97. )
  98. );
  99. Assert.Same(disposable, _d);
  100. res.Messages.AssertEqual(
  101. OnNext(300, 200L),
  102. OnCompleted<long>(400)
  103. );
  104. Assert.Equal(1, createInvoked);
  105. Assert.Equal(1, disposeInvoked);
  106. xs.Subscriptions.AssertEqual(
  107. Subscribe(200, 400)
  108. );
  109. disposable.AssertEqual(
  110. 200,
  111. 400
  112. );
  113. }
  114. [Fact]
  115. public void Using_Error()
  116. {
  117. var scheduler = new TestScheduler();
  118. var disposeInvoked = 0;
  119. var createInvoked = 0;
  120. var xs = default(ITestableObservable<long>);
  121. var disposable = default(MockDisposable);
  122. var _d = default(MockDisposable);
  123. var ex = new Exception();
  124. var res = scheduler.Start(() =>
  125. Observable.Using(
  126. () =>
  127. {
  128. disposeInvoked++;
  129. disposable = new MockDisposable(scheduler);
  130. return disposable;
  131. },
  132. d =>
  133. {
  134. _d = d;
  135. createInvoked++;
  136. xs = scheduler.CreateColdObservable(
  137. OnNext<long>(100, scheduler.Clock),
  138. OnError<long>(200, ex));
  139. return xs;
  140. }
  141. )
  142. );
  143. Assert.Same(disposable, _d);
  144. res.Messages.AssertEqual(
  145. OnNext(300, 200L),
  146. OnError<long>(400, ex)
  147. );
  148. Assert.Equal(1, createInvoked);
  149. Assert.Equal(1, disposeInvoked);
  150. xs.Subscriptions.AssertEqual(
  151. Subscribe(200, 400)
  152. );
  153. disposable.AssertEqual(
  154. 200,
  155. 400
  156. );
  157. }
  158. [Fact]
  159. public void Using_Dispose()
  160. {
  161. var scheduler = new TestScheduler();
  162. var disposeInvoked = 0;
  163. var createInvoked = 0;
  164. var xs = default(ITestableObservable<long>);
  165. var disposable = default(MockDisposable);
  166. var _d = default(MockDisposable);
  167. var res = scheduler.Start(() =>
  168. Observable.Using(
  169. () =>
  170. {
  171. disposeInvoked++;
  172. disposable = new MockDisposable(scheduler);
  173. return disposable;
  174. },
  175. d =>
  176. {
  177. _d = d;
  178. createInvoked++;
  179. xs = scheduler.CreateColdObservable(
  180. OnNext<long>(100, scheduler.Clock),
  181. OnNext<long>(1000, scheduler.Clock + 1));
  182. return xs;
  183. }
  184. )
  185. );
  186. Assert.Same(disposable, _d);
  187. res.Messages.AssertEqual(
  188. OnNext(300, 200L)
  189. );
  190. Assert.Equal(1, createInvoked);
  191. Assert.Equal(1, disposeInvoked);
  192. xs.Subscriptions.AssertEqual(
  193. Subscribe(200, 1000)
  194. );
  195. disposable.AssertEqual(
  196. 200,
  197. 1000
  198. );
  199. }
  200. [Fact]
  201. public void Using_ThrowResourceSelector()
  202. {
  203. var scheduler = new TestScheduler();
  204. var disposeInvoked = 0;
  205. var createInvoked = 0;
  206. var ex = new Exception();
  207. var res = scheduler.Start(() =>
  208. Observable.Using<int, IDisposable>(
  209. () =>
  210. {
  211. disposeInvoked++;
  212. throw ex;
  213. },
  214. d =>
  215. {
  216. createInvoked++;
  217. return Observable.Never<int>();
  218. }
  219. )
  220. );
  221. res.Messages.AssertEqual(
  222. OnError<int>(200, ex)
  223. );
  224. Assert.Equal(0, createInvoked);
  225. Assert.Equal(1, disposeInvoked);
  226. }
  227. [Fact]
  228. public void Using_ThrowResourceUsage()
  229. {
  230. var scheduler = new TestScheduler();
  231. var ex = new Exception();
  232. var disposeInvoked = 0;
  233. var createInvoked = 0;
  234. var disposable = default(MockDisposable);
  235. var res = scheduler.Start(() =>
  236. Observable.Using<int, IDisposable>(
  237. () =>
  238. {
  239. disposeInvoked++;
  240. disposable = new MockDisposable(scheduler);
  241. return disposable;
  242. },
  243. d =>
  244. {
  245. createInvoked++;
  246. throw ex;
  247. }
  248. )
  249. );
  250. res.Messages.AssertEqual(
  251. OnError<int>(200, ex)
  252. );
  253. Assert.Equal(1, createInvoked);
  254. Assert.Equal(1, disposeInvoked);
  255. disposable.AssertEqual(
  256. 200,
  257. 200
  258. );
  259. }
  260. }
  261. }