TimeoutTest.cs 34 KB

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