AverageTest.cs 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654
  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 AverageTest : ReactiveTest
  13. {
  14. [Fact]
  15. public void Average_ArgumentChecking()
  16. {
  17. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<int>)));
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<double>)));
  19. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<float>)));
  20. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<decimal>)));
  21. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<long>)));
  22. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<int?>)));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<double?>)));
  24. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<float?>)));
  25. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<decimal?>)));
  26. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<long?>)));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default));
  28. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(double)));
  29. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(float)));
  30. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(decimal)));
  31. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(long)));
  32. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(int?)));
  33. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(double?)));
  34. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(float?)));
  35. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(decimal?)));
  36. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(long?)));
  37. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default));
  38. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, double>)));
  39. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, float>)));
  40. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, decimal>)));
  41. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, long>)));
  42. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, int?>)));
  43. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, double?>)));
  44. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, float?>)));
  45. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, decimal?>)));
  46. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, long?>)));
  47. }
  48. [Fact]
  49. public void Average_Int32_Empty()
  50. {
  51. var scheduler = new TestScheduler();
  52. var xs = scheduler.CreateHotObservable(
  53. OnNext(150, 1),
  54. OnCompleted<int>(250)
  55. );
  56. var res = scheduler.Start(() =>
  57. xs.Average()
  58. );
  59. res.Messages.AssertEqual(
  60. OnError<double>(250, e => e is InvalidOperationException)
  61. );
  62. xs.Subscriptions.AssertEqual(
  63. Subscribe(200, 250)
  64. );
  65. }
  66. [Fact]
  67. public void Average_Int32_Return()
  68. {
  69. var scheduler = new TestScheduler();
  70. var xs = scheduler.CreateHotObservable(
  71. OnNext(150, 1),
  72. OnNext(210, 2),
  73. OnCompleted<int>(250)
  74. );
  75. var res = scheduler.Start(() =>
  76. xs.Average()
  77. );
  78. res.Messages.AssertEqual(
  79. OnNext(250, 2.0),
  80. OnCompleted<double>(250)
  81. );
  82. xs.Subscriptions.AssertEqual(
  83. Subscribe(200, 250)
  84. );
  85. }
  86. [Fact]
  87. public void Average_Int32_Some()
  88. {
  89. var scheduler = new TestScheduler();
  90. var xs = scheduler.CreateHotObservable(
  91. OnNext(150, 1),
  92. OnNext(210, 3),
  93. OnNext(220, 4),
  94. OnNext(230, 2),
  95. OnCompleted<int>(250)
  96. );
  97. var res = scheduler.Start(() =>
  98. xs.Average()
  99. );
  100. res.Messages.AssertEqual(
  101. OnNext(250, 3.0),
  102. OnCompleted<double>(250)
  103. );
  104. xs.Subscriptions.AssertEqual(
  105. Subscribe(200, 250)
  106. );
  107. }
  108. [Fact]
  109. public void Average_Int32_Throw()
  110. {
  111. var ex = new Exception();
  112. var scheduler = new TestScheduler();
  113. var xs = scheduler.CreateHotObservable(
  114. OnNext(150, 1),
  115. OnError<int>(210, ex)
  116. );
  117. var res = scheduler.Start(() =>
  118. xs.Average()
  119. );
  120. res.Messages.AssertEqual(
  121. OnError<double>(210, ex)
  122. );
  123. xs.Subscriptions.AssertEqual(
  124. Subscribe(200, 210)
  125. );
  126. }
  127. [Fact]
  128. public void Average_Int32_Never()
  129. {
  130. var ex = new Exception();
  131. var scheduler = new TestScheduler();
  132. var xs = scheduler.CreateHotObservable(
  133. OnNext(150, 1)
  134. );
  135. var res = scheduler.Start(() =>
  136. xs.Average()
  137. );
  138. res.Messages.AssertEqual(
  139. );
  140. xs.Subscriptions.AssertEqual(
  141. Subscribe(200, 1000)
  142. );
  143. }
  144. [Fact]
  145. public void Average_Int64_Empty()
  146. {
  147. var scheduler = new TestScheduler();
  148. var xs = scheduler.CreateHotObservable(
  149. OnNext(150, 1L),
  150. OnCompleted<long>(250)
  151. );
  152. var res = scheduler.Start(() =>
  153. xs.Average()
  154. );
  155. res.Messages.AssertEqual(
  156. OnError<double>(250, e => e is InvalidOperationException)
  157. );
  158. xs.Subscriptions.AssertEqual(
  159. Subscribe(200, 250)
  160. );
  161. }
  162. [Fact]
  163. public void Average_Int64_Return()
  164. {
  165. var scheduler = new TestScheduler();
  166. var xs = scheduler.CreateHotObservable(
  167. OnNext(150, 1L),
  168. OnNext(210, 2L),
  169. OnCompleted<long>(250)
  170. );
  171. var res = scheduler.Start(() =>
  172. xs.Average()
  173. );
  174. res.Messages.AssertEqual(
  175. OnNext(250, 2.0),
  176. OnCompleted<double>(250)
  177. );
  178. xs.Subscriptions.AssertEqual(
  179. Subscribe(200, 250)
  180. );
  181. }
  182. [Fact]
  183. public void Average_Int64_Some()
  184. {
  185. var scheduler = new TestScheduler();
  186. var xs = scheduler.CreateHotObservable(
  187. OnNext(150, 1L),
  188. OnNext(210, 3L),
  189. OnNext(220, 4L),
  190. OnNext(230, 2L),
  191. OnCompleted<long>(250)
  192. );
  193. var res = scheduler.Start(() =>
  194. xs.Average()
  195. );
  196. res.Messages.AssertEqual(
  197. OnNext(250, 3.0),
  198. OnCompleted<double>(250)
  199. );
  200. xs.Subscriptions.AssertEqual(
  201. Subscribe(200, 250)
  202. );
  203. }
  204. [Fact]
  205. public void Average_Int64_Throw()
  206. {
  207. var ex = new Exception();
  208. var scheduler = new TestScheduler();
  209. var xs = scheduler.CreateHotObservable(
  210. OnNext(150, 1L),
  211. OnError<long>(210, ex)
  212. );
  213. var res = scheduler.Start(() =>
  214. xs.Average()
  215. );
  216. res.Messages.AssertEqual(
  217. OnError<double>(210, ex)
  218. );
  219. xs.Subscriptions.AssertEqual(
  220. Subscribe(200, 210)
  221. );
  222. }
  223. [Fact]
  224. public void Average_Int64_Never()
  225. {
  226. var ex = new Exception();
  227. var scheduler = new TestScheduler();
  228. var xs = scheduler.CreateHotObservable(
  229. OnNext(150, 1L)
  230. );
  231. var res = scheduler.Start(() =>
  232. xs.Average()
  233. );
  234. res.Messages.AssertEqual(
  235. );
  236. xs.Subscriptions.AssertEqual(
  237. Subscribe(200, 1000)
  238. );
  239. }
  240. [Fact]
  241. public void Average_Double_Empty()
  242. {
  243. var scheduler = new TestScheduler();
  244. var xs = scheduler.CreateHotObservable(
  245. OnNext(150, 1.0),
  246. OnCompleted<double>(250)
  247. );
  248. var res = scheduler.Start(() =>
  249. xs.Average()
  250. );
  251. res.Messages.AssertEqual(
  252. OnError<double>(250, e => e is InvalidOperationException)
  253. );
  254. xs.Subscriptions.AssertEqual(
  255. Subscribe(200, 250)
  256. );
  257. }
  258. [Fact]
  259. public void Average_Double_Return()
  260. {
  261. var scheduler = new TestScheduler();
  262. var xs = scheduler.CreateHotObservable(
  263. OnNext(150, 1.0),
  264. OnNext(210, 2.0),
  265. OnCompleted<double>(250)
  266. );
  267. var res = scheduler.Start(() =>
  268. xs.Average()
  269. );
  270. res.Messages.AssertEqual(
  271. OnNext(250, 2.0),
  272. OnCompleted<double>(250)
  273. );
  274. xs.Subscriptions.AssertEqual(
  275. Subscribe(200, 250)
  276. );
  277. }
  278. [Fact]
  279. public void Average_Double_Some()
  280. {
  281. var scheduler = new TestScheduler();
  282. var xs = scheduler.CreateHotObservable(
  283. OnNext(150, 1.0),
  284. OnNext(210, 3.0),
  285. OnNext(220, 4.0),
  286. OnNext(230, 2.0),
  287. OnCompleted<double>(250)
  288. );
  289. var res = scheduler.Start(() =>
  290. xs.Average()
  291. );
  292. res.Messages.AssertEqual(
  293. OnNext(250, 3.0),
  294. OnCompleted<double>(250)
  295. );
  296. xs.Subscriptions.AssertEqual(
  297. Subscribe(200, 250)
  298. );
  299. }
  300. [Fact]
  301. public void Average_Double_Throw()
  302. {
  303. var ex = new Exception();
  304. var scheduler = new TestScheduler();
  305. var xs = scheduler.CreateHotObservable(
  306. OnNext(150, 1.0),
  307. OnError<double>(210, ex)
  308. );
  309. var res = scheduler.Start(() =>
  310. xs.Average()
  311. );
  312. res.Messages.AssertEqual(
  313. OnError<double>(210, ex)
  314. );
  315. xs.Subscriptions.AssertEqual(
  316. Subscribe(200, 210)
  317. );
  318. }
  319. [Fact]
  320. public void Average_Double_Never()
  321. {
  322. var ex = new Exception();
  323. var scheduler = new TestScheduler();
  324. var xs = scheduler.CreateHotObservable(
  325. OnNext(150, 1.0)
  326. );
  327. var res = scheduler.Start(() =>
  328. xs.Average()
  329. );
  330. res.Messages.AssertEqual(
  331. );
  332. xs.Subscriptions.AssertEqual(
  333. Subscribe(200, 1000)
  334. );
  335. }
  336. [Fact]
  337. public void Average_Float_Empty()
  338. {
  339. var scheduler = new TestScheduler();
  340. var xs = scheduler.CreateHotObservable(
  341. OnNext(150, 1f),
  342. OnCompleted<float>(250)
  343. );
  344. var res = scheduler.Start(() =>
  345. xs.Average()
  346. );
  347. res.Messages.AssertEqual(
  348. OnError<float>(250, e => e is InvalidOperationException)
  349. );
  350. xs.Subscriptions.AssertEqual(
  351. Subscribe(200, 250)
  352. );
  353. }
  354. [Fact]
  355. public void Average_Float_Return()
  356. {
  357. var scheduler = new TestScheduler();
  358. var xs = scheduler.CreateHotObservable(
  359. OnNext(150, 1f),
  360. OnNext(210, 2f),
  361. OnCompleted<float>(250)
  362. );
  363. var res = scheduler.Start(() =>
  364. xs.Average()
  365. );
  366. res.Messages.AssertEqual(
  367. OnNext(250, 2f),
  368. OnCompleted<float>(250)
  369. );
  370. xs.Subscriptions.AssertEqual(
  371. Subscribe(200, 250)
  372. );
  373. }
  374. [Fact]
  375. public void Average_Float_Some()
  376. {
  377. var scheduler = new TestScheduler();
  378. var xs = scheduler.CreateHotObservable(
  379. OnNext(150, 1f),
  380. OnNext(210, 3f),
  381. OnNext(220, 4f),
  382. OnNext(230, 2f),
  383. OnCompleted<float>(250)
  384. );
  385. var res = scheduler.Start(() =>
  386. xs.Average()
  387. );
  388. res.Messages.AssertEqual(
  389. OnNext(250, 3f),
  390. OnCompleted<float>(250)
  391. );
  392. xs.Subscriptions.AssertEqual(
  393. Subscribe(200, 250)
  394. );
  395. }
  396. [Fact]
  397. public void Average_Float_Throw()
  398. {
  399. var ex = new Exception();
  400. var scheduler = new TestScheduler();
  401. var xs = scheduler.CreateHotObservable(
  402. OnNext(150, 1f),
  403. OnError<float>(210, ex)
  404. );
  405. var res = scheduler.Start(() =>
  406. xs.Average()
  407. );
  408. res.Messages.AssertEqual(
  409. OnError<float>(210, ex)
  410. );
  411. xs.Subscriptions.AssertEqual(
  412. Subscribe(200, 210)
  413. );
  414. }
  415. [Fact]
  416. public void Average_Float_Never()
  417. {
  418. var ex = new Exception();
  419. var scheduler = new TestScheduler();
  420. var xs = scheduler.CreateHotObservable(
  421. OnNext(150, 1f)
  422. );
  423. var res = scheduler.Start(() =>
  424. xs.Average()
  425. );
  426. res.Messages.AssertEqual(
  427. );
  428. xs.Subscriptions.AssertEqual(
  429. Subscribe(200, 1000)
  430. );
  431. }
  432. [Fact]
  433. public void Average_Decimal_Empty()
  434. {
  435. var scheduler = new TestScheduler();
  436. var xs = scheduler.CreateHotObservable(
  437. OnNext(150, 1m),
  438. OnCompleted<decimal>(250)
  439. );
  440. var res = scheduler.Start(() =>
  441. xs.Average()
  442. );
  443. res.Messages.AssertEqual(
  444. OnError<decimal>(250, e => e is InvalidOperationException)
  445. );
  446. xs.Subscriptions.AssertEqual(
  447. Subscribe(200, 250)
  448. );
  449. }
  450. [Fact]
  451. public void Average_Decimal_Return()
  452. {
  453. var scheduler = new TestScheduler();
  454. var xs = scheduler.CreateHotObservable(
  455. OnNext(150, 1m),
  456. OnNext(210, 2m),
  457. OnCompleted<decimal>(250)
  458. );
  459. var res = scheduler.Start(() =>
  460. xs.Average()
  461. );
  462. res.Messages.AssertEqual(
  463. OnNext(250, 2m),
  464. OnCompleted<decimal>(250)
  465. );
  466. xs.Subscriptions.AssertEqual(
  467. Subscribe(200, 250)
  468. );
  469. }
  470. [Fact]
  471. public void Average_Decimal_Some()
  472. {
  473. var scheduler = new TestScheduler();
  474. var xs = scheduler.CreateHotObservable(
  475. OnNext(150, 1m),
  476. OnNext(210, 3m),
  477. OnNext(220, 4m),
  478. OnNext(230, 2m),
  479. OnCompleted<decimal>(250)
  480. );
  481. var res = scheduler.Start(() =>
  482. xs.Average()
  483. );
  484. res.Messages.AssertEqual(
  485. OnNext(250, 3m),
  486. OnCompleted<decimal>(250)
  487. );
  488. xs.Subscriptions.AssertEqual(
  489. Subscribe(200, 250)
  490. );
  491. }
  492. [Fact]
  493. public void Average_Decimal_Throw()
  494. {
  495. var ex = new Exception();
  496. var scheduler = new TestScheduler();
  497. var xs = scheduler.CreateHotObservable(
  498. OnNext(150, 1m),
  499. OnError<decimal>(210, ex)
  500. );
  501. var res = scheduler.Start(() =>
  502. xs.Average()
  503. );
  504. res.Messages.AssertEqual(
  505. OnError<decimal>(210, ex)
  506. );
  507. xs.Subscriptions.AssertEqual(
  508. Subscribe(200, 210)
  509. );
  510. }
  511. [Fact]
  512. public void Average_Decimal_Never()
  513. {
  514. var ex = new Exception();
  515. var scheduler = new TestScheduler();
  516. var xs = scheduler.CreateHotObservable(
  517. OnNext(150, 1m)
  518. );
  519. var res = scheduler.Start(() =>
  520. xs.Average()
  521. );
  522. res.Messages.AssertEqual(
  523. );
  524. xs.Subscriptions.AssertEqual(
  525. Subscribe(200, 1000)
  526. );
  527. }
  528. [Fact]
  529. public void Average_Nullable_Int32_Empty()
  530. {
  531. var scheduler = new TestScheduler();
  532. var xs = scheduler.CreateHotObservable(
  533. OnNext(150, (int?)1),
  534. OnCompleted<int?>(250)
  535. );
  536. var res = scheduler.Start(() =>
  537. xs.Average()
  538. );
  539. res.Messages.AssertEqual(
  540. OnNext(250, (double?)null),
  541. OnCompleted<double?>(250)
  542. );
  543. xs.Subscriptions.AssertEqual(
  544. Subscribe(200, 250)
  545. );
  546. }
  547. [Fact]
  548. public void Average_Nullable_Int32_Return()
  549. {
  550. var scheduler = new TestScheduler();
  551. var xs = scheduler.CreateHotObservable(
  552. OnNext(150, (int?)1),
  553. OnNext(210, (int?)2),
  554. OnCompleted<int?>(250)
  555. );
  556. var res = scheduler.Start(() =>
  557. xs.Average()
  558. );
  559. res.Messages.AssertEqual(
  560. OnNext(250, (double?)2.0),
  561. OnCompleted<double?>(250)
  562. );
  563. xs.Subscriptions.AssertEqual(
  564. Subscribe(200, 250)
  565. );
  566. }
  567. [Fact]
  568. public void Average_Nullable_Int32_Some()
  569. {
  570. var scheduler = new TestScheduler();
  571. var xs = scheduler.CreateHotObservable(
  572. OnNext(150, (int?)1),
  573. OnNext(210, (int?)3),
  574. OnNext(220, (int?)null),
  575. OnNext(230, (int?)2),
  576. OnCompleted<int?>(250)
  577. );
  578. var res = scheduler.Start(() =>
  579. xs.Average()
  580. );
  581. res.Messages.AssertEqual(
  582. OnNext(250, (double?)2.5),
  583. OnCompleted<double?>(250)
  584. );
  585. xs.Subscriptions.AssertEqual(
  586. Subscribe(200, 250)
  587. );
  588. }
  589. [Fact]
  590. public void Average_Nullable_Int32_Throw()
  591. {
  592. var ex = new Exception();
  593. var scheduler = new TestScheduler();
  594. var xs = scheduler.CreateHotObservable(
  595. OnNext(150, (int?)1),
  596. OnError<int?>(210, ex)
  597. );
  598. var res = scheduler.Start(() =>
  599. xs.Average()
  600. );
  601. res.Messages.AssertEqual(
  602. OnError<double?>(210, ex)
  603. );
  604. xs.Subscriptions.AssertEqual(
  605. Subscribe(200, 210)
  606. );
  607. }
  608. [Fact]
  609. public void Average_Nullable_Int32_Never()
  610. {
  611. var ex = new Exception();
  612. var scheduler = new TestScheduler();
  613. var xs = scheduler.CreateHotObservable(
  614. OnNext(150, (int?)1)
  615. );
  616. var res = scheduler.Start(() =>
  617. xs.Average()
  618. );
  619. res.Messages.AssertEqual(
  620. );
  621. xs.Subscriptions.AssertEqual(
  622. Subscribe(200, 1000)
  623. );
  624. }
  625. [Fact]
  626. public void Average_Nullable_Int64_Empty()
  627. {
  628. var scheduler = new TestScheduler();
  629. var xs = scheduler.CreateHotObservable(
  630. OnNext(150, (long?)1L),
  631. OnCompleted<long?>(250)
  632. );
  633. var res = scheduler.Start(() =>
  634. xs.Average()
  635. );
  636. res.Messages.AssertEqual(
  637. OnNext(250, (double?)null),
  638. OnCompleted<double?>(250)
  639. );
  640. xs.Subscriptions.AssertEqual(
  641. Subscribe(200, 250)
  642. );
  643. }
  644. [Fact]
  645. public void Average_Nullable_Int64_Return()
  646. {
  647. var scheduler = new TestScheduler();
  648. var xs = scheduler.CreateHotObservable(
  649. OnNext(150, (long?)1L),
  650. OnNext(210, (long?)2L),
  651. OnCompleted<long?>(250)
  652. );
  653. var res = scheduler.Start(() =>
  654. xs.Average()
  655. );
  656. res.Messages.AssertEqual(
  657. OnNext(250, (double?)2.0),
  658. OnCompleted<double?>(250)
  659. );
  660. xs.Subscriptions.AssertEqual(
  661. Subscribe(200, 250)
  662. );
  663. }
  664. [Fact]
  665. public void Average_Nullable_Int64_Some()
  666. {
  667. var scheduler = new TestScheduler();
  668. var xs = scheduler.CreateHotObservable(
  669. OnNext(150, (long?)1L),
  670. OnNext(210, (long?)3L),
  671. OnNext(220, (long?)null),
  672. OnNext(230, (long?)2L),
  673. OnCompleted<long?>(250)
  674. );
  675. var res = scheduler.Start(() =>
  676. xs.Average()
  677. );
  678. res.Messages.AssertEqual(
  679. OnNext(250, (double?)2.5),
  680. OnCompleted<double?>(250)
  681. );
  682. xs.Subscriptions.AssertEqual(
  683. Subscribe(200, 250)
  684. );
  685. }
  686. [Fact]
  687. public void Average_Nullable_Int64_Throw()
  688. {
  689. var ex = new Exception();
  690. var scheduler = new TestScheduler();
  691. var xs = scheduler.CreateHotObservable(
  692. OnNext(150, (long?)1L),
  693. OnError<long?>(210, ex)
  694. );
  695. var res = scheduler.Start(() =>
  696. xs.Average()
  697. );
  698. res.Messages.AssertEqual(
  699. OnError<double?>(210, ex)
  700. );
  701. xs.Subscriptions.AssertEqual(
  702. Subscribe(200, 210)
  703. );
  704. }
  705. [Fact]
  706. public void Average_Nullable_Int64_Never()
  707. {
  708. var ex = new Exception();
  709. var scheduler = new TestScheduler();
  710. var xs = scheduler.CreateHotObservable(
  711. OnNext(150, (long?)1L)
  712. );
  713. var res = scheduler.Start(() =>
  714. xs.Average()
  715. );
  716. res.Messages.AssertEqual(
  717. );
  718. xs.Subscriptions.AssertEqual(
  719. Subscribe(200, 1000)
  720. );
  721. }
  722. [Fact]
  723. public void Average_Nullable_Double_Empty()
  724. {
  725. var scheduler = new TestScheduler();
  726. var xs = scheduler.CreateHotObservable(
  727. OnNext(150, (double?)1.0),
  728. OnCompleted<double?>(250)
  729. );
  730. var res = scheduler.Start(() =>
  731. xs.Average()
  732. );
  733. res.Messages.AssertEqual(
  734. OnNext(250, (double?)null),
  735. OnCompleted<double?>(250)
  736. );
  737. xs.Subscriptions.AssertEqual(
  738. Subscribe(200, 250)
  739. );
  740. }
  741. [Fact]
  742. public void Average_Nullable_Double_Return()
  743. {
  744. var scheduler = new TestScheduler();
  745. var xs = scheduler.CreateHotObservable(
  746. OnNext(150, (double?)1.0),
  747. OnNext(210, (double?)2.0),
  748. OnCompleted<double?>(250)
  749. );
  750. var res = scheduler.Start(() =>
  751. xs.Average()
  752. );
  753. res.Messages.AssertEqual(
  754. OnNext(250, (double?)2.0),
  755. OnCompleted<double?>(250)
  756. );
  757. xs.Subscriptions.AssertEqual(
  758. Subscribe(200, 250)
  759. );
  760. }
  761. [Fact]
  762. public void Average_Nullable_Double_Some()
  763. {
  764. var scheduler = new TestScheduler();
  765. var xs = scheduler.CreateHotObservable(
  766. OnNext(150, (double?)1.0),
  767. OnNext(210, (double?)3.0),
  768. OnNext(220, (double?)null),
  769. OnNext(230, (double?)2.0),
  770. OnCompleted<double?>(250)
  771. );
  772. var res = scheduler.Start(() =>
  773. xs.Average()
  774. );
  775. res.Messages.AssertEqual(
  776. OnNext(250, (double?)2.5),
  777. OnCompleted<double?>(250)
  778. );
  779. xs.Subscriptions.AssertEqual(
  780. Subscribe(200, 250)
  781. );
  782. }
  783. [Fact]
  784. public void Average_Nullable_Double_Throw()
  785. {
  786. var ex = new Exception();
  787. var scheduler = new TestScheduler();
  788. var xs = scheduler.CreateHotObservable(
  789. OnNext(150, (double?)1.0),
  790. OnError<double?>(210, ex)
  791. );
  792. var res = scheduler.Start(() =>
  793. xs.Average()
  794. );
  795. res.Messages.AssertEqual(
  796. OnError<double?>(210, ex)
  797. );
  798. xs.Subscriptions.AssertEqual(
  799. Subscribe(200, 210)
  800. );
  801. }
  802. [Fact]
  803. public void Average_Nullable_Double_Never()
  804. {
  805. var ex = new Exception();
  806. var scheduler = new TestScheduler();
  807. var xs = scheduler.CreateHotObservable(
  808. OnNext(150, (double?)1.0)
  809. );
  810. var res = scheduler.Start(() =>
  811. xs.Average()
  812. );
  813. res.Messages.AssertEqual(
  814. );
  815. xs.Subscriptions.AssertEqual(
  816. Subscribe(200, 1000)
  817. );
  818. }
  819. [Fact]
  820. public void Average_Nullable_Float_Empty()
  821. {
  822. var scheduler = new TestScheduler();
  823. var xs = scheduler.CreateHotObservable(
  824. OnNext(150, (float?)1f),
  825. OnCompleted<float?>(250)
  826. );
  827. var res = scheduler.Start(() =>
  828. xs.Average()
  829. );
  830. res.Messages.AssertEqual(
  831. OnNext(250, (float?)null),
  832. OnCompleted<float?>(250)
  833. );
  834. xs.Subscriptions.AssertEqual(
  835. Subscribe(200, 250)
  836. );
  837. }
  838. [Fact]
  839. public void Average_Nullable_Float_Return()
  840. {
  841. var scheduler = new TestScheduler();
  842. var xs = scheduler.CreateHotObservable(
  843. OnNext(150, (float?)1f),
  844. OnNext(210, (float?)2f),
  845. OnCompleted<float?>(250)
  846. );
  847. var res = scheduler.Start(() =>
  848. xs.Average()
  849. );
  850. res.Messages.AssertEqual(
  851. OnNext(250, (float?)2f),
  852. OnCompleted<float?>(250)
  853. );
  854. xs.Subscriptions.AssertEqual(
  855. Subscribe(200, 250)
  856. );
  857. }
  858. [Fact]
  859. public void Average_Nullable_Float_Some()
  860. {
  861. var scheduler = new TestScheduler();
  862. var xs = scheduler.CreateHotObservable(
  863. OnNext(150, (float?)1f),
  864. OnNext(210, (float?)3f),
  865. OnNext(220, (float?)null),
  866. OnNext(230, (float?)2f),
  867. OnCompleted<float?>(250)
  868. );
  869. var res = scheduler.Start(() =>
  870. xs.Average()
  871. );
  872. res.Messages.AssertEqual(
  873. OnNext(250, (float?)2.5f),
  874. OnCompleted<float?>(250)
  875. );
  876. xs.Subscriptions.AssertEqual(
  877. Subscribe(200, 250)
  878. );
  879. }
  880. [Fact]
  881. public void Average_Nullable_Float_Throw()
  882. {
  883. var ex = new Exception();
  884. var scheduler = new TestScheduler();
  885. var xs = scheduler.CreateHotObservable(
  886. OnNext(150, (float?)1f),
  887. OnError<float?>(210, ex)
  888. );
  889. var res = scheduler.Start(() =>
  890. xs.Average()
  891. );
  892. res.Messages.AssertEqual(
  893. OnError<float?>(210, ex)
  894. );
  895. xs.Subscriptions.AssertEqual(
  896. Subscribe(200, 210)
  897. );
  898. }
  899. [Fact]
  900. public void Average_Nullable_Float_Never()
  901. {
  902. var ex = new Exception();
  903. var scheduler = new TestScheduler();
  904. var xs = scheduler.CreateHotObservable(
  905. OnNext(150, (float?)1f)
  906. );
  907. var res = scheduler.Start(() =>
  908. xs.Average()
  909. );
  910. res.Messages.AssertEqual(
  911. );
  912. xs.Subscriptions.AssertEqual(
  913. Subscribe(200, 1000)
  914. );
  915. }
  916. [Fact]
  917. public void Average_Nullable_Decimal_Empty()
  918. {
  919. var scheduler = new TestScheduler();
  920. var xs = scheduler.CreateHotObservable(
  921. OnNext(150, (decimal?)1m),
  922. OnCompleted<decimal?>(250)
  923. );
  924. var res = scheduler.Start(() =>
  925. xs.Average()
  926. );
  927. res.Messages.AssertEqual(
  928. OnNext(250, (decimal?)null),
  929. OnCompleted<decimal?>(250)
  930. );
  931. xs.Subscriptions.AssertEqual(
  932. Subscribe(200, 250)
  933. );
  934. }
  935. [Fact]
  936. public void Average_Nullable_Decimal_Return()
  937. {
  938. var scheduler = new TestScheduler();
  939. var xs = scheduler.CreateHotObservable(
  940. OnNext(150, (decimal?)1m),
  941. OnNext(210, (decimal?)2m),
  942. OnCompleted<decimal?>(250)
  943. );
  944. var res = scheduler.Start(() =>
  945. xs.Average()
  946. );
  947. res.Messages.AssertEqual(
  948. OnNext(250, (decimal?)2m),
  949. OnCompleted<decimal?>(250)
  950. );
  951. xs.Subscriptions.AssertEqual(
  952. Subscribe(200, 250)
  953. );
  954. }
  955. [Fact]
  956. public void Average_Nullable_Decimal_Some()
  957. {
  958. var scheduler = new TestScheduler();
  959. var xs = scheduler.CreateHotObservable(
  960. OnNext(150, (decimal?)1m),
  961. OnNext(210, (decimal?)3m),
  962. OnNext(220, (decimal?)null),
  963. OnNext(230, (decimal?)2m),
  964. OnCompleted<decimal?>(250)
  965. );
  966. var res = scheduler.Start(() =>
  967. xs.Average()
  968. );
  969. res.Messages.AssertEqual(
  970. OnNext(250, (decimal?)2.5m),
  971. OnCompleted<decimal?>(250)
  972. );
  973. xs.Subscriptions.AssertEqual(
  974. Subscribe(200, 250)
  975. );
  976. }
  977. [Fact]
  978. public void Average_Nullable_Decimal_Throw()
  979. {
  980. var ex = new Exception();
  981. var scheduler = new TestScheduler();
  982. var xs = scheduler.CreateHotObservable(
  983. OnNext(150, (decimal?)1m),
  984. OnError<decimal?>(210, ex)
  985. );
  986. var res = scheduler.Start(() =>
  987. xs.Average()
  988. );
  989. res.Messages.AssertEqual(
  990. OnError<decimal?>(210, ex)
  991. );
  992. xs.Subscriptions.AssertEqual(
  993. Subscribe(200, 210)
  994. );
  995. }
  996. [Fact]
  997. public void Average_Nullable_Decimal_Never()
  998. {
  999. var ex = new Exception();
  1000. var scheduler = new TestScheduler();
  1001. var xs = scheduler.CreateHotObservable(
  1002. OnNext(150, (decimal?)1m)
  1003. );
  1004. var res = scheduler.Start(() =>
  1005. xs.Average()
  1006. );
  1007. res.Messages.AssertEqual(
  1008. );
  1009. xs.Subscriptions.AssertEqual(
  1010. Subscribe(200, 1000)
  1011. );
  1012. }
  1013. #if !NO_PERF
  1014. #if !NO_THREAD
  1015. [Fact]
  1016. public void Average_InjectOverflow_Int32()
  1017. {
  1018. var xs = Observable.Return(42, ThreadPoolScheduler.Instance);
  1019. var res = new OverflowInjection<int>(xs, long.MaxValue).Average();
  1020. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1021. }
  1022. [Fact]
  1023. public void Average_InjectOverflow_Int64()
  1024. {
  1025. var xs = Observable.Return(42L, ThreadPoolScheduler.Instance);
  1026. var res = new OverflowInjection<long>(xs, long.MaxValue).Average();
  1027. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1028. }
  1029. [Fact]
  1030. public void Average_InjectOverflow_Double()
  1031. {
  1032. var xs = Observable.Return(42.0, ThreadPoolScheduler.Instance);
  1033. var res = new OverflowInjection<double>(xs, long.MaxValue).Average();
  1034. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1035. }
  1036. [Fact]
  1037. public void Average_InjectOverflow_Single()
  1038. {
  1039. var xs = Observable.Return(42.0f, ThreadPoolScheduler.Instance);
  1040. var res = new OverflowInjection<float>(xs, long.MaxValue).Average();
  1041. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1042. }
  1043. [Fact]
  1044. public void Average_InjectOverflow_Decimal()
  1045. {
  1046. var xs = Observable.Return(42.0m, ThreadPoolScheduler.Instance);
  1047. var res = new OverflowInjection<decimal>(xs, long.MaxValue).Average();
  1048. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1049. }
  1050. [Fact]
  1051. public void Average_InjectOverflow_Int32_Nullable()
  1052. {
  1053. var xs = Observable.Return((int?)42, ThreadPoolScheduler.Instance);
  1054. var res = new OverflowInjection<int?>(xs, long.MaxValue).Average();
  1055. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1056. }
  1057. [Fact]
  1058. public void Average_InjectOverflow_Int64_Nullable()
  1059. {
  1060. var xs = Observable.Return((long?)42L, ThreadPoolScheduler.Instance);
  1061. var res = new OverflowInjection<long?>(xs, long.MaxValue).Average();
  1062. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1063. }
  1064. [Fact]
  1065. public void Average_InjectOverflow_Double_Nullable()
  1066. {
  1067. var xs = Observable.Return((double?)42.0, ThreadPoolScheduler.Instance);
  1068. var res = new OverflowInjection<double?>(xs, long.MaxValue).Average();
  1069. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1070. }
  1071. [Fact]
  1072. public void Average_InjectOverflow_Single_Nullable()
  1073. {
  1074. var xs = Observable.Return((float?)42.0f, ThreadPoolScheduler.Instance);
  1075. var res = new OverflowInjection<float?>(xs, long.MaxValue).Average();
  1076. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1077. }
  1078. [Fact]
  1079. public void Average_InjectOverflow_Decimal_Nullable()
  1080. {
  1081. var xs = Observable.Return((decimal?)42.0m, ThreadPoolScheduler.Instance);
  1082. var res = new OverflowInjection<decimal?>(xs, long.MaxValue).Average();
  1083. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1084. }
  1085. #endif
  1086. #if !CRIPPLED_REFLECTION || NETCOREAPP1_1 || NETCOREAPP1_0
  1087. private class OverflowInjection<T> : IObservable<T>
  1088. {
  1089. private readonly IObservable<T> _source;
  1090. private readonly object _initialCount;
  1091. public OverflowInjection(IObservable<T> source, object initialCount)
  1092. {
  1093. _source = source;
  1094. _initialCount = initialCount;
  1095. }
  1096. public IDisposable Subscribe(IObserver<T> observer)
  1097. {
  1098. var f = observer.GetType().GetField("_count", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
  1099. f.SetValue(observer, _initialCount);
  1100. return _source.Subscribe(observer);
  1101. }
  1102. }
  1103. #endif
  1104. #endif
  1105. [Fact]
  1106. public void Average_Selector_Regular_Int32()
  1107. {
  1108. var scheduler = new TestScheduler();
  1109. var xs = scheduler.CreateHotObservable(
  1110. OnNext(210, "b"),
  1111. OnNext(220, "fo"),
  1112. OnNext(230, "qux"),
  1113. OnCompleted<string>(240)
  1114. );
  1115. var res = scheduler.Start(() => xs.Average(x => x.Length));
  1116. res.Messages.AssertEqual(
  1117. OnNext(240, 2.0),
  1118. OnCompleted<double>(240)
  1119. );
  1120. xs.Subscriptions.AssertEqual(
  1121. Subscribe(200, 240)
  1122. );
  1123. }
  1124. [Fact]
  1125. public void Average_Selector_Regular_Int64()
  1126. {
  1127. var scheduler = new TestScheduler();
  1128. var xs = scheduler.CreateHotObservable(
  1129. OnNext(210, "b"),
  1130. OnNext(220, "fo"),
  1131. OnNext(230, "qux"),
  1132. OnCompleted<string>(240)
  1133. );
  1134. var res = scheduler.Start(() => xs.Average(x => (long)x.Length));
  1135. res.Messages.AssertEqual(
  1136. OnNext(240, 2.0),
  1137. OnCompleted<double>(240)
  1138. );
  1139. xs.Subscriptions.AssertEqual(
  1140. Subscribe(200, 240)
  1141. );
  1142. }
  1143. [Fact]
  1144. public void Average_Selector_Regular_Single()
  1145. {
  1146. var scheduler = new TestScheduler();
  1147. var xs = scheduler.CreateHotObservable(
  1148. OnNext(210, "b"),
  1149. OnNext(220, "fo"),
  1150. OnNext(230, "qux"),
  1151. OnCompleted<string>(240)
  1152. );
  1153. var res = scheduler.Start(() => xs.Average(x => (float)x.Length));
  1154. res.Messages.AssertEqual(
  1155. OnNext(240, 2.0f),
  1156. OnCompleted<float>(240)
  1157. );
  1158. xs.Subscriptions.AssertEqual(
  1159. Subscribe(200, 240)
  1160. );
  1161. }
  1162. [Fact]
  1163. public void Average_Selector_Regular_Double()
  1164. {
  1165. var scheduler = new TestScheduler();
  1166. var xs = scheduler.CreateHotObservable(
  1167. OnNext(210, "b"),
  1168. OnNext(220, "fo"),
  1169. OnNext(230, "qux"),
  1170. OnCompleted<string>(240)
  1171. );
  1172. var res = scheduler.Start(() => xs.Average(x => (double)x.Length));
  1173. res.Messages.AssertEqual(
  1174. OnNext(240, 2.0),
  1175. OnCompleted<double>(240)
  1176. );
  1177. xs.Subscriptions.AssertEqual(
  1178. Subscribe(200, 240)
  1179. );
  1180. }
  1181. [Fact]
  1182. public void Average_Selector_Regular_Decimal()
  1183. {
  1184. var scheduler = new TestScheduler();
  1185. var xs = scheduler.CreateHotObservable(
  1186. OnNext(210, "b"),
  1187. OnNext(220, "fo"),
  1188. OnNext(230, "qux"),
  1189. OnCompleted<string>(240)
  1190. );
  1191. var res = scheduler.Start(() => xs.Average(x => (decimal)x.Length));
  1192. res.Messages.AssertEqual(
  1193. OnNext(240, 2.0m),
  1194. OnCompleted<decimal>(240)
  1195. );
  1196. xs.Subscriptions.AssertEqual(
  1197. Subscribe(200, 240)
  1198. );
  1199. }
  1200. [Fact]
  1201. public void Average_Selector_Regular_Int32_Nullable()
  1202. {
  1203. var scheduler = new TestScheduler();
  1204. var xs = scheduler.CreateHotObservable(
  1205. OnNext(210, "b"),
  1206. OnNext(220, "fo"),
  1207. OnNext(230, "qux"),
  1208. OnCompleted<string>(240)
  1209. );
  1210. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(int?) : x.Length));
  1211. res.Messages.AssertEqual(
  1212. OnNext(240, (double?)2.0),
  1213. OnCompleted<double?>(240)
  1214. );
  1215. xs.Subscriptions.AssertEqual(
  1216. Subscribe(200, 240)
  1217. );
  1218. }
  1219. [Fact]
  1220. public void Average_Selector_Regular_Int64_Nullable()
  1221. {
  1222. var scheduler = new TestScheduler();
  1223. var xs = scheduler.CreateHotObservable(
  1224. OnNext(210, "b"),
  1225. OnNext(220, "fo"),
  1226. OnNext(230, "qux"),
  1227. OnCompleted<string>(240)
  1228. );
  1229. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(long?) : x.Length));
  1230. res.Messages.AssertEqual(
  1231. OnNext(240, (double?)2.0),
  1232. OnCompleted<double?>(240)
  1233. );
  1234. xs.Subscriptions.AssertEqual(
  1235. Subscribe(200, 240)
  1236. );
  1237. }
  1238. [Fact]
  1239. public void Average_Selector_Regular_Single_Nullable()
  1240. {
  1241. var scheduler = new TestScheduler();
  1242. var xs = scheduler.CreateHotObservable(
  1243. OnNext(210, "b"),
  1244. OnNext(220, "fo"),
  1245. OnNext(230, "qux"),
  1246. OnCompleted<string>(240)
  1247. );
  1248. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(float?) : x.Length));
  1249. res.Messages.AssertEqual(
  1250. OnNext(240, (float?)2.0),
  1251. OnCompleted<float?>(240)
  1252. );
  1253. xs.Subscriptions.AssertEqual(
  1254. Subscribe(200, 240)
  1255. );
  1256. }
  1257. [Fact]
  1258. public void Average_Selector_Regular_Double_Nullable()
  1259. {
  1260. var scheduler = new TestScheduler();
  1261. var xs = scheduler.CreateHotObservable(
  1262. OnNext(210, "b"),
  1263. OnNext(220, "fo"),
  1264. OnNext(230, "qux"),
  1265. OnCompleted<string>(240)
  1266. );
  1267. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(double?) : x.Length));
  1268. res.Messages.AssertEqual(
  1269. OnNext(240, (double?)2.0),
  1270. OnCompleted<double?>(240)
  1271. );
  1272. xs.Subscriptions.AssertEqual(
  1273. Subscribe(200, 240)
  1274. );
  1275. }
  1276. [Fact]
  1277. public void Average_Selector_Regular_Decimal_Nullable()
  1278. {
  1279. var scheduler = new TestScheduler();
  1280. var xs = scheduler.CreateHotObservable(
  1281. OnNext(210, "b"),
  1282. OnNext(220, "fo"),
  1283. OnNext(230, "qux"),
  1284. OnCompleted<string>(240)
  1285. );
  1286. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(decimal?) : x.Length));
  1287. res.Messages.AssertEqual(
  1288. OnNext(240, (decimal?)2.0),
  1289. OnCompleted<decimal?>(240)
  1290. );
  1291. xs.Subscriptions.AssertEqual(
  1292. Subscribe(200, 240)
  1293. );
  1294. }
  1295. }
  1296. }