1
0

TaskObservableExtensionsTest.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
  2. #if !NO_TPL
  3. using System;
  4. using System.Linq;
  5. using System.Reactive;
  6. using System.Reactive.Concurrency;
  7. using System.Reactive.Linq;
  8. using System.Reactive.Threading.Tasks;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using Microsoft.Reactive.Testing;
  12. using Microsoft.VisualStudio.TestTools.UnitTesting;
  13. namespace ReactiveTests.Tests
  14. {
  15. [TestClass]
  16. public class TaskObservableExtensionsTest : ReactiveTest
  17. {
  18. #region ToObservable
  19. [TestMethod]
  20. public void TaskToObservable_NonVoid_ArgumentChecking()
  21. {
  22. ReactiveAssert.Throws<ArgumentNullException>(() => TaskObservableExtensions.ToObservable((System.Threading.Tasks.Task<int>)null));
  23. var tcs = new System.Threading.Tasks.TaskCompletionSource<int>();
  24. var task = tcs.Task;
  25. ReactiveAssert.Throws<ArgumentNullException>(() => task.ToObservable().Subscribe(null));
  26. }
  27. [TestMethod]
  28. public void TaskToObservable_NonVoid_Complete_BeforeCreate()
  29. {
  30. var taskScheduler = new TestTaskScheduler();
  31. var taskFactory = new TaskFactory(taskScheduler);
  32. var res = default(ITestableObserver<int>);
  33. taskFactory.StartNew(() =>
  34. {
  35. var scheduler = new TestScheduler();
  36. var taskSource = new TaskCompletionSource<int>();
  37. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  38. scheduler.ScheduleAbsolute(10, () => taskSource.SetResult(42));
  39. res = scheduler.Start(() =>
  40. taskSource.Task.ToObservable()
  41. );
  42. });
  43. res.Messages.AssertEqual(
  44. OnNext(200, 42),
  45. OnCompleted<int>(200)
  46. );
  47. }
  48. [TestMethod]
  49. public void TaskToObservable_NonVoid_Complete_BeforeSubscribe()
  50. {
  51. var taskScheduler = new TestTaskScheduler();
  52. var taskFactory = new TaskFactory(taskScheduler);
  53. var res = default(ITestableObserver<int>);
  54. taskFactory.StartNew(() =>
  55. {
  56. var scheduler = new TestScheduler();
  57. var taskSource = new TaskCompletionSource<int>();
  58. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  59. scheduler.ScheduleAbsolute(110, () => taskSource.SetResult(42));
  60. res = scheduler.Start(() =>
  61. taskSource.Task.ToObservable()
  62. );
  63. });
  64. res.Messages.AssertEqual(
  65. OnNext(200, 42),
  66. OnCompleted<int>(200)
  67. );
  68. }
  69. [TestMethod]
  70. public void TaskToObservable_NonVoid_Complete_BeforeDispose()
  71. {
  72. var taskScheduler = new TestTaskScheduler();
  73. var taskFactory = new TaskFactory(taskScheduler);
  74. var res = default(ITestableObserver<int>);
  75. taskFactory.StartNew(() =>
  76. {
  77. var scheduler = new TestScheduler();
  78. var taskSource = new TaskCompletionSource<int>();
  79. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  80. scheduler.ScheduleAbsolute(300, () => taskSource.SetResult(42));
  81. res = scheduler.Start(() =>
  82. taskSource.Task.ToObservable()
  83. );
  84. });
  85. res.Messages.AssertEqual(
  86. OnNext(300, 42),
  87. OnCompleted<int>(300)
  88. );
  89. }
  90. [TestMethod]
  91. public void TaskToObservable_NonVoid_Complete_AfterDispose()
  92. {
  93. var taskScheduler = new TestTaskScheduler();
  94. var taskFactory = new TaskFactory(taskScheduler);
  95. var res = default(ITestableObserver<int>);
  96. taskFactory.StartNew(() =>
  97. {
  98. var scheduler = new TestScheduler();
  99. var taskSource = new TaskCompletionSource<int>();
  100. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  101. scheduler.ScheduleAbsolute(1100, () => taskSource.SetResult(42));
  102. res = scheduler.Start(() =>
  103. taskSource.Task.ToObservable()
  104. );
  105. });
  106. res.Messages.AssertEqual(
  107. );
  108. }
  109. [TestMethod]
  110. public void TaskToObservable_NonVoid_Exception_BeforeCreate()
  111. {
  112. var taskScheduler = new TestTaskScheduler();
  113. var taskFactory = new TaskFactory(taskScheduler);
  114. var res = default(ITestableObserver<int>);
  115. var ex = new Exception();
  116. taskFactory.StartNew(() =>
  117. {
  118. var scheduler = new TestScheduler();
  119. var taskSource = new TaskCompletionSource<int>();
  120. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  121. scheduler.ScheduleAbsolute(10, () => taskSource.SetException(ex));
  122. res = scheduler.Start(() =>
  123. taskSource.Task.ToObservable()
  124. );
  125. });
  126. res.Messages.AssertEqual(
  127. OnError<int>(200, ex)
  128. );
  129. }
  130. [TestMethod]
  131. public void TaskToObservable_NonVoid_Exception_BeforeSubscribe()
  132. {
  133. var taskScheduler = new TestTaskScheduler();
  134. var taskFactory = new TaskFactory(taskScheduler);
  135. var res = default(ITestableObserver<int>);
  136. var ex = new Exception();
  137. taskFactory.StartNew(() =>
  138. {
  139. var scheduler = new TestScheduler();
  140. var taskSource = new TaskCompletionSource<int>();
  141. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  142. scheduler.ScheduleAbsolute(110, () => taskSource.SetException(ex));
  143. res = scheduler.Start(() =>
  144. taskSource.Task.ToObservable()
  145. );
  146. });
  147. res.Messages.AssertEqual(
  148. OnError<int>(200, ex)
  149. );
  150. }
  151. [TestMethod]
  152. public void TaskToObservable_NonVoid_Exception_BeforeDispose()
  153. {
  154. var taskScheduler = new TestTaskScheduler();
  155. var taskFactory = new TaskFactory(taskScheduler);
  156. var res = default(ITestableObserver<int>);
  157. var ex = new Exception();
  158. taskFactory.StartNew(() =>
  159. {
  160. var scheduler = new TestScheduler();
  161. var taskSource = new TaskCompletionSource<int>();
  162. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  163. scheduler.ScheduleAbsolute(300, () => taskSource.SetException(ex));
  164. res = scheduler.Start(() =>
  165. taskSource.Task.ToObservable()
  166. );
  167. });
  168. res.Messages.AssertEqual(
  169. OnError<int>(300, ex)
  170. );
  171. }
  172. [TestMethod]
  173. public void TaskToObservable_NonVoid_Exception_AfterDispose()
  174. {
  175. var taskScheduler = new TestTaskScheduler();
  176. var taskFactory = new TaskFactory(taskScheduler);
  177. var res = default(ITestableObserver<int>);
  178. taskFactory.StartNew(() =>
  179. {
  180. var scheduler = new TestScheduler();
  181. var taskSource = new TaskCompletionSource<int>();
  182. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  183. scheduler.ScheduleAbsolute(1100, () => taskSource.SetException(new Exception()));
  184. res = scheduler.Start(() =>
  185. taskSource.Task.ToObservable()
  186. );
  187. });
  188. res.Messages.AssertEqual(
  189. );
  190. }
  191. [TestMethod]
  192. public void TaskToObservable_NonVoid_Canceled_BeforeCreate()
  193. {
  194. var taskScheduler = new TestTaskScheduler();
  195. var taskFactory = new TaskFactory(taskScheduler);
  196. var res = default(ITestableObserver<int>);
  197. taskFactory.StartNew(() =>
  198. {
  199. var scheduler = new TestScheduler();
  200. var taskSource = new TaskCompletionSource<int>();
  201. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  202. scheduler.ScheduleAbsolute(10, () => taskSource.SetCanceled());
  203. res = scheduler.Start(() =>
  204. taskSource.Task.ToObservable()
  205. );
  206. });
  207. res.Messages.AssertEqual(
  208. OnError<int>(200, ex => ex is TaskCanceledException)
  209. );
  210. }
  211. [TestMethod]
  212. public void TaskToObservable_NonVoid_Canceled_BeforeSubscribe()
  213. {
  214. var taskScheduler = new TestTaskScheduler();
  215. var taskFactory = new TaskFactory(taskScheduler);
  216. var res = default(ITestableObserver<int>);
  217. taskFactory.StartNew(() =>
  218. {
  219. var scheduler = new TestScheduler();
  220. var taskSource = new TaskCompletionSource<int>();
  221. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  222. scheduler.ScheduleAbsolute(110, () => taskSource.SetCanceled());
  223. res = scheduler.Start(() =>
  224. taskSource.Task.ToObservable()
  225. );
  226. });
  227. res.Messages.AssertEqual(
  228. OnError<int>(200, ex => ex is TaskCanceledException)
  229. );
  230. }
  231. [TestMethod]
  232. public void TaskToObservable_NonVoid_Canceled_BeforeDispose()
  233. {
  234. var taskScheduler = new TestTaskScheduler();
  235. var taskFactory = new TaskFactory(taskScheduler);
  236. var res = default(ITestableObserver<int>);
  237. taskFactory.StartNew(() =>
  238. {
  239. var scheduler = new TestScheduler();
  240. var taskSource = new TaskCompletionSource<int>();
  241. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  242. scheduler.ScheduleAbsolute(300, () => taskSource.SetCanceled());
  243. res = scheduler.Start(() =>
  244. taskSource.Task.ToObservable()
  245. );
  246. });
  247. res.Messages.AssertEqual(
  248. OnError<int>(300, ex => ex is TaskCanceledException)
  249. );
  250. }
  251. [TestMethod]
  252. public void TaskToObservable_NonVoid_Canceled_AfterDispose()
  253. {
  254. var taskScheduler = new TestTaskScheduler();
  255. var taskFactory = new TaskFactory(taskScheduler);
  256. var res = default(ITestableObserver<int>);
  257. taskFactory.StartNew(() =>
  258. {
  259. var scheduler = new TestScheduler();
  260. var taskSource = new TaskCompletionSource<int>();
  261. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  262. scheduler.ScheduleAbsolute(1100, () => taskSource.SetCanceled());
  263. res = scheduler.Start(() =>
  264. taskSource.Task.ToObservable()
  265. );
  266. });
  267. res.Messages.AssertEqual(
  268. );
  269. }
  270. [TestMethod]
  271. public void TaskToObservable_Void_ArgumentChecking()
  272. {
  273. ReactiveAssert.Throws<ArgumentNullException>(() => TaskObservableExtensions.ToObservable((System.Threading.Tasks.Task)null));
  274. var tcs = new System.Threading.Tasks.TaskCompletionSource<int>();
  275. System.Threading.Tasks.Task task = tcs.Task;
  276. ReactiveAssert.Throws<ArgumentNullException>(() => task.ToObservable().Subscribe(null));
  277. }
  278. [TestMethod]
  279. public void TaskToObservable_Void_Complete_BeforeCreate()
  280. {
  281. var taskScheduler = new TestTaskScheduler();
  282. var taskFactory = new TaskFactory(taskScheduler);
  283. var res = default(ITestableObserver<Unit>);
  284. taskFactory.StartNew(() =>
  285. {
  286. var scheduler = new TestScheduler();
  287. var taskSource = new TaskCompletionSource<int>();
  288. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  289. scheduler.ScheduleAbsolute(10, () => taskSource.SetResult(42));
  290. res = scheduler.Start(() =>
  291. ((Task)taskSource.Task).ToObservable()
  292. );
  293. });
  294. res.Messages.AssertEqual(
  295. OnNext(200, new Unit()),
  296. OnCompleted<Unit>(200)
  297. );
  298. }
  299. [TestMethod]
  300. public void TaskToObservable_Void_Complete_BeforeSubscribe()
  301. {
  302. var taskScheduler = new TestTaskScheduler();
  303. var taskFactory = new TaskFactory(taskScheduler);
  304. var res = default(ITestableObserver<Unit>);
  305. taskFactory.StartNew(() =>
  306. {
  307. var scheduler = new TestScheduler();
  308. var taskSource = new TaskCompletionSource<int>();
  309. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  310. scheduler.ScheduleAbsolute(110, () => taskSource.SetResult(42));
  311. res = scheduler.Start(() =>
  312. ((Task)taskSource.Task).ToObservable()
  313. );
  314. });
  315. res.Messages.AssertEqual(
  316. OnNext(200, new Unit()),
  317. OnCompleted<Unit>(200)
  318. );
  319. }
  320. [TestMethod]
  321. public void TaskToObservable_Void_Complete_BeforeDispose()
  322. {
  323. var taskScheduler = new TestTaskScheduler();
  324. var taskFactory = new TaskFactory(taskScheduler);
  325. var res = default(ITestableObserver<Unit>);
  326. taskFactory.StartNew(() =>
  327. {
  328. var scheduler = new TestScheduler();
  329. var taskSource = new TaskCompletionSource<int>();
  330. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  331. scheduler.ScheduleAbsolute(300, () => taskSource.SetResult(42));
  332. res = scheduler.Start(() =>
  333. ((Task)taskSource.Task).ToObservable()
  334. );
  335. });
  336. res.Messages.AssertEqual(
  337. OnNext(300, new Unit()),
  338. OnCompleted<Unit>(300)
  339. );
  340. }
  341. [TestMethod]
  342. public void TaskToObservable_Void_Complete_AfterDispose()
  343. {
  344. var taskScheduler = new TestTaskScheduler();
  345. var taskFactory = new TaskFactory(taskScheduler);
  346. var res = default(ITestableObserver<Unit>);
  347. taskFactory.StartNew(() =>
  348. {
  349. var scheduler = new TestScheduler();
  350. var taskSource = new TaskCompletionSource<int>();
  351. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  352. scheduler.ScheduleAbsolute(1100, () => taskSource.SetResult(42));
  353. res = scheduler.Start(() =>
  354. ((Task)taskSource.Task).ToObservable()
  355. );
  356. });
  357. res.Messages.AssertEqual(
  358. );
  359. }
  360. [TestMethod]
  361. public void TaskToObservable_Void_Exception_BeforeCreate()
  362. {
  363. var taskScheduler = new TestTaskScheduler();
  364. var taskFactory = new TaskFactory(taskScheduler);
  365. var res = default(ITestableObserver<Unit>);
  366. var ex = new Exception();
  367. taskFactory.StartNew(() =>
  368. {
  369. var scheduler = new TestScheduler();
  370. var taskSource = new TaskCompletionSource<int>();
  371. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  372. scheduler.ScheduleAbsolute(10, () => taskSource.SetException(ex));
  373. res = scheduler.Start(() =>
  374. ((Task)taskSource.Task).ToObservable()
  375. );
  376. });
  377. res.Messages.AssertEqual(
  378. OnError<Unit>(200, ex)
  379. );
  380. }
  381. [TestMethod]
  382. public void TaskToObservable_Void_Exception_BeforeSubscribe()
  383. {
  384. var taskScheduler = new TestTaskScheduler();
  385. var taskFactory = new TaskFactory(taskScheduler);
  386. var res = default(ITestableObserver<Unit>);
  387. var ex = new Exception();
  388. taskFactory.StartNew(() =>
  389. {
  390. var scheduler = new TestScheduler();
  391. var taskSource = new TaskCompletionSource<int>();
  392. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  393. scheduler.ScheduleAbsolute(110, () => taskSource.SetException(ex));
  394. res = scheduler.Start(() =>
  395. ((Task)taskSource.Task).ToObservable()
  396. );
  397. });
  398. res.Messages.AssertEqual(
  399. OnError<Unit>(200, ex)
  400. );
  401. }
  402. [TestMethod]
  403. public void TaskToObservable_Void_Exception_BeforeDispose()
  404. {
  405. var taskScheduler = new TestTaskScheduler();
  406. var taskFactory = new TaskFactory(taskScheduler);
  407. var res = default(ITestableObserver<Unit>);
  408. var ex = new Exception();
  409. taskFactory.StartNew(() =>
  410. {
  411. var scheduler = new TestScheduler();
  412. var taskSource = new TaskCompletionSource<int>();
  413. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  414. scheduler.ScheduleAbsolute(300, () => taskSource.SetException(ex));
  415. res = scheduler.Start(() =>
  416. ((Task)taskSource.Task).ToObservable()
  417. );
  418. });
  419. res.Messages.AssertEqual(
  420. OnError<Unit>(300, ex)
  421. );
  422. }
  423. [TestMethod]
  424. public void TaskToObservable_Void_Exception_AfterDispose()
  425. {
  426. var taskScheduler = new TestTaskScheduler();
  427. var taskFactory = new TaskFactory(taskScheduler);
  428. var res = default(ITestableObserver<Unit>);
  429. taskFactory.StartNew(() =>
  430. {
  431. var scheduler = new TestScheduler();
  432. var taskSource = new TaskCompletionSource<int>();
  433. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  434. scheduler.ScheduleAbsolute(1100, () => taskSource.SetException(new Exception()));
  435. res = scheduler.Start(() =>
  436. ((Task)taskSource.Task).ToObservable()
  437. );
  438. });
  439. res.Messages.AssertEqual(
  440. );
  441. }
  442. [TestMethod]
  443. public void TaskToObservable_Void_Canceled_BeforeCreate()
  444. {
  445. var taskScheduler = new TestTaskScheduler();
  446. var taskFactory = new TaskFactory(taskScheduler);
  447. var res = default(ITestableObserver<Unit>);
  448. taskFactory.StartNew(() =>
  449. {
  450. var scheduler = new TestScheduler();
  451. var taskSource = new TaskCompletionSource<int>();
  452. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  453. scheduler.ScheduleAbsolute(10, () => taskSource.SetCanceled());
  454. res = scheduler.Start(() =>
  455. ((Task)taskSource.Task).ToObservable()
  456. );
  457. });
  458. res.Messages.AssertEqual(
  459. OnError<Unit>(200, ex => ex is TaskCanceledException)
  460. );
  461. }
  462. [TestMethod]
  463. public void TaskToObservable_Void_Canceled_BeforeSubscribe()
  464. {
  465. var taskScheduler = new TestTaskScheduler();
  466. var taskFactory = new TaskFactory(taskScheduler);
  467. var res = default(ITestableObserver<Unit>);
  468. taskFactory.StartNew(() =>
  469. {
  470. var scheduler = new TestScheduler();
  471. var taskSource = new TaskCompletionSource<int>();
  472. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  473. scheduler.ScheduleAbsolute(110, () => taskSource.SetCanceled());
  474. res = scheduler.Start(() =>
  475. ((Task)taskSource.Task).ToObservable()
  476. );
  477. });
  478. res.Messages.AssertEqual(
  479. OnError<Unit>(200, ex => ex is TaskCanceledException)
  480. );
  481. }
  482. [TestMethod]
  483. public void TaskToObservable_Void_Canceled_BeforeDispose()
  484. {
  485. var taskScheduler = new TestTaskScheduler();
  486. var taskFactory = new TaskFactory(taskScheduler);
  487. var res = default(ITestableObserver<Unit>);
  488. taskFactory.StartNew(() =>
  489. {
  490. var scheduler = new TestScheduler();
  491. var taskSource = new TaskCompletionSource<int>();
  492. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  493. scheduler.ScheduleAbsolute(300, () => taskSource.SetCanceled());
  494. res = scheduler.Start(() =>
  495. ((Task)taskSource.Task).ToObservable()
  496. );
  497. });
  498. res.Messages.AssertEqual(
  499. OnError<Unit>(300, ex => ex is TaskCanceledException)
  500. );
  501. }
  502. [TestMethod]
  503. public void TaskToObservable_Void_Canceled_AfterDispose()
  504. {
  505. var taskScheduler = new TestTaskScheduler();
  506. var taskFactory = new TaskFactory(taskScheduler);
  507. var res = default(ITestableObserver<Unit>);
  508. taskFactory.StartNew(() =>
  509. {
  510. var scheduler = new TestScheduler();
  511. var taskSource = new TaskCompletionSource<int>();
  512. taskSource.Task.ContinueWith(t => { var e = t.Exception; });
  513. scheduler.ScheduleAbsolute(1100, () => taskSource.SetCanceled());
  514. res = scheduler.Start(() =>
  515. ((Task)taskSource.Task).ToObservable()
  516. );
  517. });
  518. res.Messages.AssertEqual(
  519. );
  520. }
  521. #endregion
  522. #region ToTask
  523. [TestMethod]
  524. public void ObservableToTask_ArgumentChecking()
  525. {
  526. ReactiveAssert.Throws<ArgumentNullException>(() => TaskObservableExtensions.ToTask<int>(null));
  527. ReactiveAssert.Throws<ArgumentNullException>(() => TaskObservableExtensions.ToTask<int>(null, new CancellationToken()));
  528. ReactiveAssert.Throws<ArgumentNullException>(() => TaskObservableExtensions.ToTask<int>(null, new object()));
  529. ReactiveAssert.Throws<ArgumentNullException>(() => TaskObservableExtensions.ToTask<int>(null, new CancellationToken(), new object()));
  530. }
  531. [TestMethod]
  532. public void ObservableToTaskNoValue()
  533. {
  534. var scheduler = new TestScheduler();
  535. var xs = Observable.Empty<int>(scheduler);
  536. var continuation = xs.ToTask();
  537. scheduler.Start();
  538. Assert.IsTrue(continuation.IsFaulted);
  539. Assert.IsTrue(continuation.Exception.InnerExceptions.Count == 1 && continuation.Exception.InnerExceptions[0] is InvalidOperationException);
  540. Assert.AreEqual(1, scheduler.Clock);
  541. }
  542. [TestMethod]
  543. public void ObservableToTaskSingleValue()
  544. {
  545. var scheduler = new TestScheduler();
  546. var xs = Observable.Return(5, scheduler);
  547. var continuation = xs.ToTask();
  548. scheduler.Start();
  549. Assert.IsTrue(continuation.IsCompleted);
  550. Assert.AreEqual(5, continuation.Result);
  551. Assert.AreEqual(1, scheduler.Clock);
  552. }
  553. [TestMethod]
  554. public void ObservableToTaskMultipleValues()
  555. {
  556. var scheduler = new TestScheduler();
  557. var xs = scheduler.CreateColdObservable(
  558. OnNext(100, 1),
  559. OnNext(150, 2),
  560. OnNext(200, 3),
  561. OnCompleted<int>(200)
  562. );
  563. var continuation = xs.ToTask();
  564. scheduler.Start();
  565. Assert.IsTrue(continuation.IsCompleted);
  566. Assert.AreEqual(3, continuation.Result);
  567. xs.Subscriptions.AssertEqual(
  568. Subscribe(0, 200)
  569. );
  570. }
  571. [TestMethod]
  572. public void ObservableToTaskException()
  573. {
  574. var scheduler = new TestScheduler();
  575. var ex = new InvalidOperationException();
  576. var xs = scheduler.CreateColdObservable(
  577. OnNext(100, 1),
  578. OnNext(150, 2),
  579. OnError<int>(200, ex)
  580. );
  581. var continuation = xs.ToTask();
  582. scheduler.Start();
  583. Assert.IsTrue(continuation.IsFaulted);
  584. var ag = continuation.Exception;
  585. Assert.IsNotNull(ag);
  586. Assert.AreEqual(1, ag.InnerExceptions.Count);
  587. Assert.AreEqual(ex, ag.InnerExceptions[0]);
  588. xs.Subscriptions.AssertEqual(
  589. Subscribe(0, 200)
  590. );
  591. }
  592. [TestMethod]
  593. public void ObservableToTaskCancelled()
  594. {
  595. var scheduler = new TestScheduler();
  596. var xs = scheduler.CreateColdObservable(
  597. OnNext(100, 1),
  598. OnNext(150, 2),
  599. OnCompleted<int>(200)
  600. );
  601. var cts = new CancellationTokenSource();
  602. var continuation = xs.ToTask(cts.Token);
  603. scheduler.ScheduleAbsolute(125, cts.Cancel);
  604. scheduler.Start();
  605. Assert.IsTrue(continuation.IsCanceled);
  606. xs.Subscriptions.AssertEqual(
  607. Subscribe(0, 125)
  608. );
  609. }
  610. [TestMethod]
  611. public void ObservableToTaskWithStateSingleValue()
  612. {
  613. var state = "bar";
  614. var scheduler = new TestScheduler();
  615. var xs = Observable.Return(5, scheduler);
  616. var continuation = xs.ToTask(state);
  617. Assert.AreSame(continuation.AsyncState, state);
  618. scheduler.Start();
  619. Assert.IsTrue(continuation.IsCompleted);
  620. Assert.AreEqual(5, continuation.Result);
  621. Assert.AreEqual(1, scheduler.Clock);
  622. }
  623. #endregion
  624. }
  625. }
  626. #endif