AverageTest.cs 45 KB

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