TimeoutTest.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Linq;
  6. using System.Reactive.Concurrency;
  7. using System.Reactive.Linq;
  8. using Microsoft.Reactive.Testing;
  9. using Microsoft.VisualStudio.TestTools.UnitTesting;
  10. using Assert = Xunit.Assert;
  11. namespace ReactiveTests.Tests
  12. {
  13. [TestClass]
  14. public class TimeoutTest : ReactiveTest
  15. {
  16. [TestMethod]
  17. public void Timeout_ArgumentChecking()
  18. {
  19. var scheduler = new TestScheduler();
  20. var someObservable = Observable.Empty<int>();
  21. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default(IObservable<int>), TimeSpan.Zero));
  22. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default, TimeSpan.Zero, someObservable));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, TimeSpan.Zero, default(IObservable<int>)));
  24. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default(IObservable<int>), new DateTimeOffset()));
  25. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default, new DateTimeOffset(), someObservable));
  26. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, new DateTimeOffset(), default(IObservable<int>)));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default(IObservable<int>), TimeSpan.Zero, scheduler));
  28. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, TimeSpan.Zero, default(IScheduler)));
  29. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default, TimeSpan.Zero, someObservable, scheduler));
  30. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, TimeSpan.Zero, someObservable, null));
  31. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, TimeSpan.Zero, default, scheduler));
  32. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default(IObservable<int>), new DateTimeOffset(), scheduler));
  33. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, new DateTimeOffset(), default(IScheduler)));
  34. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default, new DateTimeOffset(), someObservable, scheduler));
  35. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, new DateTimeOffset(), someObservable, null));
  36. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, new DateTimeOffset(), default, scheduler));
  37. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.Timeout(someObservable, TimeSpan.FromSeconds(-1)));
  38. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.Timeout(someObservable, TimeSpan.FromSeconds(-1), scheduler));
  39. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.Timeout(someObservable, TimeSpan.FromSeconds(-1), someObservable));
  40. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.Timeout(someObservable, TimeSpan.FromSeconds(-1), someObservable, scheduler));
  41. }
  42. [TestMethod]
  43. public void Timeout_InTime()
  44. {
  45. var scheduler = new TestScheduler();
  46. var xs = scheduler.CreateHotObservable(
  47. OnNext(150, 1),
  48. OnNext(210, 2),
  49. OnNext(230, 3),
  50. OnNext(260, 4),
  51. OnNext(300, 5),
  52. OnNext(350, 6),
  53. OnCompleted<int>(400)
  54. );
  55. var res = scheduler.Start(() =>
  56. xs.Timeout(TimeSpan.FromTicks(500), scheduler)
  57. );
  58. res.Messages.AssertEqual(
  59. OnNext(210, 2),
  60. OnNext(230, 3),
  61. OnNext(260, 4),
  62. OnNext(300, 5),
  63. OnNext(350, 6),
  64. OnCompleted<int>(400)
  65. );
  66. xs.Subscriptions.AssertEqual(
  67. Subscribe(200, 400)
  68. );
  69. }
  70. [TestMethod]
  71. public void Timeout_DateTimeOffset_TimeoutOccurs_WithDefaultException()
  72. {
  73. var scheduler = new TestScheduler();
  74. var xs = scheduler.CreateHotObservable(
  75. OnNext(410, 1)
  76. );
  77. var res = scheduler.Start(() =>
  78. xs.Timeout(new DateTimeOffset(new DateTime(400), TimeSpan.Zero), scheduler)
  79. );
  80. res.Messages.AssertEqual(
  81. OnError<int>(400, ex => ex is TimeoutException)
  82. );
  83. xs.Subscriptions.AssertEqual(
  84. Subscribe(200, 400)
  85. );
  86. }
  87. [TestMethod]
  88. public void Timeout_TimeSpan_TimeoutOccurs_WithDefaultException()
  89. {
  90. var scheduler = new TestScheduler();
  91. var xs = scheduler.CreateHotObservable(
  92. OnNext(410, 1)
  93. );
  94. var res = scheduler.Start(() =>
  95. xs.Timeout(TimeSpan.FromTicks(200), scheduler)
  96. );
  97. res.Messages.AssertEqual(
  98. OnError<int>(400, ex => ex is TimeoutException)
  99. );
  100. xs.Subscriptions.AssertEqual(
  101. Subscribe(200, 400)
  102. );
  103. }
  104. [TestMethod]
  105. public void Timeout_TimeSpan_DefaultScheduler()
  106. {
  107. Assert.True(Observable.Return(1).Timeout(TimeSpan.FromSeconds(10)).ToEnumerable().Single() == 1);
  108. }
  109. [TestMethod]
  110. public void Timeout_TimeSpan_Observable_DefaultScheduler()
  111. {
  112. Assert.True(Observable.Return(1).Timeout(TimeSpan.FromSeconds(10), Observable.Return(2)).ToEnumerable().Single() == 1);
  113. }
  114. [TestMethod]
  115. public void Timeout_DateTimeOffset_DefaultScheduler()
  116. {
  117. Assert.True(Observable.Return(1).Timeout(DateTimeOffset.UtcNow + TimeSpan.FromSeconds(10)).ToEnumerable().Single() == 1);
  118. }
  119. [TestMethod]
  120. public void Timeout_DateTimeOffset_Observable_DefaultScheduler()
  121. {
  122. Assert.True(Observable.Return(1).Timeout(DateTimeOffset.UtcNow + TimeSpan.FromSeconds(10), Observable.Return(2)).ToEnumerable().Single() == 1);
  123. }
  124. [TestMethod]
  125. public void Timeout_TimeoutOccurs_1()
  126. {
  127. var scheduler = new TestScheduler();
  128. var xs = scheduler.CreateHotObservable(
  129. OnNext(70, 1),
  130. OnNext(130, 2),
  131. OnNext(310, 3),
  132. OnNext(400, 4),
  133. OnCompleted<int>(500)
  134. );
  135. var ys = scheduler.CreateColdObservable(
  136. OnNext(50, -1),
  137. OnNext(200, -2),
  138. OnNext(310, -3),
  139. OnCompleted<int>(320)
  140. );
  141. var res = scheduler.Start(() =>
  142. xs.Timeout(TimeSpan.FromTicks(100), ys, scheduler)
  143. );
  144. res.Messages.AssertEqual(
  145. OnNext(350, -1),
  146. OnNext(500, -2),
  147. OnNext(610, -3),
  148. OnCompleted<int>(620)
  149. );
  150. xs.Subscriptions.AssertEqual(
  151. Subscribe(200, 300)
  152. );
  153. ys.Subscriptions.AssertEqual(
  154. Subscribe(300, 620)
  155. );
  156. }
  157. [TestMethod]
  158. public void Timeout_TimeoutOccurs_2()
  159. {
  160. var scheduler = new TestScheduler();
  161. var xs = scheduler.CreateHotObservable(
  162. OnNext(70, 1),
  163. OnNext(130, 2),
  164. OnNext(240, 3),
  165. OnNext(310, 4),
  166. OnNext(430, 5),
  167. OnCompleted<int>(500)
  168. );
  169. var ys = scheduler.CreateColdObservable(
  170. OnNext(50, -1),
  171. OnNext(200, -2),
  172. OnNext(310, -3),
  173. OnCompleted<int>(320)
  174. );
  175. var res = scheduler.Start(() =>
  176. xs.Timeout(TimeSpan.FromTicks(100), ys, scheduler)
  177. );
  178. res.Messages.AssertEqual(
  179. OnNext(240, 3),
  180. OnNext(310, 4),
  181. OnNext(460, -1),
  182. OnNext(610, -2),
  183. OnNext(720, -3),
  184. OnCompleted<int>(730)
  185. );
  186. xs.Subscriptions.AssertEqual(
  187. Subscribe(200, 410)
  188. );
  189. ys.Subscriptions.AssertEqual(
  190. Subscribe(410, 730)
  191. );
  192. }
  193. [TestMethod]
  194. public void Timeout_TimeoutOccurs_Never()
  195. {
  196. var scheduler = new TestScheduler();
  197. var xs = scheduler.CreateHotObservable(
  198. OnNext(70, 1),
  199. OnNext(130, 2),
  200. OnNext(240, 3),
  201. OnNext(310, 4),
  202. OnNext(430, 5),
  203. OnCompleted<int>(500)
  204. );
  205. var ys = scheduler.CreateColdObservable<int>(
  206. );
  207. var res = scheduler.Start(() =>
  208. xs.Timeout(TimeSpan.FromTicks(100), ys, scheduler)
  209. );
  210. res.Messages.AssertEqual(
  211. OnNext(240, 3),
  212. OnNext(310, 4)
  213. );
  214. xs.Subscriptions.AssertEqual(
  215. Subscribe(200, 410)
  216. );
  217. ys.Subscriptions.AssertEqual(
  218. Subscribe(410, 1000)
  219. );
  220. }
  221. [TestMethod]
  222. public void Timeout_TimeoutOccurs_Completed()
  223. {
  224. var scheduler = new TestScheduler();
  225. var xs = scheduler.CreateHotObservable(
  226. OnCompleted<int>(500)
  227. );
  228. var ys = scheduler.CreateColdObservable(
  229. OnNext(100, -1)
  230. );
  231. var res = scheduler.Start(() =>
  232. xs.Timeout(TimeSpan.FromTicks(100), ys, scheduler)
  233. );
  234. res.Messages.AssertEqual(
  235. OnNext(400, -1)
  236. );
  237. xs.Subscriptions.AssertEqual(
  238. Subscribe(200, 300)
  239. );
  240. ys.Subscriptions.AssertEqual(
  241. Subscribe(300, 1000)
  242. );
  243. }
  244. [TestMethod]
  245. public void Timeout_TimeoutOccurs_Error()
  246. {
  247. var scheduler = new TestScheduler();
  248. var xs = scheduler.CreateHotObservable(
  249. OnError<int>(500, new Exception())
  250. );
  251. var ys = scheduler.CreateColdObservable(
  252. OnNext(100, -1)
  253. );
  254. var res = scheduler.Start(() =>
  255. xs.Timeout(TimeSpan.FromTicks(100), ys, scheduler)
  256. );
  257. res.Messages.AssertEqual(
  258. OnNext(400, -1)
  259. );
  260. xs.Subscriptions.AssertEqual(
  261. Subscribe(200, 300)
  262. );
  263. ys.Subscriptions.AssertEqual(
  264. Subscribe(300, 1000)
  265. );
  266. }
  267. [TestMethod]
  268. public void Timeout_TimeoutOccurs_NextIsError()
  269. {
  270. var ex = new Exception();
  271. var scheduler = new TestScheduler();
  272. var xs = scheduler.CreateHotObservable(
  273. OnNext(500, 42)
  274. );
  275. var ys = scheduler.CreateColdObservable(
  276. OnError<int>(100, ex)
  277. );
  278. var res = scheduler.Start(() =>
  279. xs.Timeout(TimeSpan.FromTicks(100), ys, scheduler)
  280. );
  281. res.Messages.AssertEqual(
  282. OnError<int>(400, ex)
  283. );
  284. xs.Subscriptions.AssertEqual(
  285. Subscribe(200, 300)
  286. );
  287. ys.Subscriptions.AssertEqual(
  288. Subscribe(300, 400)
  289. );
  290. }
  291. [TestMethod]
  292. public void Timeout_TimeoutNotOccurs_Completed()
  293. {
  294. var scheduler = new TestScheduler();
  295. var xs = scheduler.CreateHotObservable(
  296. OnCompleted<int>(250)
  297. );
  298. var ys = scheduler.CreateColdObservable(
  299. OnNext(100, -1)
  300. );
  301. var res = scheduler.Start(() =>
  302. xs.Timeout(TimeSpan.FromTicks(100), ys, scheduler)
  303. );
  304. res.Messages.AssertEqual(
  305. OnCompleted<int>(250)
  306. );
  307. xs.Subscriptions.AssertEqual(
  308. Subscribe(200, 250)
  309. );
  310. ys.Subscriptions.AssertEqual(
  311. );
  312. }
  313. [TestMethod]
  314. public void Timeout_TimeoutNotOccurs_Error()
  315. {
  316. var scheduler = new TestScheduler();
  317. var ex = new Exception();
  318. var xs = scheduler.CreateHotObservable(
  319. OnError<int>(250, ex)
  320. );
  321. var ys = scheduler.CreateColdObservable(
  322. OnNext(100, -1)
  323. );
  324. var res = scheduler.Start(() =>
  325. xs.Timeout(TimeSpan.FromTicks(100), ys, scheduler)
  326. );
  327. res.Messages.AssertEqual(
  328. OnError<int>(250, ex)
  329. );
  330. xs.Subscriptions.AssertEqual(
  331. Subscribe(200, 250)
  332. );
  333. ys.Subscriptions.AssertEqual(
  334. );
  335. }
  336. [TestMethod]
  337. public void Timeout_TimeoutDoesNotOccur()
  338. {
  339. var scheduler = new TestScheduler();
  340. var xs = scheduler.CreateHotObservable(
  341. OnNext(70, 1),
  342. OnNext(130, 2),
  343. OnNext(240, 3),
  344. OnNext(320, 4),
  345. OnNext(410, 5),
  346. OnCompleted<int>(500)
  347. );
  348. var ys = scheduler.CreateColdObservable(
  349. OnNext(50, -1),
  350. OnNext(200, -2),
  351. OnNext(310, -3),
  352. OnCompleted<int>(320)
  353. );
  354. var res = scheduler.Start(() =>
  355. xs.Timeout(TimeSpan.FromTicks(100), ys, scheduler)
  356. );
  357. res.Messages.AssertEqual(
  358. OnNext(240, 3),
  359. OnNext(320, 4),
  360. OnNext(410, 5),
  361. OnCompleted<int>(500)
  362. );
  363. xs.Subscriptions.AssertEqual(
  364. Subscribe(200, 500)
  365. );
  366. ys.Subscriptions.AssertEqual(
  367. );
  368. }
  369. [TestMethod]
  370. public void Timeout_DateTimeOffset_TimeoutOccurs()
  371. {
  372. var scheduler = new TestScheduler();
  373. var xs = scheduler.CreateHotObservable(
  374. OnNext(410, 1)
  375. );
  376. var ys = scheduler.CreateColdObservable(
  377. OnNext(100, -1)
  378. );
  379. var res = scheduler.Start(() =>
  380. xs.Timeout(new DateTimeOffset(new DateTime(400), TimeSpan.Zero), ys, scheduler)
  381. );
  382. res.Messages.AssertEqual(
  383. OnNext(500, -1)
  384. );
  385. xs.Subscriptions.AssertEqual(
  386. Subscribe(200, 400)
  387. );
  388. ys.Subscriptions.AssertEqual(
  389. Subscribe(400, 1000)
  390. );
  391. }
  392. [TestMethod]
  393. public void Timeout_DateTimeOffset_TimeoutDoesNotOccur_Completed()
  394. {
  395. var scheduler = new TestScheduler();
  396. var xs = scheduler.CreateHotObservable(
  397. OnNext(310, 1),
  398. OnCompleted<int>(390)
  399. );
  400. var ys = scheduler.CreateColdObservable(
  401. OnNext(100, -1)
  402. );
  403. var res = scheduler.Start(() =>
  404. xs.Timeout(new DateTimeOffset(new DateTime(400), TimeSpan.Zero), ys, scheduler)
  405. );
  406. res.Messages.AssertEqual(
  407. OnNext(310, 1),
  408. OnCompleted<int>(390)
  409. );
  410. xs.Subscriptions.AssertEqual(
  411. Subscribe(200, 390)
  412. );
  413. ys.Subscriptions.AssertEqual(
  414. );
  415. }
  416. [TestMethod]
  417. public void Timeout_DateTimeOffset_TimeoutDoesNotOccur_Error()
  418. {
  419. var scheduler = new TestScheduler();
  420. var ex = new Exception();
  421. var xs = scheduler.CreateHotObservable(
  422. OnNext(310, 1),
  423. OnError<int>(390, ex)
  424. );
  425. var ys = scheduler.CreateColdObservable(
  426. OnNext(100, -1)
  427. );
  428. var res = scheduler.Start(() =>
  429. xs.Timeout(new DateTimeOffset(new DateTime(400), TimeSpan.Zero), ys, scheduler)
  430. );
  431. res.Messages.AssertEqual(
  432. OnNext(310, 1),
  433. OnError<int>(390, ex)
  434. );
  435. xs.Subscriptions.AssertEqual(
  436. Subscribe(200, 390)
  437. );
  438. ys.Subscriptions.AssertEqual(
  439. );
  440. }
  441. [TestMethod]
  442. public void Timeout_DateTimeOffset_TimeoutOccur_2()
  443. {
  444. var scheduler = new TestScheduler();
  445. var xs = scheduler.CreateHotObservable(
  446. OnNext(310, 1),
  447. OnNext(350, 2),
  448. OnNext(420, 3),
  449. OnCompleted<int>(450)
  450. );
  451. var ys = scheduler.CreateColdObservable(
  452. OnNext(100, -1)
  453. );
  454. var res = scheduler.Start(() =>
  455. xs.Timeout(new DateTimeOffset(new DateTime(400), TimeSpan.Zero), ys, scheduler)
  456. );
  457. res.Messages.AssertEqual(
  458. OnNext(310, 1),
  459. OnNext(350, 2),
  460. OnNext(500, -1)
  461. );
  462. xs.Subscriptions.AssertEqual(
  463. Subscribe(200, 400)
  464. );
  465. ys.Subscriptions.AssertEqual(
  466. Subscribe(400, 1000)
  467. );
  468. }
  469. [TestMethod]
  470. public void Timeout_DateTimeOffset_TimeoutOccur_3()
  471. {
  472. var scheduler = new TestScheduler();
  473. var xs = scheduler.CreateHotObservable(
  474. OnNext(310, 1),
  475. OnNext(350, 2),
  476. OnNext(420, 3),
  477. OnCompleted<int>(450)
  478. );
  479. var ys = scheduler.CreateColdObservable<int>(
  480. );
  481. var res = scheduler.Start(() =>
  482. xs.Timeout(new DateTimeOffset(new DateTime(400), TimeSpan.Zero), ys, scheduler)
  483. );
  484. res.Messages.AssertEqual(
  485. OnNext(310, 1),
  486. OnNext(350, 2)
  487. );
  488. xs.Subscriptions.AssertEqual(
  489. Subscribe(200, 400)
  490. );
  491. ys.Subscriptions.AssertEqual(
  492. Subscribe(400, 1000)
  493. );
  494. }
  495. [TestMethod]
  496. public void Timeout_Duration_ArgumentChecking()
  497. {
  498. var someObservable = Observable.Empty<int>();
  499. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default, someObservable, x => someObservable, someObservable));
  500. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, default, x => someObservable, someObservable));
  501. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, someObservable, default, someObservable));
  502. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, someObservable, x => someObservable, default));
  503. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default(IObservable<int>), someObservable, x => someObservable));
  504. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, default, x => someObservable));
  505. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, someObservable, default));
  506. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default, x => someObservable, someObservable));
  507. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, default(Func<int, IObservable<int>>), someObservable));
  508. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, x => someObservable, default));
  509. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(default(IObservable<int>), x => someObservable));
  510. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Timeout(someObservable, default(Func<int, IObservable<int>>)));
  511. }
  512. [TestMethod]
  513. public void Timeout_Duration_Simple_Never()
  514. {
  515. var scheduler = new TestScheduler();
  516. var xs = scheduler.CreateHotObservable(
  517. OnNext(310, 1),
  518. OnNext(350, 2),
  519. OnNext(420, 3),
  520. OnCompleted<int>(450)
  521. );
  522. var ys = scheduler.CreateColdObservable<int>(
  523. );
  524. var res = scheduler.Start(() =>
  525. xs.Timeout(ys, _ => ys)
  526. );
  527. res.Messages.AssertEqual(
  528. OnNext(310, 1),
  529. OnNext(350, 2),
  530. OnNext(420, 3),
  531. OnCompleted<int>(450)
  532. );
  533. xs.Subscriptions.AssertEqual(
  534. Subscribe(200, 450)
  535. );
  536. ys.Subscriptions.AssertEqual(
  537. Subscribe(200, 310),
  538. Subscribe(310, 350),
  539. Subscribe(350, 420),
  540. Subscribe(420, 450)
  541. );
  542. }
  543. [TestMethod]
  544. public void Timeout_Duration_Simple_TimeoutFirst()
  545. {
  546. var scheduler = new TestScheduler();
  547. var xs = scheduler.CreateHotObservable(
  548. OnNext(310, 1),
  549. OnNext(350, 2),
  550. OnNext(420, 3),
  551. OnCompleted<int>(450)
  552. );
  553. var ys = scheduler.CreateColdObservable(
  554. OnNext(100, "Boo!")
  555. );
  556. var zs = scheduler.CreateColdObservable<string>(
  557. );
  558. var res = scheduler.Start(() =>
  559. xs.Timeout(ys, _ => zs)
  560. );
  561. res.Messages.AssertEqual(
  562. OnError<int>(300, ex => ex is TimeoutException)
  563. );
  564. xs.Subscriptions.AssertEqual(
  565. Subscribe(200, 300)
  566. );
  567. ys.Subscriptions.AssertEqual(
  568. Subscribe(200, 300)
  569. );
  570. zs.Subscriptions.AssertEqual(
  571. );
  572. }
  573. [TestMethod]
  574. public void Timeout_Duration_Simple_TimeoutFirst_Other()
  575. {
  576. var scheduler = new TestScheduler();
  577. var xs = scheduler.CreateHotObservable(
  578. OnNext(310, 1),
  579. OnNext(350, 2),
  580. OnNext(420, 3),
  581. OnCompleted<int>(450)
  582. );
  583. var ys = scheduler.CreateColdObservable(
  584. OnNext(100, "Boo!")
  585. );
  586. var zs = scheduler.CreateColdObservable<string>(
  587. );
  588. var ts = scheduler.CreateColdObservable(
  589. OnNext(50, 42),
  590. OnCompleted<int>(70)
  591. );
  592. var res = scheduler.Start(() =>
  593. xs.Timeout(ys, _ => zs, ts)
  594. );
  595. res.Messages.AssertEqual(
  596. OnNext(350, 42),
  597. OnCompleted<int>(370)
  598. );
  599. xs.Subscriptions.AssertEqual(
  600. Subscribe(200, 300)
  601. );
  602. ys.Subscriptions.AssertEqual(
  603. Subscribe(200, 300)
  604. );
  605. zs.Subscriptions.AssertEqual(
  606. );
  607. ts.Subscriptions.AssertEqual(
  608. Subscribe(300, 370)
  609. );
  610. }
  611. [TestMethod]
  612. public void Timeout_Duration_Simple_TimeoutLater()
  613. {
  614. var scheduler = new TestScheduler();
  615. var xs = scheduler.CreateHotObservable(
  616. OnNext(310, 1),
  617. OnNext(350, 2),
  618. OnNext(420, 3),
  619. OnCompleted<int>(450)
  620. );
  621. var ys = scheduler.CreateColdObservable<string>(
  622. );
  623. var zs = scheduler.CreateColdObservable(
  624. OnNext(50, "Boo!")
  625. );
  626. var res = scheduler.Start(() =>
  627. xs.Timeout(ys, _ => zs)
  628. );
  629. res.Messages.AssertEqual(
  630. OnNext(310, 1),
  631. OnNext(350, 2),
  632. OnError<int>(400, ex => ex is TimeoutException)
  633. );
  634. xs.Subscriptions.AssertEqual(
  635. Subscribe(200, 400)
  636. );
  637. ys.Subscriptions.AssertEqual(
  638. Subscribe(200, 310)
  639. );
  640. zs.Subscriptions.AssertEqual(
  641. Subscribe(310, 350),
  642. Subscribe(350, 400)
  643. );
  644. }
  645. [TestMethod]
  646. public void Timeout_Duration_Simple_TimeoutLater_Other()
  647. {
  648. var scheduler = new TestScheduler();
  649. var xs = scheduler.CreateHotObservable(
  650. OnNext(310, 1),
  651. OnNext(350, 2),
  652. OnNext(420, 3),
  653. OnCompleted<int>(450)
  654. );
  655. var ys = scheduler.CreateColdObservable<string>(
  656. );
  657. var zs = scheduler.CreateColdObservable(
  658. OnNext(50, "Boo!")
  659. );
  660. var ts = scheduler.CreateColdObservable(
  661. OnNext(50, 42),
  662. OnCompleted<int>(70)
  663. );
  664. var res = scheduler.Start(() =>
  665. xs.Timeout(ys, _ => zs, ts)
  666. );
  667. res.Messages.AssertEqual(
  668. OnNext(310, 1),
  669. OnNext(350, 2),
  670. OnNext(450, 42),
  671. OnCompleted<int>(470)
  672. );
  673. xs.Subscriptions.AssertEqual(
  674. Subscribe(200, 400)
  675. );
  676. ys.Subscriptions.AssertEqual(
  677. Subscribe(200, 310)
  678. );
  679. zs.Subscriptions.AssertEqual(
  680. Subscribe(310, 350),
  681. Subscribe(350, 400)
  682. );
  683. ts.Subscriptions.AssertEqual(
  684. Subscribe(400, 470)
  685. );
  686. }
  687. [TestMethod]
  688. public void Timeout_Duration_Simple_TimeoutLater_NoFirst()
  689. {
  690. var scheduler = new TestScheduler();
  691. var xs = scheduler.CreateHotObservable(
  692. OnNext(310, 1),
  693. OnNext(350, 2),
  694. OnNext(420, 3),
  695. OnCompleted<int>(450)
  696. );
  697. var zs = scheduler.CreateColdObservable(
  698. OnNext(50, "Boo!")
  699. );
  700. var res = scheduler.Start(() =>
  701. xs.Timeout(_ => zs)
  702. );
  703. res.Messages.AssertEqual(
  704. OnNext(310, 1),
  705. OnNext(350, 2),
  706. OnError<int>(400, ex => ex is TimeoutException)
  707. );
  708. xs.Subscriptions.AssertEqual(
  709. Subscribe(200, 400)
  710. );
  711. zs.Subscriptions.AssertEqual(
  712. Subscribe(310, 350),
  713. Subscribe(350, 400)
  714. );
  715. }
  716. [TestMethod]
  717. public void Timeout_Duration_Simple_TimeoutLater_Other_NoFirst()
  718. {
  719. var scheduler = new TestScheduler();
  720. var xs = scheduler.CreateHotObservable(
  721. OnNext(310, 1),
  722. OnNext(350, 2),
  723. OnNext(420, 3),
  724. OnCompleted<int>(450)
  725. );
  726. var zs = scheduler.CreateColdObservable(
  727. OnNext(50, "Boo!")
  728. );
  729. var ts = scheduler.CreateColdObservable(
  730. OnNext(50, 42),
  731. OnCompleted<int>(70)
  732. );
  733. var res = scheduler.Start(() =>
  734. xs.Timeout(_ => zs, ts)
  735. );
  736. res.Messages.AssertEqual(
  737. OnNext(310, 1),
  738. OnNext(350, 2),
  739. OnNext(450, 42),
  740. OnCompleted<int>(470)
  741. );
  742. xs.Subscriptions.AssertEqual(
  743. Subscribe(200, 400)
  744. );
  745. zs.Subscriptions.AssertEqual(
  746. Subscribe(310, 350),
  747. Subscribe(350, 400)
  748. );
  749. ts.Subscriptions.AssertEqual(
  750. Subscribe(400, 470)
  751. );
  752. }
  753. [TestMethod]
  754. public void Timeout_Duration_Simple_TimeoutByCompletion()
  755. {
  756. var scheduler = new TestScheduler();
  757. var xs = scheduler.CreateHotObservable(
  758. OnNext(310, 1),
  759. OnNext(350, 2),
  760. OnNext(420, 3),
  761. OnCompleted<int>(450)
  762. );
  763. var ys = scheduler.CreateColdObservable<string>(
  764. );
  765. var zs = scheduler.CreateColdObservable(
  766. OnCompleted<string>(50)
  767. );
  768. var res = scheduler.Start(() =>
  769. xs.Timeout(ys, _ => zs)
  770. );
  771. res.Messages.AssertEqual(
  772. OnNext(310, 1),
  773. OnNext(350, 2),
  774. OnError<int>(400, ex => ex is TimeoutException)
  775. );
  776. xs.Subscriptions.AssertEqual(
  777. Subscribe(200, 400)
  778. );
  779. ys.Subscriptions.AssertEqual(
  780. Subscribe(200, 310)
  781. );
  782. zs.Subscriptions.AssertEqual(
  783. Subscribe(310, 350),
  784. Subscribe(350, 400)
  785. );
  786. }
  787. [TestMethod]
  788. public void Timeout_Duration_Simple_SelectorThrows()
  789. {
  790. var scheduler = new TestScheduler();
  791. var xs = scheduler.CreateHotObservable(
  792. OnNext(310, 1),
  793. OnNext(350, 2),
  794. OnNext(420, 3),
  795. OnCompleted<int>(450)
  796. );
  797. var ys = scheduler.CreateColdObservable<string>(
  798. );
  799. var zs = scheduler.CreateColdObservable<string>(
  800. );
  801. var ex = new Exception();
  802. var res = scheduler.Start(() =>
  803. xs.Timeout(ys, x =>
  804. {
  805. if (x < 3)
  806. {
  807. return zs;
  808. }
  809. else
  810. {
  811. throw ex;
  812. }
  813. })
  814. );
  815. res.Messages.AssertEqual(
  816. OnNext(310, 1),
  817. OnNext(350, 2),
  818. OnNext(420, 3),
  819. OnError<int>(420, ex)
  820. );
  821. xs.Subscriptions.AssertEqual(
  822. Subscribe(200, 420)
  823. );
  824. ys.Subscriptions.AssertEqual(
  825. Subscribe(200, 310)
  826. );
  827. zs.Subscriptions.AssertEqual(
  828. Subscribe(310, 350),
  829. Subscribe(350, 420)
  830. );
  831. }
  832. [TestMethod]
  833. public void Timeout_Duration_Simple_InnerThrows()
  834. {
  835. var ex = new Exception();
  836. var scheduler = new TestScheduler();
  837. var xs = scheduler.CreateHotObservable(
  838. OnNext(310, 1),
  839. OnNext(350, 2),
  840. OnNext(420, 3),
  841. OnCompleted<int>(450)
  842. );
  843. var ys = scheduler.CreateColdObservable<string>(
  844. );
  845. var zs = scheduler.CreateColdObservable(
  846. OnError<string>(50, ex)
  847. );
  848. var res = scheduler.Start(() =>
  849. xs.Timeout(ys, x => zs)
  850. );
  851. res.Messages.AssertEqual(
  852. OnNext(310, 1),
  853. OnNext(350, 2),
  854. OnError<int>(400, ex)
  855. );
  856. xs.Subscriptions.AssertEqual(
  857. Subscribe(200, 400)
  858. );
  859. ys.Subscriptions.AssertEqual(
  860. Subscribe(200, 310)
  861. );
  862. zs.Subscriptions.AssertEqual(
  863. Subscribe(310, 350),
  864. Subscribe(350, 400)
  865. );
  866. }
  867. [TestMethod]
  868. public void Timeout_Duration_Simple_FirstThrows()
  869. {
  870. var ex = new Exception();
  871. var scheduler = new TestScheduler();
  872. var xs = scheduler.CreateHotObservable(
  873. OnNext(310, 1),
  874. OnNext(350, 2),
  875. OnNext(420, 3),
  876. OnCompleted<int>(450)
  877. );
  878. var ys = scheduler.CreateColdObservable(
  879. OnError<string>(50, ex)
  880. );
  881. var zs = scheduler.CreateColdObservable<string>(
  882. );
  883. var res = scheduler.Start(() =>
  884. xs.Timeout(ys, x => zs)
  885. );
  886. res.Messages.AssertEqual(
  887. OnError<int>(250, ex)
  888. );
  889. xs.Subscriptions.AssertEqual(
  890. Subscribe(200, 250)
  891. );
  892. ys.Subscriptions.AssertEqual(
  893. Subscribe(200, 250)
  894. );
  895. zs.Subscriptions.AssertEqual(
  896. );
  897. }
  898. [TestMethod]
  899. public void Timeout_Duration_Simple_SourceThrows()
  900. {
  901. var ex = new Exception();
  902. var scheduler = new TestScheduler();
  903. var xs = scheduler.CreateHotObservable(
  904. OnNext(310, 1),
  905. OnNext(350, 2),
  906. OnNext(420, 3),
  907. OnError<int>(450, ex)
  908. );
  909. var ys = scheduler.CreateColdObservable<string>(
  910. );
  911. var zs = scheduler.CreateColdObservable<string>(
  912. );
  913. var res = scheduler.Start(() =>
  914. xs.Timeout(ys, x => zs)
  915. );
  916. res.Messages.AssertEqual(
  917. OnNext(310, 1),
  918. OnNext(350, 2),
  919. OnNext(420, 3),
  920. OnError<int>(450, ex)
  921. );
  922. xs.Subscriptions.AssertEqual(
  923. Subscribe(200, 450)
  924. );
  925. ys.Subscriptions.AssertEqual(
  926. Subscribe(200, 310)
  927. );
  928. zs.Subscriptions.AssertEqual(
  929. Subscribe(310, 350),
  930. Subscribe(350, 420),
  931. Subscribe(420, 450)
  932. );
  933. }
  934. }
  935. }