ObservableAggregateTest.cs 387 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481
  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.Reactive;
  8. using System.Reactive.Concurrency;
  9. using System.Reactive.Linq;
  10. using Microsoft.Reactive.Testing;
  11. using Xunit;
  12. using ReactiveTests.Dummies;
  13. using System.Reflection;
  14. namespace ReactiveTests.Tests
  15. {
  16. public partial class ObservableAggregateTest : ReactiveTest
  17. {
  18. #region + Aggregate +
  19. [Fact]
  20. public void Aggregate_ArgumentChecking()
  21. {
  22. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int, int>(default(IObservable<int>), 1, (x, y) => x + y));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int, int>(DummyObservable<int>.Instance, 1, default(Func<int, int, int>)));
  24. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int>(default(IObservable<int>), (x, y) => x + y));
  25. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int>(DummyObservable<int>.Instance, default(Func<int, int, int>)));
  26. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int, int, int>(default(IObservable<int>), 1, (x, y) => x + y, x => x));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int, int, int>(DummyObservable<int>.Instance, 1, default(Func<int, int, int>), x => x));
  28. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Aggregate<int, int, int>(DummyObservable<int>.Instance, 1, (x, y) => x + y, default(Func<int, int>)));
  29. }
  30. [Fact]
  31. public void AggregateWithSeed_Empty()
  32. {
  33. var scheduler = new TestScheduler();
  34. var xs = scheduler.CreateHotObservable(
  35. OnNext(150, 1),
  36. OnCompleted<int>(250)
  37. );
  38. var res = scheduler.Start(() =>
  39. xs.Aggregate(42, (acc, x) => acc + x)
  40. );
  41. res.Messages.AssertEqual(
  42. OnNext(250, 42),
  43. OnCompleted<int>(250)
  44. );
  45. xs.Subscriptions.AssertEqual(
  46. Subscribe(200, 250)
  47. );
  48. }
  49. [Fact]
  50. public void AggregateWithSeed_Return()
  51. {
  52. var scheduler = new TestScheduler();
  53. var xs = scheduler.CreateHotObservable(
  54. OnNext(150, 1),
  55. OnNext(210, 24),
  56. OnCompleted<int>(250)
  57. );
  58. var res = scheduler.Start(() =>
  59. xs.Aggregate(42, (acc, x) => acc + x)
  60. );
  61. res.Messages.AssertEqual(
  62. OnNext<int>(250, 42 + 24),
  63. OnCompleted<int>(250)
  64. );
  65. xs.Subscriptions.AssertEqual(
  66. Subscribe(200, 250)
  67. );
  68. }
  69. [Fact]
  70. public void AggregateWithSeed_Throw()
  71. {
  72. var ex = new Exception();
  73. var scheduler = new TestScheduler();
  74. var xs = scheduler.CreateHotObservable(
  75. OnNext(150, 1),
  76. OnError<int>(210, ex)
  77. );
  78. var res = scheduler.Start(() =>
  79. xs.Aggregate(42, (acc, x) => acc + x)
  80. );
  81. res.Messages.AssertEqual(
  82. OnError<int>(210, ex)
  83. );
  84. xs.Subscriptions.AssertEqual(
  85. Subscribe(200, 210)
  86. );
  87. }
  88. [Fact]
  89. public void AggregateWithSeed_Never()
  90. {
  91. var ex = new Exception();
  92. var scheduler = new TestScheduler();
  93. var xs = scheduler.CreateHotObservable(
  94. OnNext(150, 1)
  95. );
  96. var res = scheduler.Start(() =>
  97. xs.Aggregate(42, (acc, x) => acc + x)
  98. );
  99. res.Messages.AssertEqual(
  100. );
  101. xs.Subscriptions.AssertEqual(
  102. Subscribe(200, 1000)
  103. );
  104. }
  105. [Fact]
  106. public void AggregateWithSeed_Range()
  107. {
  108. var ex = new Exception();
  109. var scheduler = new TestScheduler();
  110. var xs = scheduler.CreateHotObservable(
  111. OnNext(150, 1),
  112. OnNext(210, 0),
  113. OnNext(220, 1),
  114. OnNext(230, 2),
  115. OnNext(240, 3),
  116. OnNext(250, 4),
  117. OnCompleted<int>(260)
  118. );
  119. var res = scheduler.Start(() =>
  120. xs.Aggregate(42, (acc, x) => acc + x)
  121. );
  122. res.Messages.AssertEqual(
  123. OnNext(260, 42 + Enumerable.Range(0, 5).Sum()),
  124. OnCompleted<int>(260)
  125. );
  126. xs.Subscriptions.AssertEqual(
  127. Subscribe(200, 260)
  128. );
  129. }
  130. [Fact]
  131. public void AggregateWithSeed_AccumulatorThrows()
  132. {
  133. var ex = new Exception();
  134. var scheduler = new TestScheduler();
  135. var xs = scheduler.CreateHotObservable(
  136. OnNext(150, 1),
  137. OnNext(210, 0),
  138. OnNext(220, 1),
  139. OnNext(230, 2),
  140. OnNext(240, 3),
  141. OnNext(250, 4),
  142. OnCompleted<int>(260)
  143. );
  144. var res = scheduler.Start(() =>
  145. xs.Aggregate(0, (acc, x) => { if (x < 3) return acc + x; throw ex; })
  146. );
  147. res.Messages.AssertEqual(
  148. OnError<int>(240, ex)
  149. );
  150. xs.Subscriptions.AssertEqual(
  151. Subscribe(200, 240)
  152. );
  153. }
  154. [Fact]
  155. public void AggregateWithSeedAndResult_Empty()
  156. {
  157. var scheduler = new TestScheduler();
  158. var xs = scheduler.CreateHotObservable(
  159. OnNext(150, 1),
  160. OnCompleted<int>(250)
  161. );
  162. var res = scheduler.Start(() =>
  163. xs.Aggregate(42, (acc, x) => acc + x, x => x * 5)
  164. );
  165. res.Messages.AssertEqual(
  166. OnNext(250, 42 * 5),
  167. OnCompleted<int>(250)
  168. );
  169. xs.Subscriptions.AssertEqual(
  170. Subscribe(200, 250)
  171. );
  172. }
  173. [Fact]
  174. public void AggregateWithSeedAndResult_Return()
  175. {
  176. var scheduler = new TestScheduler();
  177. var xs = scheduler.CreateHotObservable(
  178. OnNext(150, 1),
  179. OnNext(210, 24),
  180. OnCompleted<int>(250)
  181. );
  182. var res = scheduler.Start(() =>
  183. xs.Aggregate(42, (acc, x) => acc + x, x => x * 5)
  184. );
  185. res.Messages.AssertEqual(
  186. OnNext<int>(250, (42 + 24) * 5),
  187. OnCompleted<int>(250)
  188. );
  189. xs.Subscriptions.AssertEqual(
  190. Subscribe(200, 250)
  191. );
  192. }
  193. [Fact]
  194. public void AggregateWithSeedAndResult_Throw()
  195. {
  196. var ex = new Exception();
  197. var scheduler = new TestScheduler();
  198. var xs = scheduler.CreateHotObservable(
  199. OnNext(150, 1),
  200. OnError<int>(210, ex)
  201. );
  202. var res = scheduler.Start(() =>
  203. xs.Aggregate(42, (acc, x) => acc + x, x => x * 5)
  204. );
  205. res.Messages.AssertEqual(
  206. OnError<int>(210, ex)
  207. );
  208. xs.Subscriptions.AssertEqual(
  209. Subscribe(200, 210)
  210. );
  211. }
  212. [Fact]
  213. public void AggregateWithSeedAndResult_Never()
  214. {
  215. var ex = new Exception();
  216. var scheduler = new TestScheduler();
  217. var xs = scheduler.CreateHotObservable(
  218. OnNext(150, 1)
  219. );
  220. var res = scheduler.Start(() =>
  221. xs.Aggregate(42, (acc, x) => acc + x, x => x * 5)
  222. );
  223. res.Messages.AssertEqual(
  224. );
  225. xs.Subscriptions.AssertEqual(
  226. Subscribe(200, 1000)
  227. );
  228. }
  229. [Fact]
  230. public void AggregateWithSeedAndResult_Range()
  231. {
  232. var ex = new Exception();
  233. var scheduler = new TestScheduler();
  234. var xs = scheduler.CreateHotObservable(
  235. OnNext(150, 1),
  236. OnNext(210, 0),
  237. OnNext(220, 1),
  238. OnNext(230, 2),
  239. OnNext(240, 3),
  240. OnNext(250, 4),
  241. OnCompleted<int>(260)
  242. );
  243. var res = scheduler.Start(() =>
  244. xs.Aggregate(42, (acc, x) => acc + x, x => x * 5)
  245. );
  246. res.Messages.AssertEqual(
  247. OnNext(260, (42 + Enumerable.Range(0, 5).Sum()) * 5),
  248. OnCompleted<int>(260)
  249. );
  250. xs.Subscriptions.AssertEqual(
  251. Subscribe(200, 260)
  252. );
  253. }
  254. [Fact]
  255. public void AggregateWithSeedAndResult_AccumulatorThrows()
  256. {
  257. var ex = new Exception();
  258. var scheduler = new TestScheduler();
  259. var xs = scheduler.CreateHotObservable(
  260. OnNext(150, 1),
  261. OnNext(210, 0),
  262. OnNext(220, 1),
  263. OnNext(230, 2),
  264. OnNext(240, 3),
  265. OnNext(250, 4),
  266. OnCompleted<int>(260)
  267. );
  268. var res = scheduler.Start(() =>
  269. xs.Aggregate(0, (acc, x) => { if (x < 3) return acc + x; throw ex; }, x => x * 5)
  270. );
  271. res.Messages.AssertEqual(
  272. OnError<int>(240, ex)
  273. );
  274. xs.Subscriptions.AssertEqual(
  275. Subscribe(200, 240)
  276. );
  277. }
  278. [Fact]
  279. public void AggregateWithSeedAndResult_ResultSelectorThrows()
  280. {
  281. var ex = new Exception();
  282. var scheduler = new TestScheduler();
  283. var xs = scheduler.CreateHotObservable(
  284. OnNext(150, 1),
  285. OnNext(210, 0),
  286. OnNext(220, 1),
  287. OnNext(230, 2),
  288. OnNext(240, 3),
  289. OnNext(250, 4),
  290. OnCompleted<int>(260)
  291. );
  292. var res = scheduler.Start(() =>
  293. xs.Aggregate<int, int, int>(0, (acc, x) => acc + x, x => { throw ex; })
  294. );
  295. res.Messages.AssertEqual(
  296. OnError<int>(260, ex)
  297. );
  298. xs.Subscriptions.AssertEqual(
  299. Subscribe(200, 260)
  300. );
  301. }
  302. [Fact]
  303. public void AggregateWithoutSeed_Empty()
  304. {
  305. var scheduler = new TestScheduler();
  306. var xs = scheduler.CreateHotObservable(
  307. OnNext(150, 1),
  308. OnCompleted<int>(250)
  309. );
  310. var res = scheduler.Start(() =>
  311. xs.Aggregate((acc, x) => acc + x)
  312. );
  313. res.Messages.AssertEqual(
  314. OnError<int>(250, e => e is InvalidOperationException)
  315. );
  316. xs.Subscriptions.AssertEqual(
  317. Subscribe(200, 250)
  318. );
  319. }
  320. [Fact]
  321. public void AggregateWithoutSeed_Return()
  322. {
  323. var scheduler = new TestScheduler();
  324. var xs = scheduler.CreateHotObservable(
  325. OnNext(150, 1),
  326. OnNext(210, 24),
  327. OnCompleted<int>(250)
  328. );
  329. var res = scheduler.Start(() =>
  330. xs.Aggregate((acc, x) => acc + x)
  331. );
  332. res.Messages.AssertEqual(
  333. OnNext<int>(250, 24),
  334. OnCompleted<int>(250)
  335. );
  336. xs.Subscriptions.AssertEqual(
  337. Subscribe(200, 250)
  338. );
  339. }
  340. [Fact]
  341. public void AggregateWithoutSeed_Throw()
  342. {
  343. var ex = new Exception();
  344. var scheduler = new TestScheduler();
  345. var xs = scheduler.CreateHotObservable(
  346. OnNext(150, 1),
  347. OnError<int>(210, ex)
  348. );
  349. var res = scheduler.Start(() =>
  350. xs.Aggregate((acc, x) => acc + x)
  351. );
  352. res.Messages.AssertEqual(
  353. OnError<int>(210, ex)
  354. );
  355. xs.Subscriptions.AssertEqual(
  356. Subscribe(200, 210)
  357. );
  358. }
  359. [Fact]
  360. public void AggregateWithoutSeed_Never()
  361. {
  362. var scheduler = new TestScheduler();
  363. var xs = scheduler.CreateHotObservable(
  364. OnNext(150, 1)
  365. );
  366. var res = scheduler.Start(() =>
  367. xs.Aggregate((acc, x) => acc + x)
  368. );
  369. res.Messages.AssertEqual(
  370. );
  371. }
  372. [Fact]
  373. public void AggregateWithoutSeed_Range()
  374. {
  375. var scheduler = new TestScheduler();
  376. var xs = scheduler.CreateHotObservable(
  377. OnNext(150, 1),
  378. OnNext(210, 0),
  379. OnNext(220, 1),
  380. OnNext(230, 2),
  381. OnNext(240, 3),
  382. OnNext(250, 4),
  383. OnCompleted<int>(260)
  384. );
  385. var res = scheduler.Start(() =>
  386. xs.Aggregate((acc, x) => acc + x)
  387. );
  388. res.Messages.AssertEqual(
  389. OnNext(260, Enumerable.Range(0, 5).Sum()),
  390. OnCompleted<int>(260)
  391. );
  392. xs.Subscriptions.AssertEqual(
  393. Subscribe(200, 260)
  394. );
  395. }
  396. [Fact]
  397. public void AggregateWithoutSeed_AccumulatorThrows()
  398. {
  399. var ex = new Exception();
  400. var scheduler = new TestScheduler();
  401. var xs = scheduler.CreateHotObservable(
  402. OnNext(150, 1),
  403. OnNext(210, 0),
  404. OnNext(220, 1),
  405. OnNext(230, 2),
  406. OnNext(240, 3),
  407. OnNext(250, 4),
  408. OnCompleted<int>(260)
  409. );
  410. var res = scheduler.Start(() =>
  411. xs.Aggregate((acc, x) => { if (x < 3) return acc + x; throw ex; })
  412. );
  413. res.Messages.AssertEqual(
  414. OnError<int>(240, ex)
  415. );
  416. xs.Subscriptions.AssertEqual(
  417. Subscribe(200, 240)
  418. );
  419. }
  420. #endregion
  421. #region + All +
  422. [Fact]
  423. public void All_ArgumentChecking()
  424. {
  425. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.All(DummyObservable<int>.Instance, default(Func<int, bool>)));
  426. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.All(default(IObservable<int>), x => true));
  427. }
  428. [Fact]
  429. public void All_Empty()
  430. {
  431. var scheduler = new TestScheduler();
  432. var xs = scheduler.CreateHotObservable(
  433. OnNext(150, 1),
  434. OnCompleted<int>(250)
  435. );
  436. var res = scheduler.Start(() =>
  437. xs.All(x => x > 0)
  438. );
  439. res.Messages.AssertEqual(
  440. OnNext(250, true),
  441. OnCompleted<bool>(250)
  442. );
  443. xs.Subscriptions.AssertEqual(
  444. Subscribe(200, 250)
  445. );
  446. }
  447. [Fact]
  448. public void All_Return()
  449. {
  450. var scheduler = new TestScheduler();
  451. var xs = scheduler.CreateHotObservable(
  452. OnNext(150, 1),
  453. OnNext(210, 2),
  454. OnCompleted<int>(250)
  455. );
  456. var res = scheduler.Start(() =>
  457. xs.All(x => x > 0)
  458. );
  459. res.Messages.AssertEqual(
  460. OnNext(250, true),
  461. OnCompleted<bool>(250)
  462. );
  463. xs.Subscriptions.AssertEqual(
  464. Subscribe(200, 250)
  465. );
  466. }
  467. [Fact]
  468. public void All_ReturnNotMatch()
  469. {
  470. var scheduler = new TestScheduler();
  471. var xs = scheduler.CreateHotObservable(
  472. OnNext(150, 1),
  473. OnNext(210, -2),
  474. OnCompleted<int>(250)
  475. );
  476. var res = scheduler.Start(() =>
  477. xs.All(x => x > 0)
  478. );
  479. res.Messages.AssertEqual(
  480. OnNext(210, false),
  481. OnCompleted<bool>(210)
  482. );
  483. xs.Subscriptions.AssertEqual(
  484. Subscribe(200, 210)
  485. );
  486. }
  487. [Fact]
  488. public void All_SomeNoneMatch()
  489. {
  490. var scheduler = new TestScheduler();
  491. var xs = scheduler.CreateHotObservable(
  492. OnNext(150, 1),
  493. OnNext(210, -2),
  494. OnNext(220, -3),
  495. OnNext(230, -4),
  496. OnCompleted<int>(250)
  497. );
  498. var res = scheduler.Start(() =>
  499. xs.All(x => x > 0)
  500. );
  501. res.Messages.AssertEqual(
  502. OnNext(210, false),
  503. OnCompleted<bool>(210)
  504. );
  505. xs.Subscriptions.AssertEqual(
  506. Subscribe(200, 210)
  507. );
  508. }
  509. [Fact]
  510. public void All_SomeMatch()
  511. {
  512. var scheduler = new TestScheduler();
  513. var xs = scheduler.CreateHotObservable(
  514. OnNext(150, 1),
  515. OnNext(210, -2),
  516. OnNext(220, 3),
  517. OnNext(230, -4),
  518. OnCompleted<int>(250)
  519. );
  520. var res = scheduler.Start(() =>
  521. xs.All(x => x > 0)
  522. );
  523. res.Messages.AssertEqual(
  524. OnNext(210, false),
  525. OnCompleted<bool>(210)
  526. );
  527. xs.Subscriptions.AssertEqual(
  528. Subscribe(200, 210)
  529. );
  530. }
  531. [Fact]
  532. public void All_SomeAllMatch()
  533. {
  534. var scheduler = new TestScheduler();
  535. var xs = scheduler.CreateHotObservable(
  536. OnNext(150, 1),
  537. OnNext(210, 2),
  538. OnNext(220, 3),
  539. OnNext(230, 4),
  540. OnCompleted<int>(250)
  541. );
  542. var res = scheduler.Start(() =>
  543. xs.All(x => x > 0)
  544. );
  545. res.Messages.AssertEqual(
  546. OnNext(250, true),
  547. OnCompleted<bool>(250)
  548. );
  549. xs.Subscriptions.AssertEqual(
  550. Subscribe(200, 250)
  551. );
  552. }
  553. [Fact]
  554. public void All_Throw()
  555. {
  556. var ex = new Exception();
  557. var scheduler = new TestScheduler();
  558. var xs = scheduler.CreateHotObservable(
  559. OnNext(150, 1),
  560. OnError<int>(210, ex)
  561. );
  562. var res = scheduler.Start(() =>
  563. xs.All(x => x > 0)
  564. );
  565. res.Messages.AssertEqual(
  566. OnError<bool>(210, ex)
  567. );
  568. xs.Subscriptions.AssertEqual(
  569. Subscribe(200, 210)
  570. );
  571. }
  572. [Fact]
  573. public void All_Never()
  574. {
  575. var ex = new Exception();
  576. var scheduler = new TestScheduler();
  577. var xs = scheduler.CreateHotObservable(
  578. OnNext(150, 1)
  579. );
  580. var res = scheduler.Start(() =>
  581. xs.All(x => x > 0)
  582. );
  583. res.Messages.AssertEqual(
  584. );
  585. xs.Subscriptions.AssertEqual(
  586. Subscribe(200, 1000)
  587. );
  588. }
  589. [Fact]
  590. public void All_PredicateThrows()
  591. {
  592. var ex = new Exception();
  593. var scheduler = new TestScheduler();
  594. var xs = scheduler.CreateHotObservable(
  595. OnNext(150, 1),
  596. OnNext(210, 2),
  597. OnNext(220, 3),
  598. OnNext(230, 4),
  599. OnCompleted<int>(250)
  600. );
  601. var res = scheduler.Start(() =>
  602. xs.All(x => { if (x < 4) return true; throw ex; })
  603. );
  604. res.Messages.AssertEqual(
  605. OnError<bool>(230, ex)
  606. );
  607. xs.Subscriptions.AssertEqual(
  608. Subscribe(200, 230)
  609. );
  610. }
  611. #endregion
  612. #region + Any +
  613. [Fact]
  614. public void Any_ArgumentChecking()
  615. {
  616. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Any(default(IObservable<int>)));
  617. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Any(DummyObservable<int>.Instance, default(Func<int, bool>)));
  618. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Any(default(IObservable<int>), x => true));
  619. }
  620. [Fact]
  621. public void Any_Empty()
  622. {
  623. var scheduler = new TestScheduler();
  624. var xs = scheduler.CreateHotObservable(
  625. OnNext(150, 1),
  626. OnCompleted<int>(250)
  627. );
  628. var res = scheduler.Start(() =>
  629. xs.Any()
  630. );
  631. res.Messages.AssertEqual(
  632. OnNext(250, false),
  633. OnCompleted<bool>(250)
  634. );
  635. xs.Subscriptions.AssertEqual(
  636. Subscribe(200, 250)
  637. );
  638. }
  639. [Fact]
  640. public void Any_Return()
  641. {
  642. var scheduler = new TestScheduler();
  643. var xs = scheduler.CreateHotObservable(
  644. OnNext(150, 1),
  645. OnNext(210, 2),
  646. OnCompleted<int>(250)
  647. );
  648. var res = scheduler.Start(() =>
  649. xs.Any()
  650. );
  651. res.Messages.AssertEqual(
  652. OnNext(210, true),
  653. OnCompleted<bool>(210)
  654. );
  655. xs.Subscriptions.AssertEqual(
  656. Subscribe(200, 210)
  657. );
  658. }
  659. [Fact]
  660. public void Any_Throw()
  661. {
  662. var ex = new Exception();
  663. var scheduler = new TestScheduler();
  664. var xs = scheduler.CreateHotObservable(
  665. OnNext(150, 1),
  666. OnError<int>(210, ex)
  667. );
  668. var res = scheduler.Start(() =>
  669. xs.Any()
  670. );
  671. res.Messages.AssertEqual(
  672. OnError<bool>(210, ex)
  673. );
  674. xs.Subscriptions.AssertEqual(
  675. Subscribe(200, 210)
  676. );
  677. }
  678. [Fact]
  679. public void Any_Never()
  680. {
  681. var ex = new Exception();
  682. var scheduler = new TestScheduler();
  683. var xs = scheduler.CreateHotObservable(
  684. OnNext(150, 1)
  685. );
  686. var res = scheduler.Start(() =>
  687. xs.Any()
  688. );
  689. res.Messages.AssertEqual(
  690. );
  691. xs.Subscriptions.AssertEqual(
  692. Subscribe(200, 1000)
  693. );
  694. }
  695. [Fact]
  696. public void Any_Predicate_Empty()
  697. {
  698. var scheduler = new TestScheduler();
  699. var xs = scheduler.CreateHotObservable(
  700. OnNext(150, 1),
  701. OnCompleted<int>(250)
  702. );
  703. var res = scheduler.Start(() =>
  704. xs.Any(x => x > 0)
  705. );
  706. res.Messages.AssertEqual(
  707. OnNext(250, false),
  708. OnCompleted<bool>(250)
  709. );
  710. xs.Subscriptions.AssertEqual(
  711. Subscribe(200, 250)
  712. );
  713. }
  714. [Fact]
  715. public void Any_Predicate_Return()
  716. {
  717. var scheduler = new TestScheduler();
  718. var xs = scheduler.CreateHotObservable(
  719. OnNext(150, 1),
  720. OnNext(210, 2),
  721. OnCompleted<int>(250)
  722. );
  723. var res = scheduler.Start(() =>
  724. xs.Any(x => x > 0)
  725. );
  726. res.Messages.AssertEqual(
  727. OnNext(210, true),
  728. OnCompleted<bool>(210)
  729. );
  730. xs.Subscriptions.AssertEqual(
  731. Subscribe(200, 210)
  732. );
  733. }
  734. [Fact]
  735. public void Any_Predicate_ReturnNotMatch()
  736. {
  737. var scheduler = new TestScheduler();
  738. var xs = scheduler.CreateHotObservable(
  739. OnNext(150, 1),
  740. OnNext(210, -2),
  741. OnCompleted<int>(250)
  742. );
  743. var res = scheduler.Start(() =>
  744. xs.Any(x => x > 0)
  745. );
  746. res.Messages.AssertEqual(
  747. OnNext(250, false),
  748. OnCompleted<bool>(250)
  749. );
  750. xs.Subscriptions.AssertEqual(
  751. Subscribe(200, 250)
  752. );
  753. }
  754. [Fact]
  755. public void Any_Predicate_SomeNoneMatch()
  756. {
  757. var scheduler = new TestScheduler();
  758. var xs = scheduler.CreateHotObservable(
  759. OnNext(150, 1),
  760. OnNext(210, -2),
  761. OnNext(220, -3),
  762. OnNext(230, -4),
  763. OnCompleted<int>(250)
  764. );
  765. var res = scheduler.Start(() =>
  766. xs.Any(x => x > 0)
  767. );
  768. res.Messages.AssertEqual(
  769. OnNext(250, false),
  770. OnCompleted<bool>(250)
  771. );
  772. xs.Subscriptions.AssertEqual(
  773. Subscribe(200, 250)
  774. );
  775. }
  776. [Fact]
  777. public void Any_Predicate_SomeMatch()
  778. {
  779. var scheduler = new TestScheduler();
  780. var xs = scheduler.CreateHotObservable(
  781. OnNext(150, 1),
  782. OnNext(210, -2),
  783. OnNext(220, 3),
  784. OnNext(230, -4),
  785. OnCompleted<int>(250)
  786. );
  787. var res = scheduler.Start(() =>
  788. xs.Any(x => x > 0)
  789. );
  790. res.Messages.AssertEqual(
  791. OnNext(220, true),
  792. OnCompleted<bool>(220)
  793. );
  794. xs.Subscriptions.AssertEqual(
  795. Subscribe(200, 220)
  796. );
  797. }
  798. [Fact]
  799. public void Any_Predicate_Throw()
  800. {
  801. var ex = new Exception();
  802. var scheduler = new TestScheduler();
  803. var xs = scheduler.CreateHotObservable(
  804. OnNext(150, 1),
  805. OnError<int>(210, ex)
  806. );
  807. var res = scheduler.Start(() =>
  808. xs.Any(x => x > 0)
  809. );
  810. res.Messages.AssertEqual(
  811. OnError<bool>(210, ex)
  812. );
  813. xs.Subscriptions.AssertEqual(
  814. Subscribe(200, 210)
  815. );
  816. }
  817. [Fact]
  818. public void Any_Predicate_Never()
  819. {
  820. var scheduler = new TestScheduler();
  821. var xs = scheduler.CreateHotObservable(
  822. OnNext(150, 1)
  823. );
  824. var res = scheduler.Start(() =>
  825. xs.Any(x => x > 0)
  826. );
  827. res.Messages.AssertEqual(
  828. );
  829. xs.Subscriptions.AssertEqual(
  830. Subscribe(200, 1000)
  831. );
  832. }
  833. [Fact]
  834. public void Any_Predicate_PredicateThrows()
  835. {
  836. var ex = new Exception();
  837. var scheduler = new TestScheduler();
  838. var xs = scheduler.CreateHotObservable(
  839. OnNext(150, 1),
  840. OnNext(210, -2),
  841. OnNext(220, 3),
  842. OnNext(230, -4),
  843. OnCompleted<int>(250)
  844. );
  845. var res = scheduler.Start(() =>
  846. xs.Any(x => { if (x != -4) return false; throw ex; })
  847. );
  848. res.Messages.AssertEqual(
  849. OnError<bool>(230, ex)
  850. );
  851. xs.Subscriptions.AssertEqual(
  852. Subscribe(200, 230)
  853. );
  854. }
  855. #endregion
  856. #region + Average +
  857. [Fact]
  858. public void Average_ArgumentChecking()
  859. {
  860. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<int>)));
  861. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<double>)));
  862. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<float>)));
  863. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<decimal>)));
  864. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<long>)));
  865. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<int?>)));
  866. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<double?>)));
  867. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<float?>)));
  868. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<decimal?>)));
  869. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<long?>)));
  870. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(int)));
  871. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(double)));
  872. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(float)));
  873. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(decimal)));
  874. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(long)));
  875. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(int?)));
  876. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(double?)));
  877. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(float?)));
  878. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(decimal?)));
  879. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(default(IObservable<DateTime>), _ => default(long?)));
  880. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, int>)));
  881. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, double>)));
  882. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, float>)));
  883. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, decimal>)));
  884. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, long>)));
  885. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, int?>)));
  886. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, double?>)));
  887. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, float?>)));
  888. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, decimal?>)));
  889. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Average(Observable.Empty<DateTime>(), default(Func<DateTime, long?>)));
  890. }
  891. [Fact]
  892. public void Average_Int32_Empty()
  893. {
  894. var scheduler = new TestScheduler();
  895. var xs = scheduler.CreateHotObservable(
  896. OnNext(150, 1),
  897. OnCompleted<int>(250)
  898. );
  899. var res = scheduler.Start(() =>
  900. xs.Average()
  901. );
  902. res.Messages.AssertEqual(
  903. OnError<double>(250, e => e is InvalidOperationException)
  904. );
  905. xs.Subscriptions.AssertEqual(
  906. Subscribe(200, 250)
  907. );
  908. }
  909. [Fact]
  910. public void Average_Int32_Return()
  911. {
  912. var scheduler = new TestScheduler();
  913. var xs = scheduler.CreateHotObservable(
  914. OnNext(150, 1),
  915. OnNext(210, 2),
  916. OnCompleted<int>(250)
  917. );
  918. var res = scheduler.Start(() =>
  919. xs.Average()
  920. );
  921. res.Messages.AssertEqual(
  922. OnNext(250, 2.0),
  923. OnCompleted<double>(250)
  924. );
  925. xs.Subscriptions.AssertEqual(
  926. Subscribe(200, 250)
  927. );
  928. }
  929. [Fact]
  930. public void Average_Int32_Some()
  931. {
  932. var scheduler = new TestScheduler();
  933. var xs = scheduler.CreateHotObservable(
  934. OnNext(150, 1),
  935. OnNext(210, 3),
  936. OnNext(220, 4),
  937. OnNext(230, 2),
  938. OnCompleted<int>(250)
  939. );
  940. var res = scheduler.Start(() =>
  941. xs.Average()
  942. );
  943. res.Messages.AssertEqual(
  944. OnNext(250, 3.0),
  945. OnCompleted<double>(250)
  946. );
  947. xs.Subscriptions.AssertEqual(
  948. Subscribe(200, 250)
  949. );
  950. }
  951. [Fact]
  952. public void Average_Int32_Throw()
  953. {
  954. var ex = new Exception();
  955. var scheduler = new TestScheduler();
  956. var xs = scheduler.CreateHotObservable(
  957. OnNext(150, 1),
  958. OnError<int>(210, ex)
  959. );
  960. var res = scheduler.Start(() =>
  961. xs.Average()
  962. );
  963. res.Messages.AssertEqual(
  964. OnError<double>(210, ex)
  965. );
  966. xs.Subscriptions.AssertEqual(
  967. Subscribe(200, 210)
  968. );
  969. }
  970. [Fact]
  971. public void Average_Int32_Never()
  972. {
  973. var ex = new Exception();
  974. var scheduler = new TestScheduler();
  975. var xs = scheduler.CreateHotObservable(
  976. OnNext(150, 1)
  977. );
  978. var res = scheduler.Start(() =>
  979. xs.Average()
  980. );
  981. res.Messages.AssertEqual(
  982. );
  983. xs.Subscriptions.AssertEqual(
  984. Subscribe(200, 1000)
  985. );
  986. }
  987. [Fact]
  988. public void Average_Int64_Empty()
  989. {
  990. var scheduler = new TestScheduler();
  991. var xs = scheduler.CreateHotObservable(
  992. OnNext(150, 1L),
  993. OnCompleted<long>(250)
  994. );
  995. var res = scheduler.Start(() =>
  996. xs.Average()
  997. );
  998. res.Messages.AssertEqual(
  999. OnError<double>(250, e => e is InvalidOperationException)
  1000. );
  1001. xs.Subscriptions.AssertEqual(
  1002. Subscribe(200, 250)
  1003. );
  1004. }
  1005. [Fact]
  1006. public void Average_Int64_Return()
  1007. {
  1008. var scheduler = new TestScheduler();
  1009. var xs = scheduler.CreateHotObservable(
  1010. OnNext(150, 1L),
  1011. OnNext(210, 2L),
  1012. OnCompleted<long>(250)
  1013. );
  1014. var res = scheduler.Start(() =>
  1015. xs.Average()
  1016. );
  1017. res.Messages.AssertEqual(
  1018. OnNext(250, 2.0),
  1019. OnCompleted<double>(250)
  1020. );
  1021. xs.Subscriptions.AssertEqual(
  1022. Subscribe(200, 250)
  1023. );
  1024. }
  1025. [Fact]
  1026. public void Average_Int64_Some()
  1027. {
  1028. var scheduler = new TestScheduler();
  1029. var xs = scheduler.CreateHotObservable(
  1030. OnNext(150, 1L),
  1031. OnNext(210, 3L),
  1032. OnNext(220, 4L),
  1033. OnNext(230, 2L),
  1034. OnCompleted<long>(250)
  1035. );
  1036. var res = scheduler.Start(() =>
  1037. xs.Average()
  1038. );
  1039. res.Messages.AssertEqual(
  1040. OnNext(250, 3.0),
  1041. OnCompleted<double>(250)
  1042. );
  1043. xs.Subscriptions.AssertEqual(
  1044. Subscribe(200, 250)
  1045. );
  1046. }
  1047. [Fact]
  1048. public void Average_Int64_Throw()
  1049. {
  1050. var ex = new Exception();
  1051. var scheduler = new TestScheduler();
  1052. var xs = scheduler.CreateHotObservable(
  1053. OnNext(150, 1L),
  1054. OnError<long>(210, ex)
  1055. );
  1056. var res = scheduler.Start(() =>
  1057. xs.Average()
  1058. );
  1059. res.Messages.AssertEqual(
  1060. OnError<double>(210, ex)
  1061. );
  1062. xs.Subscriptions.AssertEqual(
  1063. Subscribe(200, 210)
  1064. );
  1065. }
  1066. [Fact]
  1067. public void Average_Int64_Never()
  1068. {
  1069. var ex = new Exception();
  1070. var scheduler = new TestScheduler();
  1071. var xs = scheduler.CreateHotObservable(
  1072. OnNext(150, 1L)
  1073. );
  1074. var res = scheduler.Start(() =>
  1075. xs.Average()
  1076. );
  1077. res.Messages.AssertEqual(
  1078. );
  1079. xs.Subscriptions.AssertEqual(
  1080. Subscribe(200, 1000)
  1081. );
  1082. }
  1083. [Fact]
  1084. public void Average_Double_Empty()
  1085. {
  1086. var scheduler = new TestScheduler();
  1087. var xs = scheduler.CreateHotObservable(
  1088. OnNext(150, 1.0),
  1089. OnCompleted<double>(250)
  1090. );
  1091. var res = scheduler.Start(() =>
  1092. xs.Average()
  1093. );
  1094. res.Messages.AssertEqual(
  1095. OnError<double>(250, e => e is InvalidOperationException)
  1096. );
  1097. xs.Subscriptions.AssertEqual(
  1098. Subscribe(200, 250)
  1099. );
  1100. }
  1101. [Fact]
  1102. public void Average_Double_Return()
  1103. {
  1104. var scheduler = new TestScheduler();
  1105. var xs = scheduler.CreateHotObservable(
  1106. OnNext(150, 1.0),
  1107. OnNext(210, 2.0),
  1108. OnCompleted<double>(250)
  1109. );
  1110. var res = scheduler.Start(() =>
  1111. xs.Average()
  1112. );
  1113. res.Messages.AssertEqual(
  1114. OnNext(250, 2.0),
  1115. OnCompleted<double>(250)
  1116. );
  1117. xs.Subscriptions.AssertEqual(
  1118. Subscribe(200, 250)
  1119. );
  1120. }
  1121. [Fact]
  1122. public void Average_Double_Some()
  1123. {
  1124. var scheduler = new TestScheduler();
  1125. var xs = scheduler.CreateHotObservable(
  1126. OnNext(150, 1.0),
  1127. OnNext(210, 3.0),
  1128. OnNext(220, 4.0),
  1129. OnNext(230, 2.0),
  1130. OnCompleted<double>(250)
  1131. );
  1132. var res = scheduler.Start(() =>
  1133. xs.Average()
  1134. );
  1135. res.Messages.AssertEqual(
  1136. OnNext(250, 3.0),
  1137. OnCompleted<double>(250)
  1138. );
  1139. xs.Subscriptions.AssertEqual(
  1140. Subscribe(200, 250)
  1141. );
  1142. }
  1143. [Fact]
  1144. public void Average_Double_Throw()
  1145. {
  1146. var ex = new Exception();
  1147. var scheduler = new TestScheduler();
  1148. var xs = scheduler.CreateHotObservable(
  1149. OnNext(150, 1.0),
  1150. OnError<double>(210, ex)
  1151. );
  1152. var res = scheduler.Start(() =>
  1153. xs.Average()
  1154. );
  1155. res.Messages.AssertEqual(
  1156. OnError<double>(210, ex)
  1157. );
  1158. xs.Subscriptions.AssertEqual(
  1159. Subscribe(200, 210)
  1160. );
  1161. }
  1162. [Fact]
  1163. public void Average_Double_Never()
  1164. {
  1165. var ex = new Exception();
  1166. var scheduler = new TestScheduler();
  1167. var xs = scheduler.CreateHotObservable(
  1168. OnNext(150, 1.0)
  1169. );
  1170. var res = scheduler.Start(() =>
  1171. xs.Average()
  1172. );
  1173. res.Messages.AssertEqual(
  1174. );
  1175. xs.Subscriptions.AssertEqual(
  1176. Subscribe(200, 1000)
  1177. );
  1178. }
  1179. [Fact]
  1180. public void Average_Float_Empty()
  1181. {
  1182. var scheduler = new TestScheduler();
  1183. var xs = scheduler.CreateHotObservable(
  1184. OnNext(150, 1f),
  1185. OnCompleted<float>(250)
  1186. );
  1187. var res = scheduler.Start(() =>
  1188. xs.Average()
  1189. );
  1190. res.Messages.AssertEqual(
  1191. OnError<float>(250, e => e is InvalidOperationException)
  1192. );
  1193. xs.Subscriptions.AssertEqual(
  1194. Subscribe(200, 250)
  1195. );
  1196. }
  1197. [Fact]
  1198. public void Average_Float_Return()
  1199. {
  1200. var scheduler = new TestScheduler();
  1201. var xs = scheduler.CreateHotObservable(
  1202. OnNext(150, 1f),
  1203. OnNext(210, 2f),
  1204. OnCompleted<float>(250)
  1205. );
  1206. var res = scheduler.Start(() =>
  1207. xs.Average()
  1208. );
  1209. res.Messages.AssertEqual(
  1210. OnNext(250, 2f),
  1211. OnCompleted<float>(250)
  1212. );
  1213. xs.Subscriptions.AssertEqual(
  1214. Subscribe(200, 250)
  1215. );
  1216. }
  1217. [Fact]
  1218. public void Average_Float_Some()
  1219. {
  1220. var scheduler = new TestScheduler();
  1221. var xs = scheduler.CreateHotObservable(
  1222. OnNext(150, 1f),
  1223. OnNext(210, 3f),
  1224. OnNext(220, 4f),
  1225. OnNext(230, 2f),
  1226. OnCompleted<float>(250)
  1227. );
  1228. var res = scheduler.Start(() =>
  1229. xs.Average()
  1230. );
  1231. res.Messages.AssertEqual(
  1232. OnNext(250, 3f),
  1233. OnCompleted<float>(250)
  1234. );
  1235. xs.Subscriptions.AssertEqual(
  1236. Subscribe(200, 250)
  1237. );
  1238. }
  1239. [Fact]
  1240. public void Average_Float_Throw()
  1241. {
  1242. var ex = new Exception();
  1243. var scheduler = new TestScheduler();
  1244. var xs = scheduler.CreateHotObservable(
  1245. OnNext(150, 1f),
  1246. OnError<float>(210, ex)
  1247. );
  1248. var res = scheduler.Start(() =>
  1249. xs.Average()
  1250. );
  1251. res.Messages.AssertEqual(
  1252. OnError<float>(210, ex)
  1253. );
  1254. xs.Subscriptions.AssertEqual(
  1255. Subscribe(200, 210)
  1256. );
  1257. }
  1258. [Fact]
  1259. public void Average_Float_Never()
  1260. {
  1261. var ex = new Exception();
  1262. var scheduler = new TestScheduler();
  1263. var xs = scheduler.CreateHotObservable(
  1264. OnNext(150, 1f)
  1265. );
  1266. var res = scheduler.Start(() =>
  1267. xs.Average()
  1268. );
  1269. res.Messages.AssertEqual(
  1270. );
  1271. xs.Subscriptions.AssertEqual(
  1272. Subscribe(200, 1000)
  1273. );
  1274. }
  1275. [Fact]
  1276. public void Average_Decimal_Empty()
  1277. {
  1278. var scheduler = new TestScheduler();
  1279. var xs = scheduler.CreateHotObservable(
  1280. OnNext(150, 1m),
  1281. OnCompleted<decimal>(250)
  1282. );
  1283. var res = scheduler.Start(() =>
  1284. xs.Average()
  1285. );
  1286. res.Messages.AssertEqual(
  1287. OnError<decimal>(250, e => e is InvalidOperationException)
  1288. );
  1289. xs.Subscriptions.AssertEqual(
  1290. Subscribe(200, 250)
  1291. );
  1292. }
  1293. [Fact]
  1294. public void Average_Decimal_Return()
  1295. {
  1296. var scheduler = new TestScheduler();
  1297. var xs = scheduler.CreateHotObservable(
  1298. OnNext(150, 1m),
  1299. OnNext(210, 2m),
  1300. OnCompleted<decimal>(250)
  1301. );
  1302. var res = scheduler.Start(() =>
  1303. xs.Average()
  1304. );
  1305. res.Messages.AssertEqual(
  1306. OnNext(250, 2m),
  1307. OnCompleted<decimal>(250)
  1308. );
  1309. xs.Subscriptions.AssertEqual(
  1310. Subscribe(200, 250)
  1311. );
  1312. }
  1313. [Fact]
  1314. public void Average_Decimal_Some()
  1315. {
  1316. var scheduler = new TestScheduler();
  1317. var xs = scheduler.CreateHotObservable(
  1318. OnNext(150, 1m),
  1319. OnNext(210, 3m),
  1320. OnNext(220, 4m),
  1321. OnNext(230, 2m),
  1322. OnCompleted<decimal>(250)
  1323. );
  1324. var res = scheduler.Start(() =>
  1325. xs.Average()
  1326. );
  1327. res.Messages.AssertEqual(
  1328. OnNext(250, 3m),
  1329. OnCompleted<decimal>(250)
  1330. );
  1331. xs.Subscriptions.AssertEqual(
  1332. Subscribe(200, 250)
  1333. );
  1334. }
  1335. [Fact]
  1336. public void Average_Decimal_Throw()
  1337. {
  1338. var ex = new Exception();
  1339. var scheduler = new TestScheduler();
  1340. var xs = scheduler.CreateHotObservable(
  1341. OnNext(150, 1m),
  1342. OnError<decimal>(210, ex)
  1343. );
  1344. var res = scheduler.Start(() =>
  1345. xs.Average()
  1346. );
  1347. res.Messages.AssertEqual(
  1348. OnError<decimal>(210, ex)
  1349. );
  1350. xs.Subscriptions.AssertEqual(
  1351. Subscribe(200, 210)
  1352. );
  1353. }
  1354. [Fact]
  1355. public void Average_Decimal_Never()
  1356. {
  1357. var ex = new Exception();
  1358. var scheduler = new TestScheduler();
  1359. var xs = scheduler.CreateHotObservable(
  1360. OnNext(150, 1m)
  1361. );
  1362. var res = scheduler.Start(() =>
  1363. xs.Average()
  1364. );
  1365. res.Messages.AssertEqual(
  1366. );
  1367. xs.Subscriptions.AssertEqual(
  1368. Subscribe(200, 1000)
  1369. );
  1370. }
  1371. [Fact]
  1372. public void Average_Nullable_Int32_Empty()
  1373. {
  1374. var scheduler = new TestScheduler();
  1375. var xs = scheduler.CreateHotObservable(
  1376. OnNext(150, (int?)1),
  1377. OnCompleted<int?>(250)
  1378. );
  1379. var res = scheduler.Start(() =>
  1380. xs.Average()
  1381. );
  1382. res.Messages.AssertEqual(
  1383. OnNext(250, (double?)null),
  1384. OnCompleted<double?>(250)
  1385. );
  1386. xs.Subscriptions.AssertEqual(
  1387. Subscribe(200, 250)
  1388. );
  1389. }
  1390. [Fact]
  1391. public void Average_Nullable_Int32_Return()
  1392. {
  1393. var scheduler = new TestScheduler();
  1394. var xs = scheduler.CreateHotObservable(
  1395. OnNext(150, (int?)1),
  1396. OnNext(210, (int?)2),
  1397. OnCompleted<int?>(250)
  1398. );
  1399. var res = scheduler.Start(() =>
  1400. xs.Average()
  1401. );
  1402. res.Messages.AssertEqual(
  1403. OnNext(250, (double?)2.0),
  1404. OnCompleted<double?>(250)
  1405. );
  1406. xs.Subscriptions.AssertEqual(
  1407. Subscribe(200, 250)
  1408. );
  1409. }
  1410. [Fact]
  1411. public void Average_Nullable_Int32_Some()
  1412. {
  1413. var scheduler = new TestScheduler();
  1414. var xs = scheduler.CreateHotObservable(
  1415. OnNext(150, (int?)1),
  1416. OnNext(210, (int?)3),
  1417. OnNext(220, (int?)null),
  1418. OnNext(230, (int?)2),
  1419. OnCompleted<int?>(250)
  1420. );
  1421. var res = scheduler.Start(() =>
  1422. xs.Average()
  1423. );
  1424. res.Messages.AssertEqual(
  1425. OnNext(250, (double?)2.5),
  1426. OnCompleted<double?>(250)
  1427. );
  1428. xs.Subscriptions.AssertEqual(
  1429. Subscribe(200, 250)
  1430. );
  1431. }
  1432. [Fact]
  1433. public void Average_Nullable_Int32_Throw()
  1434. {
  1435. var ex = new Exception();
  1436. var scheduler = new TestScheduler();
  1437. var xs = scheduler.CreateHotObservable(
  1438. OnNext(150, (int?)1),
  1439. OnError<int?>(210, ex)
  1440. );
  1441. var res = scheduler.Start(() =>
  1442. xs.Average()
  1443. );
  1444. res.Messages.AssertEqual(
  1445. OnError<double?>(210, ex)
  1446. );
  1447. xs.Subscriptions.AssertEqual(
  1448. Subscribe(200, 210)
  1449. );
  1450. }
  1451. [Fact]
  1452. public void Average_Nullable_Int32_Never()
  1453. {
  1454. var ex = new Exception();
  1455. var scheduler = new TestScheduler();
  1456. var xs = scheduler.CreateHotObservable(
  1457. OnNext(150, (int?)1)
  1458. );
  1459. var res = scheduler.Start(() =>
  1460. xs.Average()
  1461. );
  1462. res.Messages.AssertEqual(
  1463. );
  1464. xs.Subscriptions.AssertEqual(
  1465. Subscribe(200, 1000)
  1466. );
  1467. }
  1468. [Fact]
  1469. public void Average_Nullable_Int64_Empty()
  1470. {
  1471. var scheduler = new TestScheduler();
  1472. var xs = scheduler.CreateHotObservable(
  1473. OnNext(150, (long?)1L),
  1474. OnCompleted<long?>(250)
  1475. );
  1476. var res = scheduler.Start(() =>
  1477. xs.Average()
  1478. );
  1479. res.Messages.AssertEqual(
  1480. OnNext(250, (double?)null),
  1481. OnCompleted<double?>(250)
  1482. );
  1483. xs.Subscriptions.AssertEqual(
  1484. Subscribe(200, 250)
  1485. );
  1486. }
  1487. [Fact]
  1488. public void Average_Nullable_Int64_Return()
  1489. {
  1490. var scheduler = new TestScheduler();
  1491. var xs = scheduler.CreateHotObservable(
  1492. OnNext(150, (long?)1L),
  1493. OnNext(210, (long?)2L),
  1494. OnCompleted<long?>(250)
  1495. );
  1496. var res = scheduler.Start(() =>
  1497. xs.Average()
  1498. );
  1499. res.Messages.AssertEqual(
  1500. OnNext(250, (double?)2.0),
  1501. OnCompleted<double?>(250)
  1502. );
  1503. xs.Subscriptions.AssertEqual(
  1504. Subscribe(200, 250)
  1505. );
  1506. }
  1507. [Fact]
  1508. public void Average_Nullable_Int64_Some()
  1509. {
  1510. var scheduler = new TestScheduler();
  1511. var xs = scheduler.CreateHotObservable(
  1512. OnNext(150, (long?)1L),
  1513. OnNext(210, (long?)3L),
  1514. OnNext(220, (long?)null),
  1515. OnNext(230, (long?)2L),
  1516. OnCompleted<long?>(250)
  1517. );
  1518. var res = scheduler.Start(() =>
  1519. xs.Average()
  1520. );
  1521. res.Messages.AssertEqual(
  1522. OnNext(250, (double?)2.5),
  1523. OnCompleted<double?>(250)
  1524. );
  1525. xs.Subscriptions.AssertEqual(
  1526. Subscribe(200, 250)
  1527. );
  1528. }
  1529. [Fact]
  1530. public void Average_Nullable_Int64_Throw()
  1531. {
  1532. var ex = new Exception();
  1533. var scheduler = new TestScheduler();
  1534. var xs = scheduler.CreateHotObservable(
  1535. OnNext(150, (long?)1L),
  1536. OnError<long?>(210, ex)
  1537. );
  1538. var res = scheduler.Start(() =>
  1539. xs.Average()
  1540. );
  1541. res.Messages.AssertEqual(
  1542. OnError<double?>(210, ex)
  1543. );
  1544. xs.Subscriptions.AssertEqual(
  1545. Subscribe(200, 210)
  1546. );
  1547. }
  1548. [Fact]
  1549. public void Average_Nullable_Int64_Never()
  1550. {
  1551. var ex = new Exception();
  1552. var scheduler = new TestScheduler();
  1553. var xs = scheduler.CreateHotObservable(
  1554. OnNext(150, (long?)1L)
  1555. );
  1556. var res = scheduler.Start(() =>
  1557. xs.Average()
  1558. );
  1559. res.Messages.AssertEqual(
  1560. );
  1561. xs.Subscriptions.AssertEqual(
  1562. Subscribe(200, 1000)
  1563. );
  1564. }
  1565. [Fact]
  1566. public void Average_Nullable_Double_Empty()
  1567. {
  1568. var scheduler = new TestScheduler();
  1569. var xs = scheduler.CreateHotObservable(
  1570. OnNext(150, (double?)1.0),
  1571. OnCompleted<double?>(250)
  1572. );
  1573. var res = scheduler.Start(() =>
  1574. xs.Average()
  1575. );
  1576. res.Messages.AssertEqual(
  1577. OnNext(250, (double?)null),
  1578. OnCompleted<double?>(250)
  1579. );
  1580. xs.Subscriptions.AssertEqual(
  1581. Subscribe(200, 250)
  1582. );
  1583. }
  1584. [Fact]
  1585. public void Average_Nullable_Double_Return()
  1586. {
  1587. var scheduler = new TestScheduler();
  1588. var xs = scheduler.CreateHotObservable(
  1589. OnNext(150, (double?)1.0),
  1590. OnNext(210, (double?)2.0),
  1591. OnCompleted<double?>(250)
  1592. );
  1593. var res = scheduler.Start(() =>
  1594. xs.Average()
  1595. );
  1596. res.Messages.AssertEqual(
  1597. OnNext(250, (double?)2.0),
  1598. OnCompleted<double?>(250)
  1599. );
  1600. xs.Subscriptions.AssertEqual(
  1601. Subscribe(200, 250)
  1602. );
  1603. }
  1604. [Fact]
  1605. public void Average_Nullable_Double_Some()
  1606. {
  1607. var scheduler = new TestScheduler();
  1608. var xs = scheduler.CreateHotObservable(
  1609. OnNext(150, (double?)1.0),
  1610. OnNext(210, (double?)3.0),
  1611. OnNext(220, (double?)null),
  1612. OnNext(230, (double?)2.0),
  1613. OnCompleted<double?>(250)
  1614. );
  1615. var res = scheduler.Start(() =>
  1616. xs.Average()
  1617. );
  1618. res.Messages.AssertEqual(
  1619. OnNext(250, (double?)2.5),
  1620. OnCompleted<double?>(250)
  1621. );
  1622. xs.Subscriptions.AssertEqual(
  1623. Subscribe(200, 250)
  1624. );
  1625. }
  1626. [Fact]
  1627. public void Average_Nullable_Double_Throw()
  1628. {
  1629. var ex = new Exception();
  1630. var scheduler = new TestScheduler();
  1631. var xs = scheduler.CreateHotObservable(
  1632. OnNext(150, (double?)1.0),
  1633. OnError<double?>(210, ex)
  1634. );
  1635. var res = scheduler.Start(() =>
  1636. xs.Average()
  1637. );
  1638. res.Messages.AssertEqual(
  1639. OnError<double?>(210, ex)
  1640. );
  1641. xs.Subscriptions.AssertEqual(
  1642. Subscribe(200, 210)
  1643. );
  1644. }
  1645. [Fact]
  1646. public void Average_Nullable_Double_Never()
  1647. {
  1648. var ex = new Exception();
  1649. var scheduler = new TestScheduler();
  1650. var xs = scheduler.CreateHotObservable(
  1651. OnNext(150, (double?)1.0)
  1652. );
  1653. var res = scheduler.Start(() =>
  1654. xs.Average()
  1655. );
  1656. res.Messages.AssertEqual(
  1657. );
  1658. xs.Subscriptions.AssertEqual(
  1659. Subscribe(200, 1000)
  1660. );
  1661. }
  1662. [Fact]
  1663. public void Average_Nullable_Float_Empty()
  1664. {
  1665. var scheduler = new TestScheduler();
  1666. var xs = scheduler.CreateHotObservable(
  1667. OnNext(150, (float?)1f),
  1668. OnCompleted<float?>(250)
  1669. );
  1670. var res = scheduler.Start(() =>
  1671. xs.Average()
  1672. );
  1673. res.Messages.AssertEqual(
  1674. OnNext(250, (float?)null),
  1675. OnCompleted<float?>(250)
  1676. );
  1677. xs.Subscriptions.AssertEqual(
  1678. Subscribe(200, 250)
  1679. );
  1680. }
  1681. [Fact]
  1682. public void Average_Nullable_Float_Return()
  1683. {
  1684. var scheduler = new TestScheduler();
  1685. var xs = scheduler.CreateHotObservable(
  1686. OnNext(150, (float?)1f),
  1687. OnNext(210, (float?)2f),
  1688. OnCompleted<float?>(250)
  1689. );
  1690. var res = scheduler.Start(() =>
  1691. xs.Average()
  1692. );
  1693. res.Messages.AssertEqual(
  1694. OnNext(250, (float?)2f),
  1695. OnCompleted<float?>(250)
  1696. );
  1697. xs.Subscriptions.AssertEqual(
  1698. Subscribe(200, 250)
  1699. );
  1700. }
  1701. [Fact]
  1702. public void Average_Nullable_Float_Some()
  1703. {
  1704. var scheduler = new TestScheduler();
  1705. var xs = scheduler.CreateHotObservable(
  1706. OnNext(150, (float?)1f),
  1707. OnNext(210, (float?)3f),
  1708. OnNext(220, (float?)null),
  1709. OnNext(230, (float?)2f),
  1710. OnCompleted<float?>(250)
  1711. );
  1712. var res = scheduler.Start(() =>
  1713. xs.Average()
  1714. );
  1715. res.Messages.AssertEqual(
  1716. OnNext(250, (float?)2.5f),
  1717. OnCompleted<float?>(250)
  1718. );
  1719. xs.Subscriptions.AssertEqual(
  1720. Subscribe(200, 250)
  1721. );
  1722. }
  1723. [Fact]
  1724. public void Average_Nullable_Float_Throw()
  1725. {
  1726. var ex = new Exception();
  1727. var scheduler = new TestScheduler();
  1728. var xs = scheduler.CreateHotObservable(
  1729. OnNext(150, (float?)1f),
  1730. OnError<float?>(210, ex)
  1731. );
  1732. var res = scheduler.Start(() =>
  1733. xs.Average()
  1734. );
  1735. res.Messages.AssertEqual(
  1736. OnError<float?>(210, ex)
  1737. );
  1738. xs.Subscriptions.AssertEqual(
  1739. Subscribe(200, 210)
  1740. );
  1741. }
  1742. [Fact]
  1743. public void Average_Nullable_Float_Never()
  1744. {
  1745. var ex = new Exception();
  1746. var scheduler = new TestScheduler();
  1747. var xs = scheduler.CreateHotObservable(
  1748. OnNext(150, (float?)1f)
  1749. );
  1750. var res = scheduler.Start(() =>
  1751. xs.Average()
  1752. );
  1753. res.Messages.AssertEqual(
  1754. );
  1755. xs.Subscriptions.AssertEqual(
  1756. Subscribe(200, 1000)
  1757. );
  1758. }
  1759. [Fact]
  1760. public void Average_Nullable_Decimal_Empty()
  1761. {
  1762. var scheduler = new TestScheduler();
  1763. var xs = scheduler.CreateHotObservable(
  1764. OnNext(150, (decimal?)1m),
  1765. OnCompleted<decimal?>(250)
  1766. );
  1767. var res = scheduler.Start(() =>
  1768. xs.Average()
  1769. );
  1770. res.Messages.AssertEqual(
  1771. OnNext(250, (decimal?)null),
  1772. OnCompleted<decimal?>(250)
  1773. );
  1774. xs.Subscriptions.AssertEqual(
  1775. Subscribe(200, 250)
  1776. );
  1777. }
  1778. [Fact]
  1779. public void Average_Nullable_Decimal_Return()
  1780. {
  1781. var scheduler = new TestScheduler();
  1782. var xs = scheduler.CreateHotObservable(
  1783. OnNext(150, (decimal?)1m),
  1784. OnNext(210, (decimal?)2m),
  1785. OnCompleted<decimal?>(250)
  1786. );
  1787. var res = scheduler.Start(() =>
  1788. xs.Average()
  1789. );
  1790. res.Messages.AssertEqual(
  1791. OnNext(250, (decimal?)2m),
  1792. OnCompleted<decimal?>(250)
  1793. );
  1794. xs.Subscriptions.AssertEqual(
  1795. Subscribe(200, 250)
  1796. );
  1797. }
  1798. [Fact]
  1799. public void Average_Nullable_Decimal_Some()
  1800. {
  1801. var scheduler = new TestScheduler();
  1802. var xs = scheduler.CreateHotObservable(
  1803. OnNext(150, (decimal?)1m),
  1804. OnNext(210, (decimal?)3m),
  1805. OnNext(220, (decimal?)null),
  1806. OnNext(230, (decimal?)2m),
  1807. OnCompleted<decimal?>(250)
  1808. );
  1809. var res = scheduler.Start(() =>
  1810. xs.Average()
  1811. );
  1812. res.Messages.AssertEqual(
  1813. OnNext(250, (decimal?)2.5m),
  1814. OnCompleted<decimal?>(250)
  1815. );
  1816. xs.Subscriptions.AssertEqual(
  1817. Subscribe(200, 250)
  1818. );
  1819. }
  1820. [Fact]
  1821. public void Average_Nullable_Decimal_Throw()
  1822. {
  1823. var ex = new Exception();
  1824. var scheduler = new TestScheduler();
  1825. var xs = scheduler.CreateHotObservable(
  1826. OnNext(150, (decimal?)1m),
  1827. OnError<decimal?>(210, ex)
  1828. );
  1829. var res = scheduler.Start(() =>
  1830. xs.Average()
  1831. );
  1832. res.Messages.AssertEqual(
  1833. OnError<decimal?>(210, ex)
  1834. );
  1835. xs.Subscriptions.AssertEqual(
  1836. Subscribe(200, 210)
  1837. );
  1838. }
  1839. [Fact]
  1840. public void Average_Nullable_Decimal_Never()
  1841. {
  1842. var ex = new Exception();
  1843. var scheduler = new TestScheduler();
  1844. var xs = scheduler.CreateHotObservable(
  1845. OnNext(150, (decimal?)1m)
  1846. );
  1847. var res = scheduler.Start(() =>
  1848. xs.Average()
  1849. );
  1850. res.Messages.AssertEqual(
  1851. );
  1852. xs.Subscriptions.AssertEqual(
  1853. Subscribe(200, 1000)
  1854. );
  1855. }
  1856. #if !NO_PERF
  1857. #if !NO_THREAD
  1858. [Fact]
  1859. public void Average_InjectOverflow_Int32()
  1860. {
  1861. var xs = Observable.Return(42, ThreadPoolScheduler.Instance);
  1862. var res = new OverflowInjection<int>(xs, long.MaxValue).Average();
  1863. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1864. }
  1865. [Fact]
  1866. public void Average_InjectOverflow_Int64()
  1867. {
  1868. var xs = Observable.Return(42L, ThreadPoolScheduler.Instance);
  1869. var res = new OverflowInjection<long>(xs, long.MaxValue).Average();
  1870. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1871. }
  1872. [Fact]
  1873. public void Average_InjectOverflow_Double()
  1874. {
  1875. var xs = Observable.Return(42.0, ThreadPoolScheduler.Instance);
  1876. var res = new OverflowInjection<double>(xs, long.MaxValue).Average();
  1877. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1878. }
  1879. [Fact]
  1880. public void Average_InjectOverflow_Single()
  1881. {
  1882. var xs = Observable.Return(42.0f, ThreadPoolScheduler.Instance);
  1883. var res = new OverflowInjection<float>(xs, long.MaxValue).Average();
  1884. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1885. }
  1886. [Fact]
  1887. public void Average_InjectOverflow_Decimal()
  1888. {
  1889. var xs = Observable.Return(42.0m, ThreadPoolScheduler.Instance);
  1890. var res = new OverflowInjection<decimal>(xs, long.MaxValue).Average();
  1891. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1892. }
  1893. [Fact]
  1894. public void Average_InjectOverflow_Int32_Nullable()
  1895. {
  1896. var xs = Observable.Return((int?)42, ThreadPoolScheduler.Instance);
  1897. var res = new OverflowInjection<int?>(xs, long.MaxValue).Average();
  1898. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1899. }
  1900. [Fact]
  1901. public void Average_InjectOverflow_Int64_Nullable()
  1902. {
  1903. var xs = Observable.Return((long?)42L, ThreadPoolScheduler.Instance);
  1904. var res = new OverflowInjection<long?>(xs, long.MaxValue).Average();
  1905. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1906. }
  1907. [Fact]
  1908. public void Average_InjectOverflow_Double_Nullable()
  1909. {
  1910. var xs = Observable.Return((double?)42.0, ThreadPoolScheduler.Instance);
  1911. var res = new OverflowInjection<double?>(xs, long.MaxValue).Average();
  1912. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1913. }
  1914. [Fact]
  1915. public void Average_InjectOverflow_Single_Nullable()
  1916. {
  1917. var xs = Observable.Return((float?)42.0f, ThreadPoolScheduler.Instance);
  1918. var res = new OverflowInjection<float?>(xs, long.MaxValue).Average();
  1919. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1920. }
  1921. [Fact]
  1922. public void Average_InjectOverflow_Decimal_Nullable()
  1923. {
  1924. var xs = Observable.Return((decimal?)42.0m, ThreadPoolScheduler.Instance);
  1925. var res = new OverflowInjection<decimal?>(xs, long.MaxValue).Average();
  1926. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  1927. }
  1928. #endif
  1929. #if !CRIPPLED_REFLECTION || NETCOREAPP1_1 || NETCOREAPP1_0
  1930. class OverflowInjection<T> : IObservable<T>
  1931. {
  1932. private readonly IObservable<T> _source;
  1933. private readonly object _initialCount;
  1934. public OverflowInjection(IObservable<T> source, object initialCount)
  1935. {
  1936. _source = source;
  1937. _initialCount = initialCount;
  1938. }
  1939. public IDisposable Subscribe(IObserver<T> observer)
  1940. {
  1941. var f = observer.GetType().GetField("_count", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
  1942. f.SetValue(observer, _initialCount);
  1943. return _source.Subscribe(observer);
  1944. }
  1945. }
  1946. #endif
  1947. #endif
  1948. [Fact]
  1949. public void Average_Selector_Regular_Int32()
  1950. {
  1951. var scheduler = new TestScheduler();
  1952. var xs = scheduler.CreateHotObservable<string>(
  1953. OnNext(210, "b"),
  1954. OnNext(220, "fo"),
  1955. OnNext(230, "qux"),
  1956. OnCompleted<string>(240)
  1957. );
  1958. var res = scheduler.Start(() => xs.Average(x => (int)x.Length));
  1959. res.Messages.AssertEqual(
  1960. OnNext(240, 2.0),
  1961. OnCompleted<double>(240)
  1962. );
  1963. xs.Subscriptions.AssertEqual(
  1964. Subscribe(200, 240)
  1965. );
  1966. }
  1967. [Fact]
  1968. public void Average_Selector_Regular_Int64()
  1969. {
  1970. var scheduler = new TestScheduler();
  1971. var xs = scheduler.CreateHotObservable<string>(
  1972. OnNext(210, "b"),
  1973. OnNext(220, "fo"),
  1974. OnNext(230, "qux"),
  1975. OnCompleted<string>(240)
  1976. );
  1977. var res = scheduler.Start(() => xs.Average(x => (long)x.Length));
  1978. res.Messages.AssertEqual(
  1979. OnNext(240, 2.0),
  1980. OnCompleted<double>(240)
  1981. );
  1982. xs.Subscriptions.AssertEqual(
  1983. Subscribe(200, 240)
  1984. );
  1985. }
  1986. [Fact]
  1987. public void Average_Selector_Regular_Single()
  1988. {
  1989. var scheduler = new TestScheduler();
  1990. var xs = scheduler.CreateHotObservable<string>(
  1991. OnNext(210, "b"),
  1992. OnNext(220, "fo"),
  1993. OnNext(230, "qux"),
  1994. OnCompleted<string>(240)
  1995. );
  1996. var res = scheduler.Start(() => xs.Average(x => (float)x.Length));
  1997. res.Messages.AssertEqual(
  1998. OnNext(240, 2.0f),
  1999. OnCompleted<float>(240)
  2000. );
  2001. xs.Subscriptions.AssertEqual(
  2002. Subscribe(200, 240)
  2003. );
  2004. }
  2005. [Fact]
  2006. public void Average_Selector_Regular_Double()
  2007. {
  2008. var scheduler = new TestScheduler();
  2009. var xs = scheduler.CreateHotObservable<string>(
  2010. OnNext(210, "b"),
  2011. OnNext(220, "fo"),
  2012. OnNext(230, "qux"),
  2013. OnCompleted<string>(240)
  2014. );
  2015. var res = scheduler.Start(() => xs.Average(x => (double)x.Length));
  2016. res.Messages.AssertEqual(
  2017. OnNext(240, 2.0),
  2018. OnCompleted<double>(240)
  2019. );
  2020. xs.Subscriptions.AssertEqual(
  2021. Subscribe(200, 240)
  2022. );
  2023. }
  2024. [Fact]
  2025. public void Average_Selector_Regular_Decimal()
  2026. {
  2027. var scheduler = new TestScheduler();
  2028. var xs = scheduler.CreateHotObservable<string>(
  2029. OnNext(210, "b"),
  2030. OnNext(220, "fo"),
  2031. OnNext(230, "qux"),
  2032. OnCompleted<string>(240)
  2033. );
  2034. var res = scheduler.Start(() => xs.Average(x => (decimal)x.Length));
  2035. res.Messages.AssertEqual(
  2036. OnNext(240, 2.0m),
  2037. OnCompleted<decimal>(240)
  2038. );
  2039. xs.Subscriptions.AssertEqual(
  2040. Subscribe(200, 240)
  2041. );
  2042. }
  2043. [Fact]
  2044. public void Average_Selector_Regular_Int32_Nullable()
  2045. {
  2046. var scheduler = new TestScheduler();
  2047. var xs = scheduler.CreateHotObservable<string>(
  2048. OnNext(210, "b"),
  2049. OnNext(220, "fo"),
  2050. OnNext(230, "qux"),
  2051. OnCompleted<string>(240)
  2052. );
  2053. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(int?) : x.Length));
  2054. res.Messages.AssertEqual(
  2055. OnNext(240, (double?)2.0),
  2056. OnCompleted<double?>(240)
  2057. );
  2058. xs.Subscriptions.AssertEqual(
  2059. Subscribe(200, 240)
  2060. );
  2061. }
  2062. [Fact]
  2063. public void Average_Selector_Regular_Int64_Nullable()
  2064. {
  2065. var scheduler = new TestScheduler();
  2066. var xs = scheduler.CreateHotObservable<string>(
  2067. OnNext(210, "b"),
  2068. OnNext(220, "fo"),
  2069. OnNext(230, "qux"),
  2070. OnCompleted<string>(240)
  2071. );
  2072. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(long?) : x.Length));
  2073. res.Messages.AssertEqual(
  2074. OnNext(240, (double?)2.0),
  2075. OnCompleted<double?>(240)
  2076. );
  2077. xs.Subscriptions.AssertEqual(
  2078. Subscribe(200, 240)
  2079. );
  2080. }
  2081. [Fact]
  2082. public void Average_Selector_Regular_Single_Nullable()
  2083. {
  2084. var scheduler = new TestScheduler();
  2085. var xs = scheduler.CreateHotObservable<string>(
  2086. OnNext(210, "b"),
  2087. OnNext(220, "fo"),
  2088. OnNext(230, "qux"),
  2089. OnCompleted<string>(240)
  2090. );
  2091. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(float?) : x.Length));
  2092. res.Messages.AssertEqual(
  2093. OnNext(240, (float?)2.0),
  2094. OnCompleted<float?>(240)
  2095. );
  2096. xs.Subscriptions.AssertEqual(
  2097. Subscribe(200, 240)
  2098. );
  2099. }
  2100. [Fact]
  2101. public void Average_Selector_Regular_Double_Nullable()
  2102. {
  2103. var scheduler = new TestScheduler();
  2104. var xs = scheduler.CreateHotObservable<string>(
  2105. OnNext(210, "b"),
  2106. OnNext(220, "fo"),
  2107. OnNext(230, "qux"),
  2108. OnCompleted<string>(240)
  2109. );
  2110. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(double?) : x.Length));
  2111. res.Messages.AssertEqual(
  2112. OnNext(240, (double?)2.0),
  2113. OnCompleted<double?>(240)
  2114. );
  2115. xs.Subscriptions.AssertEqual(
  2116. Subscribe(200, 240)
  2117. );
  2118. }
  2119. [Fact]
  2120. public void Average_Selector_Regular_Decimal_Nullable()
  2121. {
  2122. var scheduler = new TestScheduler();
  2123. var xs = scheduler.CreateHotObservable<string>(
  2124. OnNext(210, "b"),
  2125. OnNext(220, "fo"),
  2126. OnNext(230, "qux"),
  2127. OnCompleted<string>(240)
  2128. );
  2129. var res = scheduler.Start(() => xs.Average(x => x == "fo" ? default(decimal?) : x.Length));
  2130. res.Messages.AssertEqual(
  2131. OnNext(240, (decimal?)2.0),
  2132. OnCompleted<decimal?>(240)
  2133. );
  2134. xs.Subscriptions.AssertEqual(
  2135. Subscribe(200, 240)
  2136. );
  2137. }
  2138. #endregion
  2139. #region + Contains +
  2140. [Fact]
  2141. public void Contains_ArgumentChecking()
  2142. {
  2143. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Contains(default(IObservable<int>), 42));
  2144. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Contains(default(IObservable<int>), 42, EqualityComparer<int>.Default));
  2145. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Contains(DummyObservable<int>.Instance, 42, null));
  2146. }
  2147. [Fact]
  2148. public void Contains_Empty()
  2149. {
  2150. var scheduler = new TestScheduler();
  2151. var xs = scheduler.CreateHotObservable(
  2152. OnNext(150, 1),
  2153. OnCompleted<int>(250)
  2154. );
  2155. var res = scheduler.Start(() =>
  2156. xs.Contains(42)
  2157. );
  2158. res.Messages.AssertEqual(
  2159. OnNext(250, false),
  2160. OnCompleted<bool>(250)
  2161. );
  2162. xs.Subscriptions.AssertEqual(
  2163. Subscribe(200, 250)
  2164. );
  2165. }
  2166. [Fact]
  2167. public void Contains_ReturnPositive()
  2168. {
  2169. var scheduler = new TestScheduler();
  2170. var xs = scheduler.CreateHotObservable(
  2171. OnNext(150, 1),
  2172. OnNext(210, 2),
  2173. OnCompleted<int>(250)
  2174. );
  2175. var res = scheduler.Start(() =>
  2176. xs.Contains(2)
  2177. );
  2178. res.Messages.AssertEqual(
  2179. OnNext(210, true),
  2180. OnCompleted<bool>(210)
  2181. );
  2182. xs.Subscriptions.AssertEqual(
  2183. Subscribe(200, 210)
  2184. );
  2185. }
  2186. [Fact]
  2187. public void Contains_ReturnNegative()
  2188. {
  2189. var scheduler = new TestScheduler();
  2190. var xs = scheduler.CreateHotObservable(
  2191. OnNext(150, 1),
  2192. OnNext(210, 2),
  2193. OnCompleted<int>(250)
  2194. );
  2195. var res = scheduler.Start(() =>
  2196. xs.Contains(-2)
  2197. );
  2198. res.Messages.AssertEqual(
  2199. OnNext(250, false),
  2200. OnCompleted<bool>(250)
  2201. );
  2202. xs.Subscriptions.AssertEqual(
  2203. Subscribe(200, 250)
  2204. );
  2205. }
  2206. [Fact]
  2207. public void Contains_SomePositive()
  2208. {
  2209. var scheduler = new TestScheduler();
  2210. var xs = scheduler.CreateHotObservable(
  2211. OnNext(150, 1),
  2212. OnNext(210, 2),
  2213. OnNext(220, 3),
  2214. OnNext(230, 4),
  2215. OnCompleted<int>(250)
  2216. );
  2217. var res = scheduler.Start(() =>
  2218. xs.Contains(3)
  2219. );
  2220. res.Messages.AssertEqual(
  2221. OnNext(220, true),
  2222. OnCompleted<bool>(220)
  2223. );
  2224. xs.Subscriptions.AssertEqual(
  2225. Subscribe(200, 220)
  2226. );
  2227. }
  2228. [Fact]
  2229. public void Contains_SomeNegative()
  2230. {
  2231. var scheduler = new TestScheduler();
  2232. var xs = scheduler.CreateHotObservable(
  2233. OnNext(150, 1),
  2234. OnNext(210, 2),
  2235. OnNext(220, 3),
  2236. OnNext(230, 4),
  2237. OnCompleted<int>(250)
  2238. );
  2239. var res = scheduler.Start(() =>
  2240. xs.Contains(-3)
  2241. );
  2242. res.Messages.AssertEqual(
  2243. OnNext(250, false),
  2244. OnCompleted<bool>(250)
  2245. );
  2246. xs.Subscriptions.AssertEqual(
  2247. Subscribe(200, 250)
  2248. );
  2249. }
  2250. [Fact]
  2251. public void Contains_Throw()
  2252. {
  2253. var ex = new Exception();
  2254. var scheduler = new TestScheduler();
  2255. var xs = scheduler.CreateHotObservable(
  2256. OnNext(150, 1),
  2257. OnError<int>(210, ex)
  2258. );
  2259. var res = scheduler.Start(() =>
  2260. xs.Contains(42)
  2261. );
  2262. res.Messages.AssertEqual(
  2263. OnError<bool>(210, ex)
  2264. );
  2265. xs.Subscriptions.AssertEqual(
  2266. Subscribe(200, 210)
  2267. );
  2268. }
  2269. [Fact]
  2270. public void Contains_Never()
  2271. {
  2272. var ex = new Exception();
  2273. var scheduler = new TestScheduler();
  2274. var xs = scheduler.CreateHotObservable(
  2275. OnNext(150, 1)
  2276. );
  2277. var res = scheduler.Start(() =>
  2278. xs.Contains(42)
  2279. );
  2280. res.Messages.AssertEqual(
  2281. );
  2282. xs.Subscriptions.AssertEqual(
  2283. Subscribe(200, 1000)
  2284. );
  2285. }
  2286. [Fact]
  2287. public void Contains_ComparerThrows()
  2288. {
  2289. var ex = new Exception();
  2290. var scheduler = new TestScheduler();
  2291. var xs = scheduler.CreateHotObservable(
  2292. OnNext(150, 1),
  2293. OnNext(210, 2)
  2294. );
  2295. var res = scheduler.Start(() =>
  2296. xs.Contains(42, new ContainsComparerThrows())
  2297. );
  2298. res.Messages.AssertEqual(
  2299. OnError<bool>(210, e => e is NotImplementedException)
  2300. );
  2301. xs.Subscriptions.AssertEqual(
  2302. Subscribe(200, 210)
  2303. );
  2304. }
  2305. class ContainsComparerThrows : IEqualityComparer<int>
  2306. {
  2307. public bool Equals(int x, int y)
  2308. {
  2309. throw new NotImplementedException();
  2310. }
  2311. public int GetHashCode(int obj)
  2312. {
  2313. throw new NotImplementedException();
  2314. }
  2315. }
  2316. [Fact]
  2317. public void Contains_ComparerContainsValue()
  2318. {
  2319. var ex = new Exception();
  2320. var scheduler = new TestScheduler();
  2321. var xs = scheduler.CreateHotObservable(
  2322. OnNext(150, 1),
  2323. OnNext(210, 3),
  2324. OnNext(220, 4),
  2325. OnNext(230, 8),
  2326. OnCompleted<int>(250)
  2327. );
  2328. var res = scheduler.Start(() =>
  2329. xs.Contains(42, new ContainsComparerMod2())
  2330. );
  2331. res.Messages.AssertEqual(
  2332. OnNext(220, true),
  2333. OnCompleted<bool>(220)
  2334. );
  2335. xs.Subscriptions.AssertEqual(
  2336. Subscribe(200, 220)
  2337. );
  2338. }
  2339. [Fact]
  2340. public void Contains_ComparerDoesNotContainValue()
  2341. {
  2342. var ex = new Exception();
  2343. var scheduler = new TestScheduler();
  2344. var xs = scheduler.CreateHotObservable(
  2345. OnNext(150, 1),
  2346. OnNext(210, 2),
  2347. OnNext(220, 4),
  2348. OnNext(230, 8),
  2349. OnCompleted<int>(250)
  2350. );
  2351. var res = scheduler.Start(() =>
  2352. xs.Contains(21, new ContainsComparerMod2())
  2353. );
  2354. res.Messages.AssertEqual(
  2355. OnNext(250, false),
  2356. OnCompleted<bool>(250)
  2357. );
  2358. xs.Subscriptions.AssertEqual(
  2359. Subscribe(200, 250)
  2360. );
  2361. }
  2362. class ContainsComparerMod2 : IEqualityComparer<int>
  2363. {
  2364. public bool Equals(int x, int y)
  2365. {
  2366. return x % 2 == y % 2;
  2367. }
  2368. public int GetHashCode(int obj)
  2369. {
  2370. return obj.GetHashCode();
  2371. }
  2372. }
  2373. #endregion
  2374. #region + Count +
  2375. [Fact]
  2376. public void Count_ArgumentChecking()
  2377. {
  2378. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Count(default(IObservable<int>)));
  2379. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Count(default(IObservable<int>), _ => true));
  2380. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Count(DummyObservable<int>.Instance, default(Func<int, bool>)));
  2381. }
  2382. [Fact]
  2383. public void Count_Empty()
  2384. {
  2385. var scheduler = new TestScheduler();
  2386. var xs = scheduler.CreateHotObservable(
  2387. OnNext(150, 1),
  2388. OnCompleted<int>(250)
  2389. );
  2390. var res = scheduler.Start(() =>
  2391. xs.Count()
  2392. );
  2393. res.Messages.AssertEqual(
  2394. OnNext(250, 0),
  2395. OnCompleted<int>(250)
  2396. );
  2397. xs.Subscriptions.AssertEqual(
  2398. Subscribe(200, 250)
  2399. );
  2400. }
  2401. [Fact]
  2402. public void Count_Return()
  2403. {
  2404. var scheduler = new TestScheduler();
  2405. var xs = scheduler.CreateHotObservable(
  2406. OnNext(150, 1),
  2407. OnNext(210, 2),
  2408. OnCompleted<int>(250)
  2409. );
  2410. var res = scheduler.Start(() =>
  2411. xs.Count()
  2412. );
  2413. res.Messages.AssertEqual(
  2414. OnNext(250, 1),
  2415. OnCompleted<int>(250)
  2416. );
  2417. xs.Subscriptions.AssertEqual(
  2418. Subscribe(200, 250)
  2419. );
  2420. }
  2421. [Fact]
  2422. public void Count_Some()
  2423. {
  2424. var scheduler = new TestScheduler();
  2425. var xs = scheduler.CreateHotObservable(
  2426. OnNext(150, 1),
  2427. OnNext(210, 2),
  2428. OnNext(220, 3),
  2429. OnNext(230, 4),
  2430. OnCompleted<int>(250)
  2431. );
  2432. var res = scheduler.Start(() =>
  2433. xs.Count()
  2434. );
  2435. res.Messages.AssertEqual(
  2436. OnNext(250, 3),
  2437. OnCompleted<int>(250)
  2438. );
  2439. xs.Subscriptions.AssertEqual(
  2440. Subscribe(200, 250)
  2441. );
  2442. }
  2443. [Fact]
  2444. public void Count_Throw()
  2445. {
  2446. var ex = new Exception();
  2447. var scheduler = new TestScheduler();
  2448. var xs = scheduler.CreateHotObservable(
  2449. OnNext(150, 1),
  2450. OnError<int>(210, ex)
  2451. );
  2452. var res = scheduler.Start(() =>
  2453. xs.Count()
  2454. );
  2455. res.Messages.AssertEqual(
  2456. OnError<int>(210, ex)
  2457. );
  2458. xs.Subscriptions.AssertEqual(
  2459. Subscribe(200, 210)
  2460. );
  2461. }
  2462. [Fact]
  2463. public void Count_Never()
  2464. {
  2465. var scheduler = new TestScheduler();
  2466. var xs = scheduler.CreateHotObservable(
  2467. OnNext(150, 1)
  2468. );
  2469. var res = scheduler.Start(() =>
  2470. xs.Count()
  2471. );
  2472. res.Messages.AssertEqual(
  2473. );
  2474. xs.Subscriptions.AssertEqual(
  2475. Subscribe(200, 1000)
  2476. );
  2477. }
  2478. #if !NO_PERF && !NO_THREAD
  2479. [Fact]
  2480. public void Count_InjectOverflow()
  2481. {
  2482. var xs = Observable.Return(42, ThreadPoolScheduler.Instance);
  2483. var res = new OverflowInjection<int>(xs, int.MaxValue).Count();
  2484. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  2485. }
  2486. #endif
  2487. [Fact]
  2488. public void Count_Predicate_Empty_True()
  2489. {
  2490. var scheduler = new TestScheduler();
  2491. var xs = scheduler.CreateHotObservable(
  2492. OnNext(150, 1),
  2493. OnCompleted<int>(250)
  2494. );
  2495. var res = scheduler.Start(() =>
  2496. xs.Count(_ => true)
  2497. );
  2498. res.Messages.AssertEqual(
  2499. OnNext(250, 0),
  2500. OnCompleted<int>(250)
  2501. );
  2502. xs.Subscriptions.AssertEqual(
  2503. Subscribe(200, 250)
  2504. );
  2505. }
  2506. [Fact]
  2507. public void Count_Predicate_Empty_False()
  2508. {
  2509. var scheduler = new TestScheduler();
  2510. var xs = scheduler.CreateHotObservable(
  2511. OnNext(150, 1),
  2512. OnCompleted<int>(250)
  2513. );
  2514. var res = scheduler.Start(() =>
  2515. xs.Count(_ => false)
  2516. );
  2517. res.Messages.AssertEqual(
  2518. OnNext(250, 0),
  2519. OnCompleted<int>(250)
  2520. );
  2521. xs.Subscriptions.AssertEqual(
  2522. Subscribe(200, 250)
  2523. );
  2524. }
  2525. [Fact]
  2526. public void Count_Predicate_Return_True()
  2527. {
  2528. var scheduler = new TestScheduler();
  2529. var xs = scheduler.CreateHotObservable(
  2530. OnNext(150, 1),
  2531. OnNext(210, 2),
  2532. OnCompleted<int>(250)
  2533. );
  2534. var res = scheduler.Start(() =>
  2535. xs.Count(_ => true)
  2536. );
  2537. res.Messages.AssertEqual(
  2538. OnNext(250, 1),
  2539. OnCompleted<int>(250)
  2540. );
  2541. xs.Subscriptions.AssertEqual(
  2542. Subscribe(200, 250)
  2543. );
  2544. }
  2545. [Fact]
  2546. public void Count_Predicate_Return_False()
  2547. {
  2548. var scheduler = new TestScheduler();
  2549. var xs = scheduler.CreateHotObservable(
  2550. OnNext(150, 1),
  2551. OnNext(210, 2),
  2552. OnCompleted<int>(250)
  2553. );
  2554. var res = scheduler.Start(() =>
  2555. xs.Count(_ => false)
  2556. );
  2557. res.Messages.AssertEqual(
  2558. OnNext(250, 0),
  2559. OnCompleted<int>(250)
  2560. );
  2561. xs.Subscriptions.AssertEqual(
  2562. Subscribe(200, 250)
  2563. );
  2564. }
  2565. [Fact]
  2566. public void Count_Predicate_Some_All()
  2567. {
  2568. var scheduler = new TestScheduler();
  2569. var xs = scheduler.CreateHotObservable(
  2570. OnNext(150, 1),
  2571. OnNext(210, 2),
  2572. OnNext(220, 3),
  2573. OnNext(230, 4),
  2574. OnCompleted<int>(250)
  2575. );
  2576. var res = scheduler.Start(() =>
  2577. xs.Count(x => x < 10)
  2578. );
  2579. res.Messages.AssertEqual(
  2580. OnNext(250, 3),
  2581. OnCompleted<int>(250)
  2582. );
  2583. xs.Subscriptions.AssertEqual(
  2584. Subscribe(200, 250)
  2585. );
  2586. }
  2587. [Fact]
  2588. public void Count_Predicate_Some_None()
  2589. {
  2590. var scheduler = new TestScheduler();
  2591. var xs = scheduler.CreateHotObservable(
  2592. OnNext(150, 1),
  2593. OnNext(210, 2),
  2594. OnNext(220, 3),
  2595. OnNext(230, 4),
  2596. OnCompleted<int>(250)
  2597. );
  2598. var res = scheduler.Start(() =>
  2599. xs.Count(x => x > 10)
  2600. );
  2601. res.Messages.AssertEqual(
  2602. OnNext(250, 0),
  2603. OnCompleted<int>(250)
  2604. );
  2605. xs.Subscriptions.AssertEqual(
  2606. Subscribe(200, 250)
  2607. );
  2608. }
  2609. [Fact]
  2610. public void Count_Predicate_Some_Even()
  2611. {
  2612. var scheduler = new TestScheduler();
  2613. var xs = scheduler.CreateHotObservable(
  2614. OnNext(150, 1),
  2615. OnNext(210, 2),
  2616. OnNext(220, 3),
  2617. OnNext(230, 4),
  2618. OnCompleted<int>(250)
  2619. );
  2620. var res = scheduler.Start(() =>
  2621. xs.Count(x => x % 2 == 0)
  2622. );
  2623. res.Messages.AssertEqual(
  2624. OnNext(250, 2),
  2625. OnCompleted<int>(250)
  2626. );
  2627. xs.Subscriptions.AssertEqual(
  2628. Subscribe(200, 250)
  2629. );
  2630. }
  2631. [Fact]
  2632. public void Count_Predicate_Throw_True()
  2633. {
  2634. var ex = new Exception();
  2635. var scheduler = new TestScheduler();
  2636. var xs = scheduler.CreateHotObservable(
  2637. OnNext(150, 1),
  2638. OnError<int>(210, ex)
  2639. );
  2640. var res = scheduler.Start(() =>
  2641. xs.Count(_ => true)
  2642. );
  2643. res.Messages.AssertEqual(
  2644. OnError<int>(210, ex)
  2645. );
  2646. xs.Subscriptions.AssertEqual(
  2647. Subscribe(200, 210)
  2648. );
  2649. }
  2650. [Fact]
  2651. public void Count_Predicate_Throw_False()
  2652. {
  2653. var ex = new Exception();
  2654. var scheduler = new TestScheduler();
  2655. var xs = scheduler.CreateHotObservable(
  2656. OnNext(150, 1),
  2657. OnError<int>(210, ex)
  2658. );
  2659. var res = scheduler.Start(() =>
  2660. xs.Count(_ => false)
  2661. );
  2662. res.Messages.AssertEqual(
  2663. OnError<int>(210, ex)
  2664. );
  2665. xs.Subscriptions.AssertEqual(
  2666. Subscribe(200, 210)
  2667. );
  2668. }
  2669. [Fact]
  2670. public void Count_Predicate_Never()
  2671. {
  2672. var scheduler = new TestScheduler();
  2673. var xs = scheduler.CreateHotObservable(
  2674. OnNext(150, 1)
  2675. );
  2676. var res = scheduler.Start(() =>
  2677. xs.Count(_ => true)
  2678. );
  2679. res.Messages.AssertEqual(
  2680. );
  2681. xs.Subscriptions.AssertEqual(
  2682. Subscribe(200, 1000)
  2683. );
  2684. }
  2685. [Fact]
  2686. public void Count_Predicate_PredicateThrows()
  2687. {
  2688. var scheduler = new TestScheduler();
  2689. var xs = scheduler.CreateHotObservable(
  2690. OnNext(150, 1),
  2691. OnNext(210, 2),
  2692. OnNext(230, 3),
  2693. OnCompleted<int>(240)
  2694. );
  2695. var ex = new Exception();
  2696. var res = scheduler.Start(() =>
  2697. xs.Count(x =>
  2698. {
  2699. if (x == 3)
  2700. throw ex;
  2701. return true;
  2702. })
  2703. );
  2704. res.Messages.AssertEqual(
  2705. OnError<int>(230, ex)
  2706. );
  2707. xs.Subscriptions.AssertEqual(
  2708. Subscribe(200, 230)
  2709. );
  2710. }
  2711. #if !NO_PERF && !NO_THREAD && !CRIPPLED_REFLECTION
  2712. [Fact]
  2713. public void Count_Predicate_InjectOverflow()
  2714. {
  2715. var xs = Observable.Return(42, ThreadPoolScheduler.Instance);
  2716. var res = new OverflowInjection<int>(xs, int.MaxValue).Count(_ => true);
  2717. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  2718. }
  2719. #endif
  2720. #endregion
  2721. #region + ElementAt +
  2722. [Fact]
  2723. public void ElementAt_ArgumentChecking()
  2724. {
  2725. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ElementAt(default(IObservable<int>), 2));
  2726. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.ElementAt(DummyObservable<int>.Instance, -1));
  2727. }
  2728. [Fact]
  2729. public void ElementAt_First()
  2730. {
  2731. var scheduler = new TestScheduler();
  2732. var xs = scheduler.CreateHotObservable(
  2733. OnNext(280, 42),
  2734. OnNext(360, 43),
  2735. OnNext(470, 44),
  2736. OnCompleted<int>(600)
  2737. );
  2738. var res = scheduler.Start(() =>
  2739. xs.ElementAt(0)
  2740. );
  2741. res.Messages.AssertEqual(
  2742. OnNext(280, 42),
  2743. OnCompleted<int>(280)
  2744. );
  2745. xs.Subscriptions.AssertEqual(
  2746. Subscribe(200, 280)
  2747. );
  2748. }
  2749. [Fact]
  2750. public void ElementAt_Other()
  2751. {
  2752. var scheduler = new TestScheduler();
  2753. var xs = scheduler.CreateHotObservable(
  2754. OnNext(280, 42),
  2755. OnNext(360, 43),
  2756. OnNext(470, 44),
  2757. OnCompleted<int>(600)
  2758. );
  2759. var res = scheduler.Start(() =>
  2760. xs.ElementAt(2)
  2761. );
  2762. res.Messages.AssertEqual(
  2763. OnNext(470, 44),
  2764. OnCompleted<int>(470)
  2765. );
  2766. xs.Subscriptions.AssertEqual(
  2767. Subscribe(200, 470)
  2768. );
  2769. }
  2770. [Fact]
  2771. public void ElementAt_OutOfRange()
  2772. {
  2773. var scheduler = new TestScheduler();
  2774. var xs = scheduler.CreateHotObservable(
  2775. OnNext(280, 42),
  2776. OnNext(360, 43),
  2777. OnNext(470, 44),
  2778. OnCompleted<int>(600)
  2779. );
  2780. var res = scheduler.Start(() =>
  2781. xs.ElementAt(3)
  2782. );
  2783. res.Messages.AssertEqual(
  2784. OnError<int>(600, e => e is ArgumentOutOfRangeException)
  2785. );
  2786. }
  2787. [Fact]
  2788. public void ElementAt_Error()
  2789. {
  2790. var scheduler = new TestScheduler();
  2791. var ex = new Exception();
  2792. var xs = scheduler.CreateHotObservable(
  2793. OnNext(280, 42),
  2794. OnNext(360, 43),
  2795. OnError<int>(420, ex)
  2796. );
  2797. var res = scheduler.Start(() =>
  2798. xs.ElementAt(3)
  2799. );
  2800. res.Messages.AssertEqual(
  2801. OnError<int>(420, ex)
  2802. );
  2803. xs.Subscriptions.AssertEqual(
  2804. Subscribe(200, 420)
  2805. );
  2806. }
  2807. #endregion
  2808. #region + ElementAtOrDefault +
  2809. [Fact]
  2810. public void ElementAtOrDefault_ArgumentChecking()
  2811. {
  2812. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ElementAtOrDefault(default(IObservable<int>), 2));
  2813. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.ElementAtOrDefault(DummyObservable<int>.Instance, -1));
  2814. }
  2815. [Fact]
  2816. public void ElementAtOrDefault_First()
  2817. {
  2818. var scheduler = new TestScheduler();
  2819. var xs = scheduler.CreateHotObservable(
  2820. OnNext(280, 42),
  2821. OnNext(360, 43),
  2822. OnNext(470, 44),
  2823. OnCompleted<int>(600)
  2824. );
  2825. var res = scheduler.Start(() =>
  2826. xs.ElementAtOrDefault(0)
  2827. );
  2828. res.Messages.AssertEqual(
  2829. OnNext(280, 42),
  2830. OnCompleted<int>(280)
  2831. );
  2832. xs.Subscriptions.AssertEqual(
  2833. Subscribe(200, 280)
  2834. );
  2835. }
  2836. [Fact]
  2837. public void ElementAtOrDefault_Other()
  2838. {
  2839. var scheduler = new TestScheduler();
  2840. var xs = scheduler.CreateHotObservable(
  2841. OnNext(280, 42),
  2842. OnNext(360, 43),
  2843. OnNext(470, 44),
  2844. OnCompleted<int>(600)
  2845. );
  2846. var res = scheduler.Start(() =>
  2847. xs.ElementAtOrDefault(2)
  2848. );
  2849. res.Messages.AssertEqual(
  2850. OnNext(470, 44),
  2851. OnCompleted<int>(470)
  2852. );
  2853. xs.Subscriptions.AssertEqual(
  2854. Subscribe(200, 470)
  2855. );
  2856. }
  2857. [Fact]
  2858. public void ElementAtOrDefault_OutOfRange()
  2859. {
  2860. var scheduler = new TestScheduler();
  2861. var xs = scheduler.CreateHotObservable(
  2862. OnNext(280, 42),
  2863. OnNext(360, 43),
  2864. OnNext(470, 44),
  2865. OnCompleted<int>(600)
  2866. );
  2867. var res = scheduler.Start(() =>
  2868. xs.ElementAtOrDefault(3)
  2869. );
  2870. res.Messages.AssertEqual(
  2871. OnNext(600, 0),
  2872. OnCompleted<int>(600)
  2873. );
  2874. xs.Subscriptions.AssertEqual(
  2875. Subscribe(200, 600)
  2876. );
  2877. }
  2878. [Fact]
  2879. public void ElementAtOrDefault_Error()
  2880. {
  2881. var scheduler = new TestScheduler();
  2882. var ex = new Exception();
  2883. var xs = scheduler.CreateHotObservable(
  2884. OnNext(280, 42),
  2885. OnNext(360, 43),
  2886. OnError<int>(420, ex)
  2887. );
  2888. var res = scheduler.Start(() =>
  2889. xs.ElementAtOrDefault(3)
  2890. );
  2891. res.Messages.AssertEqual(
  2892. OnError<int>(420, ex)
  2893. );
  2894. xs.Subscriptions.AssertEqual(
  2895. Subscribe(200, 420)
  2896. );
  2897. }
  2898. #endregion
  2899. #region + FirstAsync +
  2900. [Fact]
  2901. public void FirstAsync_ArgumentChecking()
  2902. {
  2903. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstAsync(default(IObservable<int>)));
  2904. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstAsync(default(IObservable<int>), _ => true));
  2905. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
  2906. }
  2907. [Fact]
  2908. public void FirstAsync_Empty()
  2909. {
  2910. var scheduler = new TestScheduler();
  2911. var xs = scheduler.CreateHotObservable(
  2912. OnNext(150, 1),
  2913. OnCompleted<int>(250)
  2914. );
  2915. var res = scheduler.Start(() =>
  2916. xs.FirstAsync()
  2917. );
  2918. res.Messages.AssertEqual(
  2919. OnError<int>(250, e => e is InvalidOperationException)
  2920. );
  2921. xs.Subscriptions.AssertEqual(
  2922. Subscribe(200, 250)
  2923. );
  2924. }
  2925. [Fact]
  2926. public void FirstAsync_One()
  2927. {
  2928. var scheduler = new TestScheduler();
  2929. var xs = scheduler.CreateHotObservable(
  2930. OnNext(150, 1),
  2931. OnNext(210, 2),
  2932. OnCompleted<int>(250)
  2933. );
  2934. var res = scheduler.Start(() =>
  2935. xs.FirstAsync()
  2936. );
  2937. res.Messages.AssertEqual(
  2938. OnNext(210, 2),
  2939. OnCompleted<int>(210)
  2940. );
  2941. xs.Subscriptions.AssertEqual(
  2942. Subscribe(200, 210)
  2943. );
  2944. }
  2945. [Fact]
  2946. public void FirstAsync_Many()
  2947. {
  2948. var scheduler = new TestScheduler();
  2949. var xs = scheduler.CreateHotObservable(
  2950. OnNext(150, 1),
  2951. OnNext(210, 2),
  2952. OnNext(220, 3),
  2953. OnCompleted<int>(250)
  2954. );
  2955. var res = scheduler.Start(() =>
  2956. xs.FirstAsync()
  2957. );
  2958. res.Messages.AssertEqual(
  2959. OnNext(210, 2),
  2960. OnCompleted<int>(210)
  2961. );
  2962. xs.Subscriptions.AssertEqual(
  2963. Subscribe(200, 210)
  2964. );
  2965. }
  2966. [Fact]
  2967. public void FirstAsync_Error()
  2968. {
  2969. var scheduler = new TestScheduler();
  2970. var ex = new Exception();
  2971. var xs = scheduler.CreateHotObservable(
  2972. OnNext(150, 1),
  2973. OnError<int>(210, ex)
  2974. );
  2975. var res = scheduler.Start(() =>
  2976. xs.FirstAsync()
  2977. );
  2978. res.Messages.AssertEqual(
  2979. OnError<int>(210, ex)
  2980. );
  2981. xs.Subscriptions.AssertEqual(
  2982. Subscribe(200, 210)
  2983. );
  2984. }
  2985. [Fact]
  2986. public void FirstAsync_Predicate()
  2987. {
  2988. var scheduler = new TestScheduler();
  2989. var xs = scheduler.CreateHotObservable(
  2990. OnNext(150, 1),
  2991. OnNext(210, 2),
  2992. OnNext(220, 3),
  2993. OnNext(230, 4),
  2994. OnNext(240, 5),
  2995. OnCompleted<int>(250)
  2996. );
  2997. var res = scheduler.Start(() =>
  2998. xs.FirstAsync(x => x % 2 == 1)
  2999. );
  3000. res.Messages.AssertEqual(
  3001. OnNext(220, 3),
  3002. OnCompleted<int>(220)
  3003. );
  3004. xs.Subscriptions.AssertEqual(
  3005. Subscribe(200, 220)
  3006. );
  3007. }
  3008. [Fact]
  3009. public void FirstAsync_Predicate_None()
  3010. {
  3011. var scheduler = new TestScheduler();
  3012. var xs = scheduler.CreateHotObservable(
  3013. OnNext(150, 1),
  3014. OnNext(210, 2),
  3015. OnNext(220, 3),
  3016. OnNext(230, 4),
  3017. OnNext(240, 5),
  3018. OnCompleted<int>(250)
  3019. );
  3020. var res = scheduler.Start(() =>
  3021. xs.FirstAsync(x => x > 10)
  3022. );
  3023. res.Messages.AssertEqual(
  3024. OnError<int>(250, e => e is InvalidOperationException)
  3025. );
  3026. xs.Subscriptions.AssertEqual(
  3027. Subscribe(200, 250)
  3028. );
  3029. }
  3030. [Fact]
  3031. public void FirstAsync_Predicate_Throw()
  3032. {
  3033. var scheduler = new TestScheduler();
  3034. var ex = new Exception();
  3035. var xs = scheduler.CreateHotObservable(
  3036. OnNext(150, 1),
  3037. OnNext(210, 2),
  3038. OnError<int>(220, ex)
  3039. );
  3040. var res = scheduler.Start(() =>
  3041. xs.FirstAsync(x => x % 2 == 1)
  3042. );
  3043. res.Messages.AssertEqual(
  3044. OnError<int>(220, ex)
  3045. );
  3046. xs.Subscriptions.AssertEqual(
  3047. Subscribe(200, 220)
  3048. );
  3049. }
  3050. [Fact]
  3051. public void FirstAsync_PredicateThrows()
  3052. {
  3053. var scheduler = new TestScheduler();
  3054. var ex = new Exception();
  3055. var xs = scheduler.CreateHotObservable(
  3056. OnNext(150, 1),
  3057. OnNext(210, 2),
  3058. OnNext(220, 3),
  3059. OnNext(230, 4),
  3060. OnNext(240, 5),
  3061. OnCompleted<int>(250)
  3062. );
  3063. var res = scheduler.Start(() =>
  3064. xs.FirstAsync(x => { if (x < 4) return false; throw ex; })
  3065. );
  3066. res.Messages.AssertEqual(
  3067. OnError<int>(230, ex)
  3068. );
  3069. xs.Subscriptions.AssertEqual(
  3070. Subscribe(200, 230)
  3071. );
  3072. }
  3073. #endregion
  3074. #region + FirstOrDefaultAsync +
  3075. [Fact]
  3076. public void FirstOrDefaultAsync_ArgumentChecking()
  3077. {
  3078. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstOrDefaultAsync(default(IObservable<int>)));
  3079. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstOrDefaultAsync(default(IObservable<int>), _ => true));
  3080. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.FirstOrDefaultAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
  3081. }
  3082. [Fact]
  3083. public void FirstOrDefaultAsync_Empty()
  3084. {
  3085. var scheduler = new TestScheduler();
  3086. var xs = scheduler.CreateHotObservable(
  3087. OnNext(150, 1),
  3088. OnCompleted<int>(250)
  3089. );
  3090. var res = scheduler.Start(() =>
  3091. xs.FirstOrDefaultAsync()
  3092. );
  3093. res.Messages.AssertEqual(
  3094. OnNext(250, 0),
  3095. OnCompleted<int>(250)
  3096. );
  3097. xs.Subscriptions.AssertEqual(
  3098. Subscribe(200, 250)
  3099. );
  3100. }
  3101. [Fact]
  3102. public void FirstOrDefaultAsync_One()
  3103. {
  3104. var scheduler = new TestScheduler();
  3105. var xs = scheduler.CreateHotObservable(
  3106. OnNext(150, 1),
  3107. OnNext(210, 2),
  3108. OnCompleted<int>(250)
  3109. );
  3110. var res = scheduler.Start(() =>
  3111. xs.FirstOrDefaultAsync()
  3112. );
  3113. res.Messages.AssertEqual(
  3114. OnNext(210, 2),
  3115. OnCompleted<int>(210)
  3116. );
  3117. xs.Subscriptions.AssertEqual(
  3118. Subscribe(200, 210)
  3119. );
  3120. }
  3121. [Fact]
  3122. public void FirstOrDefaultAsync_Many()
  3123. {
  3124. var scheduler = new TestScheduler();
  3125. var xs = scheduler.CreateHotObservable(
  3126. OnNext(150, 1),
  3127. OnNext(210, 2),
  3128. OnNext(220, 3),
  3129. OnCompleted<int>(250)
  3130. );
  3131. var res = scheduler.Start(() =>
  3132. xs.FirstOrDefaultAsync()
  3133. );
  3134. res.Messages.AssertEqual(
  3135. OnNext(210, 2),
  3136. OnCompleted<int>(210)
  3137. );
  3138. xs.Subscriptions.AssertEqual(
  3139. Subscribe(200, 210)
  3140. );
  3141. }
  3142. [Fact]
  3143. public void FirstOrDefaultAsync_Error()
  3144. {
  3145. var scheduler = new TestScheduler();
  3146. var ex = new Exception();
  3147. var xs = scheduler.CreateHotObservable(
  3148. OnNext(150, 1),
  3149. OnError<int>(210, ex)
  3150. );
  3151. var res = scheduler.Start(() =>
  3152. xs.FirstOrDefaultAsync()
  3153. );
  3154. res.Messages.AssertEqual(
  3155. OnError<int>(210, ex)
  3156. );
  3157. xs.Subscriptions.AssertEqual(
  3158. Subscribe(200, 210)
  3159. );
  3160. }
  3161. [Fact]
  3162. public void FirstOrDefaultAsync_Predicate()
  3163. {
  3164. var scheduler = new TestScheduler();
  3165. var ex = new Exception();
  3166. var xs = scheduler.CreateHotObservable(
  3167. OnNext(150, 1),
  3168. OnNext(210, 2),
  3169. OnNext(220, 3),
  3170. OnNext(230, 4),
  3171. OnNext(240, 5),
  3172. OnCompleted<int>(250)
  3173. );
  3174. var res = scheduler.Start(() =>
  3175. xs.FirstOrDefaultAsync(x => x % 2 == 1)
  3176. );
  3177. res.Messages.AssertEqual(
  3178. OnNext(220, 3),
  3179. OnCompleted<int>(220)
  3180. );
  3181. xs.Subscriptions.AssertEqual(
  3182. Subscribe(200, 220)
  3183. );
  3184. }
  3185. [Fact]
  3186. public void FirstOrDefaultAsync_Predicate_None()
  3187. {
  3188. var scheduler = new TestScheduler();
  3189. var ex = new Exception();
  3190. var xs = scheduler.CreateHotObservable(
  3191. OnNext(150, 1),
  3192. OnNext(210, 2),
  3193. OnNext(220, 3),
  3194. OnNext(230, 4),
  3195. OnNext(240, 5),
  3196. OnCompleted<int>(250)
  3197. );
  3198. var res = scheduler.Start(() =>
  3199. xs.FirstOrDefaultAsync(x => x > 10)
  3200. );
  3201. res.Messages.AssertEqual(
  3202. OnNext(250, 0),
  3203. OnCompleted<int>(250)
  3204. );
  3205. xs.Subscriptions.AssertEqual(
  3206. Subscribe(200, 250)
  3207. );
  3208. }
  3209. [Fact]
  3210. public void FirstOrDefaultAsync_Predicate_Throw()
  3211. {
  3212. var scheduler = new TestScheduler();
  3213. var ex = new Exception();
  3214. var xs = scheduler.CreateHotObservable(
  3215. OnNext(150, 1),
  3216. OnNext(210, 2),
  3217. OnError<int>(220, ex)
  3218. );
  3219. var res = scheduler.Start(() =>
  3220. xs.FirstOrDefaultAsync(x => x % 2 == 1)
  3221. );
  3222. res.Messages.AssertEqual(
  3223. OnError<int>(220, ex)
  3224. );
  3225. xs.Subscriptions.AssertEqual(
  3226. Subscribe(200, 220)
  3227. );
  3228. }
  3229. [Fact]
  3230. public void FirstOrDefaultAsync_PredicateThrows()
  3231. {
  3232. var scheduler = new TestScheduler();
  3233. var ex = new Exception();
  3234. var xs = scheduler.CreateHotObservable(
  3235. OnNext(150, 1),
  3236. OnNext(210, 2),
  3237. OnNext(220, 3),
  3238. OnNext(230, 4),
  3239. OnNext(240, 5),
  3240. OnCompleted<int>(250)
  3241. );
  3242. var res = scheduler.Start(() =>
  3243. xs.FirstOrDefaultAsync(x => { if (x < 4) return false; throw ex; })
  3244. );
  3245. res.Messages.AssertEqual(
  3246. OnError<int>(230, ex)
  3247. );
  3248. xs.Subscriptions.AssertEqual(
  3249. Subscribe(200, 230)
  3250. );
  3251. }
  3252. #endregion
  3253. #region + IsEmpty +
  3254. [Fact]
  3255. public void IsEmpty_ArgumentChecking()
  3256. {
  3257. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.IsEmpty(default(IObservable<int>)));
  3258. }
  3259. [Fact]
  3260. public void IsEmpty_Empty()
  3261. {
  3262. var scheduler = new TestScheduler();
  3263. var xs = scheduler.CreateHotObservable(
  3264. OnNext(150, 1),
  3265. OnCompleted<int>(250)
  3266. );
  3267. var res = scheduler.Start(() =>
  3268. xs.IsEmpty()
  3269. );
  3270. res.Messages.AssertEqual(
  3271. OnNext(250, true),
  3272. OnCompleted<bool>(250)
  3273. );
  3274. xs.Subscriptions.AssertEqual(
  3275. Subscribe(200, 250)
  3276. );
  3277. }
  3278. [Fact]
  3279. public void IsEmpty_Return()
  3280. {
  3281. var scheduler = new TestScheduler();
  3282. var xs = scheduler.CreateHotObservable(
  3283. OnNext(150, 1),
  3284. OnNext(210, 2),
  3285. OnCompleted<int>(250)
  3286. );
  3287. var res = scheduler.Start(() =>
  3288. xs.IsEmpty()
  3289. );
  3290. res.Messages.AssertEqual(
  3291. OnNext(210, false),
  3292. OnCompleted<bool>(210)
  3293. );
  3294. xs.Subscriptions.AssertEqual(
  3295. Subscribe(200, 210)
  3296. );
  3297. }
  3298. [Fact]
  3299. public void IsEmpty_Throw()
  3300. {
  3301. var ex = new Exception();
  3302. var scheduler = new TestScheduler();
  3303. var xs = scheduler.CreateHotObservable(
  3304. OnNext(150, 1),
  3305. OnError<int>(210, ex)
  3306. );
  3307. var res = scheduler.Start(() =>
  3308. xs.IsEmpty()
  3309. );
  3310. res.Messages.AssertEqual(
  3311. OnError<bool>(210, ex)
  3312. );
  3313. xs.Subscriptions.AssertEqual(
  3314. Subscribe(200, 210)
  3315. );
  3316. }
  3317. [Fact]
  3318. public void IsEmpty_Never()
  3319. {
  3320. var ex = new Exception();
  3321. var scheduler = new TestScheduler();
  3322. var xs = scheduler.CreateHotObservable(
  3323. OnNext(150, 1)
  3324. );
  3325. var res = scheduler.Start(() =>
  3326. xs.IsEmpty()
  3327. );
  3328. res.Messages.AssertEqual(
  3329. );
  3330. xs.Subscriptions.AssertEqual(
  3331. Subscribe(200, 1000)
  3332. );
  3333. }
  3334. #endregion
  3335. #region + LastAsync +
  3336. [Fact]
  3337. public void LastAsync_ArgumentChecking()
  3338. {
  3339. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastAsync(default(IObservable<int>)));
  3340. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastAsync(default(IObservable<int>), _ => true));
  3341. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
  3342. }
  3343. [Fact]
  3344. public void LastAsync_Empty()
  3345. {
  3346. var scheduler = new TestScheduler();
  3347. var xs = scheduler.CreateHotObservable(
  3348. OnNext(150, 1),
  3349. OnCompleted<int>(250)
  3350. );
  3351. var res = scheduler.Start(() =>
  3352. xs.LastAsync()
  3353. );
  3354. res.Messages.AssertEqual(
  3355. OnError<int>(250, e => e is InvalidOperationException)
  3356. );
  3357. xs.Subscriptions.AssertEqual(
  3358. Subscribe(200, 250)
  3359. );
  3360. }
  3361. [Fact]
  3362. public void LastAsync_One()
  3363. {
  3364. var scheduler = new TestScheduler();
  3365. var xs = scheduler.CreateHotObservable(
  3366. OnNext(150, 1),
  3367. OnNext(210, 2),
  3368. OnCompleted<int>(250)
  3369. );
  3370. var res = scheduler.Start(() =>
  3371. xs.LastAsync()
  3372. );
  3373. res.Messages.AssertEqual(
  3374. OnNext(250, 2),
  3375. OnCompleted<int>(250)
  3376. );
  3377. xs.Subscriptions.AssertEqual(
  3378. Subscribe(200, 250)
  3379. );
  3380. }
  3381. [Fact]
  3382. public void LastAsync_Many()
  3383. {
  3384. var scheduler = new TestScheduler();
  3385. var xs = scheduler.CreateHotObservable(
  3386. OnNext(150, 1),
  3387. OnNext(210, 2),
  3388. OnNext(220, 3),
  3389. OnCompleted<int>(250)
  3390. );
  3391. var res = scheduler.Start(() =>
  3392. xs.LastAsync()
  3393. );
  3394. res.Messages.AssertEqual(
  3395. OnNext(250, 3),
  3396. OnCompleted<int>(250)
  3397. );
  3398. xs.Subscriptions.AssertEqual(
  3399. Subscribe(200, 250)
  3400. );
  3401. }
  3402. [Fact]
  3403. public void LastAsync_Error()
  3404. {
  3405. var scheduler = new TestScheduler();
  3406. var ex = new Exception();
  3407. var xs = scheduler.CreateHotObservable(
  3408. OnNext(150, 1),
  3409. OnError<int>(210, ex)
  3410. );
  3411. var res = scheduler.Start(() =>
  3412. xs.LastAsync()
  3413. );
  3414. res.Messages.AssertEqual(
  3415. OnError<int>(210, ex)
  3416. );
  3417. xs.Subscriptions.AssertEqual(
  3418. Subscribe(200, 210)
  3419. );
  3420. }
  3421. [Fact]
  3422. public void LastAsync_Predicate()
  3423. {
  3424. var scheduler = new TestScheduler();
  3425. var xs = scheduler.CreateHotObservable(
  3426. OnNext(150, 1),
  3427. OnNext(210, 2),
  3428. OnNext(220, 3),
  3429. OnNext(230, 4),
  3430. OnNext(240, 5),
  3431. OnCompleted<int>(250)
  3432. );
  3433. var res = scheduler.Start(() =>
  3434. xs.LastAsync(x => x % 2 == 1)
  3435. );
  3436. res.Messages.AssertEqual(
  3437. OnNext(250, 5),
  3438. OnCompleted<int>(250)
  3439. );
  3440. xs.Subscriptions.AssertEqual(
  3441. Subscribe(200, 250)
  3442. );
  3443. }
  3444. [Fact]
  3445. public void LastAsync_Predicate_None()
  3446. {
  3447. var scheduler = new TestScheduler();
  3448. var xs = scheduler.CreateHotObservable(
  3449. OnNext(150, 1),
  3450. OnNext(210, 2),
  3451. OnNext(220, 3),
  3452. OnNext(230, 4),
  3453. OnNext(240, 5),
  3454. OnCompleted<int>(250)
  3455. );
  3456. var res = scheduler.Start(() =>
  3457. xs.LastAsync(x => x > 10)
  3458. );
  3459. res.Messages.AssertEqual(
  3460. OnError<int>(250, e => e is InvalidOperationException)
  3461. );
  3462. xs.Subscriptions.AssertEqual(
  3463. Subscribe(200, 250)
  3464. );
  3465. }
  3466. [Fact]
  3467. public void LastAsync_Predicate_Throw()
  3468. {
  3469. var scheduler = new TestScheduler();
  3470. var ex = new Exception();
  3471. var xs = scheduler.CreateHotObservable(
  3472. OnNext(150, 1),
  3473. OnError<int>(210, ex)
  3474. );
  3475. var res = scheduler.Start(() =>
  3476. xs.LastAsync(x => x % 2 == 1)
  3477. );
  3478. res.Messages.AssertEqual(
  3479. OnError<int>(210, ex)
  3480. );
  3481. xs.Subscriptions.AssertEqual(
  3482. Subscribe(200, 210)
  3483. );
  3484. }
  3485. [Fact]
  3486. public void LastAsync_PredicateThrows()
  3487. {
  3488. var scheduler = new TestScheduler();
  3489. var ex = new Exception();
  3490. var xs = scheduler.CreateHotObservable(
  3491. OnNext(150, 1),
  3492. OnNext(210, 2),
  3493. OnNext(220, 3),
  3494. OnNext(230, 4),
  3495. OnNext(240, 5),
  3496. OnCompleted<int>(250)
  3497. );
  3498. var res = scheduler.Start(() =>
  3499. xs.LastAsync(x => { if (x < 4) return x % 2 == 1; throw ex; })
  3500. );
  3501. res.Messages.AssertEqual(
  3502. OnError<int>(230, ex)
  3503. );
  3504. xs.Subscriptions.AssertEqual(
  3505. Subscribe(200, 230)
  3506. );
  3507. }
  3508. #endregion
  3509. #region + LastOrDefaultAsync +
  3510. [Fact]
  3511. public void LastOrDefaultAsync_ArgumentChecking()
  3512. {
  3513. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastOrDefaultAsync(default(IObservable<int>)));
  3514. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastOrDefaultAsync(default(IObservable<int>), _ => true));
  3515. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LastOrDefaultAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
  3516. }
  3517. [Fact]
  3518. public void LastOrDefaultAsync_Empty()
  3519. {
  3520. var scheduler = new TestScheduler();
  3521. var xs = scheduler.CreateHotObservable(
  3522. OnNext(150, 1),
  3523. OnCompleted<int>(250)
  3524. );
  3525. var res = scheduler.Start(() =>
  3526. xs.LastOrDefaultAsync()
  3527. );
  3528. res.Messages.AssertEqual(
  3529. OnNext(250, 0),
  3530. OnCompleted<int>(250)
  3531. );
  3532. xs.Subscriptions.AssertEqual(
  3533. Subscribe(200, 250)
  3534. );
  3535. }
  3536. [Fact]
  3537. public void LastOrDefaultAsync_One()
  3538. {
  3539. var scheduler = new TestScheduler();
  3540. var xs = scheduler.CreateHotObservable(
  3541. OnNext(150, 1),
  3542. OnNext(210, 2),
  3543. OnCompleted<int>(250)
  3544. );
  3545. var res = scheduler.Start(() =>
  3546. xs.LastOrDefaultAsync()
  3547. );
  3548. res.Messages.AssertEqual(
  3549. OnNext(250, 2),
  3550. OnCompleted<int>(250)
  3551. );
  3552. xs.Subscriptions.AssertEqual(
  3553. Subscribe(200, 250)
  3554. );
  3555. }
  3556. [Fact]
  3557. public void LastOrDefaultAsync_Many()
  3558. {
  3559. var scheduler = new TestScheduler();
  3560. var xs = scheduler.CreateHotObservable(
  3561. OnNext(150, 1),
  3562. OnNext(210, 2),
  3563. OnNext(220, 3),
  3564. OnCompleted<int>(250)
  3565. );
  3566. var res = scheduler.Start(() =>
  3567. xs.LastOrDefaultAsync()
  3568. );
  3569. res.Messages.AssertEqual(
  3570. OnNext(250, 3),
  3571. OnCompleted<int>(250)
  3572. );
  3573. xs.Subscriptions.AssertEqual(
  3574. Subscribe(200, 250)
  3575. );
  3576. }
  3577. [Fact]
  3578. public void LastOrDefaultAsync_Error()
  3579. {
  3580. var scheduler = new TestScheduler();
  3581. var ex = new Exception();
  3582. var xs = scheduler.CreateHotObservable(
  3583. OnNext(150, 1),
  3584. OnError<int>(210, ex)
  3585. );
  3586. var res = scheduler.Start(() =>
  3587. xs.LastOrDefaultAsync()
  3588. );
  3589. res.Messages.AssertEqual(
  3590. OnError<int>(210, ex)
  3591. );
  3592. xs.Subscriptions.AssertEqual(
  3593. Subscribe(200, 210)
  3594. );
  3595. }
  3596. [Fact]
  3597. public void LastOrDefaultAsync_Predicate()
  3598. {
  3599. var scheduler = new TestScheduler();
  3600. var xs = scheduler.CreateHotObservable(
  3601. OnNext(150, 1),
  3602. OnNext(210, 2),
  3603. OnNext(220, 3),
  3604. OnNext(230, 4),
  3605. OnNext(240, 5),
  3606. OnCompleted<int>(250)
  3607. );
  3608. var res = scheduler.Start(() =>
  3609. xs.LastOrDefaultAsync(x => x % 2 == 1)
  3610. );
  3611. res.Messages.AssertEqual(
  3612. OnNext(250, 5),
  3613. OnCompleted<int>(250)
  3614. );
  3615. xs.Subscriptions.AssertEqual(
  3616. Subscribe(200, 250)
  3617. );
  3618. }
  3619. [Fact]
  3620. public void LastOrDefaultAsync_Predicate_None()
  3621. {
  3622. var scheduler = new TestScheduler();
  3623. var xs = scheduler.CreateHotObservable(
  3624. OnNext(150, 1),
  3625. OnNext(210, 2),
  3626. OnNext(220, 3),
  3627. OnNext(230, 4),
  3628. OnNext(240, 5),
  3629. OnCompleted<int>(250)
  3630. );
  3631. var res = scheduler.Start(() =>
  3632. xs.LastOrDefaultAsync(x => x > 10)
  3633. );
  3634. res.Messages.AssertEqual(
  3635. OnNext(250, 0),
  3636. OnCompleted<int>(250)
  3637. );
  3638. xs.Subscriptions.AssertEqual(
  3639. Subscribe(200, 250)
  3640. );
  3641. }
  3642. [Fact]
  3643. public void LastOrDefaultAsync_Predicate_Throw()
  3644. {
  3645. var scheduler = new TestScheduler();
  3646. var ex = new Exception();
  3647. var xs = scheduler.CreateHotObservable(
  3648. OnNext(150, 1),
  3649. OnError<int>(210, ex)
  3650. );
  3651. var res = scheduler.Start(() =>
  3652. xs.LastOrDefaultAsync(x => x > 10)
  3653. );
  3654. res.Messages.AssertEqual(
  3655. OnError<int>(210, ex)
  3656. );
  3657. xs.Subscriptions.AssertEqual(
  3658. Subscribe(200, 210)
  3659. );
  3660. }
  3661. [Fact]
  3662. public void LastOrDefaultAsync_PredicateThrows()
  3663. {
  3664. var scheduler = new TestScheduler();
  3665. var ex = new Exception();
  3666. var xs = scheduler.CreateHotObservable(
  3667. OnNext(150, 1),
  3668. OnNext(210, 2),
  3669. OnNext(220, 3),
  3670. OnNext(230, 4),
  3671. OnNext(240, 5),
  3672. OnCompleted<int>(250)
  3673. );
  3674. var res = scheduler.Start(() =>
  3675. xs.LastOrDefaultAsync(x => { if (x < 4) return x % 2 == 1; throw ex; })
  3676. );
  3677. res.Messages.AssertEqual(
  3678. OnError<int>(230, ex)
  3679. );
  3680. xs.Subscriptions.AssertEqual(
  3681. Subscribe(200, 230)
  3682. );
  3683. }
  3684. #endregion
  3685. #region + LongCount +
  3686. [Fact]
  3687. public void LongCount_ArgumentChecking()
  3688. {
  3689. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LongCount(default(IObservable<int>)));
  3690. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LongCount(default(IObservable<int>), _ => true));
  3691. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.LongCount(DummyObservable<int>.Instance, default(Func<int, bool>)));
  3692. }
  3693. [Fact]
  3694. public void LongCount_Empty()
  3695. {
  3696. var scheduler = new TestScheduler();
  3697. var xs = scheduler.CreateHotObservable(
  3698. OnNext(150, 1),
  3699. OnCompleted<int>(250)
  3700. );
  3701. var res = scheduler.Start(() =>
  3702. xs.LongCount()
  3703. );
  3704. res.Messages.AssertEqual(
  3705. OnNext(250, 0L),
  3706. OnCompleted<long>(250)
  3707. );
  3708. xs.Subscriptions.AssertEqual(
  3709. Subscribe(200, 250)
  3710. );
  3711. }
  3712. [Fact]
  3713. public void LongCount_Return()
  3714. {
  3715. var scheduler = new TestScheduler();
  3716. var xs = scheduler.CreateHotObservable(
  3717. OnNext(150, 1),
  3718. OnNext(210, 2),
  3719. OnCompleted<int>(250)
  3720. );
  3721. var res = scheduler.Start(() =>
  3722. xs.LongCount()
  3723. );
  3724. res.Messages.AssertEqual(
  3725. OnNext(250, 1L),
  3726. OnCompleted<long>(250)
  3727. );
  3728. xs.Subscriptions.AssertEqual(
  3729. Subscribe(200, 250)
  3730. );
  3731. }
  3732. [Fact]
  3733. public void LongCount_Some()
  3734. {
  3735. var scheduler = new TestScheduler();
  3736. var xs = scheduler.CreateHotObservable(
  3737. OnNext(150, 1),
  3738. OnNext(210, 2),
  3739. OnNext(220, 3),
  3740. OnNext(230, 4),
  3741. OnCompleted<int>(250)
  3742. );
  3743. var res = scheduler.Start(() =>
  3744. xs.LongCount()
  3745. );
  3746. res.Messages.AssertEqual(
  3747. OnNext(250, 3L),
  3748. OnCompleted<long>(250)
  3749. );
  3750. xs.Subscriptions.AssertEqual(
  3751. Subscribe(200, 250)
  3752. );
  3753. }
  3754. [Fact]
  3755. public void LongCount_Throw()
  3756. {
  3757. var ex = new Exception();
  3758. var scheduler = new TestScheduler();
  3759. var xs = scheduler.CreateHotObservable(
  3760. OnNext(150, 1),
  3761. OnError<int>(210, ex)
  3762. );
  3763. var res = scheduler.Start(() =>
  3764. xs.LongCount()
  3765. );
  3766. res.Messages.AssertEqual(
  3767. OnError<long>(210, ex)
  3768. );
  3769. xs.Subscriptions.AssertEqual(
  3770. Subscribe(200, 210)
  3771. );
  3772. }
  3773. [Fact]
  3774. public void LongCount_Never()
  3775. {
  3776. var scheduler = new TestScheduler();
  3777. var xs = scheduler.CreateHotObservable(
  3778. OnNext(150, 1)
  3779. );
  3780. var res = scheduler.Start(() =>
  3781. xs.LongCount()
  3782. );
  3783. res.Messages.AssertEqual(
  3784. );
  3785. xs.Subscriptions.AssertEqual(
  3786. Subscribe(200, 1000)
  3787. );
  3788. }
  3789. #if !NO_PERF && !NO_THREAD
  3790. [Fact]
  3791. public void LongCount_InjectOverflow()
  3792. {
  3793. var xs = Observable.Return(42, ThreadPoolScheduler.Instance);
  3794. var res = new OverflowInjection<int>(xs, long.MaxValue).LongCount();
  3795. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  3796. }
  3797. #endif
  3798. [Fact]
  3799. public void LongCount_Predicate_Empty_True()
  3800. {
  3801. var scheduler = new TestScheduler();
  3802. var xs = scheduler.CreateHotObservable(
  3803. OnNext(150, 1),
  3804. OnCompleted<int>(250)
  3805. );
  3806. var res = scheduler.Start(() =>
  3807. xs.LongCount(_ => true)
  3808. );
  3809. res.Messages.AssertEqual(
  3810. OnNext(250, 0L),
  3811. OnCompleted<long>(250)
  3812. );
  3813. xs.Subscriptions.AssertEqual(
  3814. Subscribe(200, 250)
  3815. );
  3816. }
  3817. [Fact]
  3818. public void LongCount_Predicate_Empty_False()
  3819. {
  3820. var scheduler = new TestScheduler();
  3821. var xs = scheduler.CreateHotObservable(
  3822. OnNext(150, 1),
  3823. OnCompleted<int>(250)
  3824. );
  3825. var res = scheduler.Start(() =>
  3826. xs.LongCount(_ => false)
  3827. );
  3828. res.Messages.AssertEqual(
  3829. OnNext(250, 0L),
  3830. OnCompleted<long>(250)
  3831. );
  3832. xs.Subscriptions.AssertEqual(
  3833. Subscribe(200, 250)
  3834. );
  3835. }
  3836. [Fact]
  3837. public void LongCount_Predicate_Return_True()
  3838. {
  3839. var scheduler = new TestScheduler();
  3840. var xs = scheduler.CreateHotObservable(
  3841. OnNext(150, 1),
  3842. OnNext(210, 2),
  3843. OnCompleted<int>(250)
  3844. );
  3845. var res = scheduler.Start(() =>
  3846. xs.LongCount(_ => true)
  3847. );
  3848. res.Messages.AssertEqual(
  3849. OnNext(250, 1L),
  3850. OnCompleted<long>(250)
  3851. );
  3852. xs.Subscriptions.AssertEqual(
  3853. Subscribe(200, 250)
  3854. );
  3855. }
  3856. [Fact]
  3857. public void LongCount_Predicate_Return_False()
  3858. {
  3859. var scheduler = new TestScheduler();
  3860. var xs = scheduler.CreateHotObservable(
  3861. OnNext(150, 1),
  3862. OnNext(210, 2),
  3863. OnCompleted<int>(250)
  3864. );
  3865. var res = scheduler.Start(() =>
  3866. xs.LongCount(_ => false)
  3867. );
  3868. res.Messages.AssertEqual(
  3869. OnNext(250, 0L),
  3870. OnCompleted<long>(250)
  3871. );
  3872. xs.Subscriptions.AssertEqual(
  3873. Subscribe(200, 250)
  3874. );
  3875. }
  3876. [Fact]
  3877. public void LongCount_Predicate_Some_All()
  3878. {
  3879. var scheduler = new TestScheduler();
  3880. var xs = scheduler.CreateHotObservable(
  3881. OnNext(150, 1),
  3882. OnNext(210, 2),
  3883. OnNext(220, 3),
  3884. OnNext(230, 4),
  3885. OnCompleted<int>(250)
  3886. );
  3887. var res = scheduler.Start(() =>
  3888. xs.LongCount(x => x < 10)
  3889. );
  3890. res.Messages.AssertEqual(
  3891. OnNext(250, 3L),
  3892. OnCompleted<long>(250)
  3893. );
  3894. xs.Subscriptions.AssertEqual(
  3895. Subscribe(200, 250)
  3896. );
  3897. }
  3898. [Fact]
  3899. public void LongCount_Predicate_Some_None()
  3900. {
  3901. var scheduler = new TestScheduler();
  3902. var xs = scheduler.CreateHotObservable(
  3903. OnNext(150, 1),
  3904. OnNext(210, 2),
  3905. OnNext(220, 3),
  3906. OnNext(230, 4),
  3907. OnCompleted<int>(250)
  3908. );
  3909. var res = scheduler.Start(() =>
  3910. xs.LongCount(x => x > 10)
  3911. );
  3912. res.Messages.AssertEqual(
  3913. OnNext(250, 0L),
  3914. OnCompleted<long>(250)
  3915. );
  3916. xs.Subscriptions.AssertEqual(
  3917. Subscribe(200, 250)
  3918. );
  3919. }
  3920. [Fact]
  3921. public void LongCount_Predicate_Some_Even()
  3922. {
  3923. var scheduler = new TestScheduler();
  3924. var xs = scheduler.CreateHotObservable(
  3925. OnNext(150, 1),
  3926. OnNext(210, 2),
  3927. OnNext(220, 3),
  3928. OnNext(230, 4),
  3929. OnCompleted<int>(250)
  3930. );
  3931. var res = scheduler.Start(() =>
  3932. xs.LongCount(x => x % 2 == 0)
  3933. );
  3934. res.Messages.AssertEqual(
  3935. OnNext(250, 2L),
  3936. OnCompleted<long>(250)
  3937. );
  3938. xs.Subscriptions.AssertEqual(
  3939. Subscribe(200, 250)
  3940. );
  3941. }
  3942. [Fact]
  3943. public void LongCount_Predicate_Throw_True()
  3944. {
  3945. var ex = new Exception();
  3946. var scheduler = new TestScheduler();
  3947. var xs = scheduler.CreateHotObservable(
  3948. OnNext(150, 1),
  3949. OnError<int>(210, ex)
  3950. );
  3951. var res = scheduler.Start(() =>
  3952. xs.LongCount(_ => true)
  3953. );
  3954. res.Messages.AssertEqual(
  3955. OnError<long>(210, ex)
  3956. );
  3957. xs.Subscriptions.AssertEqual(
  3958. Subscribe(200, 210)
  3959. );
  3960. }
  3961. [Fact]
  3962. public void LongCount_Predicate_Throw_False()
  3963. {
  3964. var ex = new Exception();
  3965. var scheduler = new TestScheduler();
  3966. var xs = scheduler.CreateHotObservable(
  3967. OnNext(150, 1),
  3968. OnError<int>(210, ex)
  3969. );
  3970. var res = scheduler.Start(() =>
  3971. xs.LongCount(_ => false)
  3972. );
  3973. res.Messages.AssertEqual(
  3974. OnError<long>(210, ex)
  3975. );
  3976. xs.Subscriptions.AssertEqual(
  3977. Subscribe(200, 210)
  3978. );
  3979. }
  3980. [Fact]
  3981. public void LongCount_Predicate_Never()
  3982. {
  3983. var scheduler = new TestScheduler();
  3984. var xs = scheduler.CreateHotObservable(
  3985. OnNext(150, 1)
  3986. );
  3987. var res = scheduler.Start(() =>
  3988. xs.LongCount(_ => true)
  3989. );
  3990. res.Messages.AssertEqual(
  3991. );
  3992. xs.Subscriptions.AssertEqual(
  3993. Subscribe(200, 1000)
  3994. );
  3995. }
  3996. [Fact]
  3997. public void LongCount_Predicate_PredicateThrows()
  3998. {
  3999. var scheduler = new TestScheduler();
  4000. var xs = scheduler.CreateHotObservable(
  4001. OnNext(150, 1),
  4002. OnNext(210, 2),
  4003. OnNext(230, 3),
  4004. OnCompleted<int>(240)
  4005. );
  4006. var ex = new Exception();
  4007. var res = scheduler.Start(() =>
  4008. xs.LongCount(x =>
  4009. {
  4010. if (x == 3)
  4011. throw ex;
  4012. return true;
  4013. })
  4014. );
  4015. res.Messages.AssertEqual(
  4016. OnError<long>(230, ex)
  4017. );
  4018. xs.Subscriptions.AssertEqual(
  4019. Subscribe(200, 230)
  4020. );
  4021. }
  4022. #if !NO_PERF && !NO_THREAD && !CRIPPLED_REFLECTION
  4023. [Fact]
  4024. public void LongCount_Predicate_InjectOverflow()
  4025. {
  4026. var xs = Observable.Return(42, ThreadPoolScheduler.Instance);
  4027. var res = new OverflowInjection<int>(xs, long.MaxValue).LongCount(_ => true);
  4028. ReactiveAssert.Throws<OverflowException>(() => res.ForEach(_ => { }));
  4029. }
  4030. #endif
  4031. #endregion
  4032. #region + Max +
  4033. [Fact]
  4034. public void Max_ArgumentChecking()
  4035. {
  4036. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<int>)));
  4037. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<double>)));
  4038. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<float>)));
  4039. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<decimal>)));
  4040. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<long>)));
  4041. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<int?>)));
  4042. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<double?>)));
  4043. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<float?>)));
  4044. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<decimal?>)));
  4045. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<long?>)));
  4046. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(int)));
  4047. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(double)));
  4048. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(float)));
  4049. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(decimal)));
  4050. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(long)));
  4051. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(int?)));
  4052. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(double?)));
  4053. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(float?)));
  4054. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(decimal?)));
  4055. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => default(long?)));
  4056. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, int>)));
  4057. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, double>)));
  4058. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, float>)));
  4059. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, decimal>)));
  4060. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, long>)));
  4061. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, int?>)));
  4062. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, double?>)));
  4063. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, float?>)));
  4064. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, decimal?>)));
  4065. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, long?>)));
  4066. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>)));
  4067. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), Comparer<DateTime>.Default));
  4068. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(IComparer<DateTime>)));
  4069. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => ""));
  4070. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, string>)));
  4071. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(default(IObservable<DateTime>), _ => "", Comparer<string>.Default));
  4072. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), default(Func<DateTime, string>), Comparer<string>.Default));
  4073. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Max(Observable.Empty<DateTime>(), _ => "", default(IComparer<string>)));
  4074. }
  4075. [Fact]
  4076. public void Max_Int32_Empty()
  4077. {
  4078. var scheduler = new TestScheduler();
  4079. var xs = scheduler.CreateHotObservable(
  4080. OnNext(150, 1),
  4081. OnCompleted<int>(250)
  4082. );
  4083. var res = scheduler.Start(() =>
  4084. xs.Max()
  4085. );
  4086. res.Messages.AssertEqual(
  4087. OnError<int>(250, e => e is InvalidOperationException)
  4088. );
  4089. xs.Subscriptions.AssertEqual(
  4090. Subscribe(200, 250)
  4091. );
  4092. }
  4093. [Fact]
  4094. public void Max_Int32_Return()
  4095. {
  4096. var scheduler = new TestScheduler();
  4097. var xs = scheduler.CreateHotObservable(
  4098. OnNext(150, 1),
  4099. OnNext(210, 2),
  4100. OnCompleted<int>(250)
  4101. );
  4102. var res = scheduler.Start(() =>
  4103. xs.Max()
  4104. );
  4105. res.Messages.AssertEqual(
  4106. OnNext(250, 2),
  4107. OnCompleted<int>(250)
  4108. );
  4109. xs.Subscriptions.AssertEqual(
  4110. Subscribe(200, 250)
  4111. );
  4112. }
  4113. [Fact]
  4114. public void Max_Int32_Some()
  4115. {
  4116. var scheduler = new TestScheduler();
  4117. var xs = scheduler.CreateHotObservable(
  4118. OnNext(150, 1),
  4119. OnNext(210, 3),
  4120. OnNext(220, 4),
  4121. OnNext(230, 2),
  4122. OnCompleted<int>(250)
  4123. );
  4124. var res = scheduler.Start(() =>
  4125. xs.Max()
  4126. );
  4127. res.Messages.AssertEqual(
  4128. OnNext(250, 4),
  4129. OnCompleted<int>(250)
  4130. );
  4131. xs.Subscriptions.AssertEqual(
  4132. Subscribe(200, 250)
  4133. );
  4134. }
  4135. [Fact]
  4136. public void Max_Int32_Throw()
  4137. {
  4138. var ex = new Exception();
  4139. var scheduler = new TestScheduler();
  4140. var xs = scheduler.CreateHotObservable(
  4141. OnNext(150, 1),
  4142. OnError<int>(210, ex)
  4143. );
  4144. var res = scheduler.Start(() =>
  4145. xs.Max()
  4146. );
  4147. res.Messages.AssertEqual(
  4148. OnError<int>(210, ex)
  4149. );
  4150. xs.Subscriptions.AssertEqual(
  4151. Subscribe(200, 210)
  4152. );
  4153. }
  4154. [Fact]
  4155. public void Max_Int32_Never()
  4156. {
  4157. var ex = new Exception();
  4158. var scheduler = new TestScheduler();
  4159. var xs = scheduler.CreateHotObservable(
  4160. OnNext(150, 1)
  4161. );
  4162. var res = scheduler.Start(() =>
  4163. xs.Max()
  4164. );
  4165. res.Messages.AssertEqual(
  4166. );
  4167. xs.Subscriptions.AssertEqual(
  4168. Subscribe(200, 1000)
  4169. );
  4170. }
  4171. [Fact]
  4172. public void Max_Int64_Empty()
  4173. {
  4174. var scheduler = new TestScheduler();
  4175. var xs = scheduler.CreateHotObservable(
  4176. OnNext(150, 1L),
  4177. OnCompleted<long>(250)
  4178. );
  4179. var res = scheduler.Start(() =>
  4180. xs.Max()
  4181. );
  4182. res.Messages.AssertEqual(
  4183. OnError<long>(250, e => e is InvalidOperationException)
  4184. );
  4185. xs.Subscriptions.AssertEqual(
  4186. Subscribe(200, 250)
  4187. );
  4188. }
  4189. [Fact]
  4190. public void Max_Int64_Return()
  4191. {
  4192. var scheduler = new TestScheduler();
  4193. var xs = scheduler.CreateHotObservable(
  4194. OnNext(150, 1L),
  4195. OnNext(210, 2L),
  4196. OnCompleted<long>(250)
  4197. );
  4198. var res = scheduler.Start(() =>
  4199. xs.Max()
  4200. );
  4201. res.Messages.AssertEqual(
  4202. OnNext(250, 2L),
  4203. OnCompleted<long>(250)
  4204. );
  4205. xs.Subscriptions.AssertEqual(
  4206. Subscribe(200, 250)
  4207. );
  4208. }
  4209. [Fact]
  4210. public void Max_Int64_Some()
  4211. {
  4212. var scheduler = new TestScheduler();
  4213. var xs = scheduler.CreateHotObservable(
  4214. OnNext(150, 1L),
  4215. OnNext(210, 3L),
  4216. OnNext(220, 4L),
  4217. OnNext(230, 2L),
  4218. OnCompleted<long>(250)
  4219. );
  4220. var res = scheduler.Start(() =>
  4221. xs.Max()
  4222. );
  4223. res.Messages.AssertEqual(
  4224. OnNext(250, 4L),
  4225. OnCompleted<long>(250)
  4226. );
  4227. xs.Subscriptions.AssertEqual(
  4228. Subscribe(200, 250)
  4229. );
  4230. }
  4231. [Fact]
  4232. public void Max_Int64_Throw()
  4233. {
  4234. var ex = new Exception();
  4235. var scheduler = new TestScheduler();
  4236. var xs = scheduler.CreateHotObservable(
  4237. OnNext(150, 1L),
  4238. OnError<long>(210, ex)
  4239. );
  4240. var res = scheduler.Start(() =>
  4241. xs.Max()
  4242. );
  4243. res.Messages.AssertEqual(
  4244. OnError<long>(210, ex)
  4245. );
  4246. xs.Subscriptions.AssertEqual(
  4247. Subscribe(200, 210)
  4248. );
  4249. }
  4250. [Fact]
  4251. public void Max_Int64_Never()
  4252. {
  4253. var ex = new Exception();
  4254. var scheduler = new TestScheduler();
  4255. var xs = scheduler.CreateHotObservable(
  4256. OnNext(150, 1L)
  4257. );
  4258. var res = scheduler.Start(() =>
  4259. xs.Max()
  4260. );
  4261. res.Messages.AssertEqual(
  4262. );
  4263. xs.Subscriptions.AssertEqual(
  4264. Subscribe(200, 1000)
  4265. );
  4266. }
  4267. [Fact]
  4268. public void Max_Float_Empty()
  4269. {
  4270. var scheduler = new TestScheduler();
  4271. var xs = scheduler.CreateHotObservable(
  4272. OnNext(150, 1f),
  4273. OnCompleted<float>(250)
  4274. );
  4275. var res = scheduler.Start(() =>
  4276. xs.Max()
  4277. );
  4278. res.Messages.AssertEqual(
  4279. OnError<float>(250, e => e is InvalidOperationException)
  4280. );
  4281. xs.Subscriptions.AssertEqual(
  4282. Subscribe(200, 250)
  4283. );
  4284. }
  4285. [Fact]
  4286. public void Max_Float_Return()
  4287. {
  4288. var scheduler = new TestScheduler();
  4289. var xs = scheduler.CreateHotObservable(
  4290. OnNext(150, 1f),
  4291. OnNext(210, 2f),
  4292. OnCompleted<float>(250)
  4293. );
  4294. var res = scheduler.Start(() =>
  4295. xs.Max()
  4296. );
  4297. res.Messages.AssertEqual(
  4298. OnNext(250, 2f),
  4299. OnCompleted<float>(250)
  4300. );
  4301. xs.Subscriptions.AssertEqual(
  4302. Subscribe(200, 250)
  4303. );
  4304. }
  4305. [Fact]
  4306. public void Max_Float_Some()
  4307. {
  4308. var scheduler = new TestScheduler();
  4309. var xs = scheduler.CreateHotObservable(
  4310. OnNext(150, 1f),
  4311. OnNext(210, 3f),
  4312. OnNext(220, 4f),
  4313. OnNext(230, 2f),
  4314. OnCompleted<float>(250)
  4315. );
  4316. var res = scheduler.Start(() =>
  4317. xs.Max()
  4318. );
  4319. res.Messages.AssertEqual(
  4320. OnNext(250, 4f),
  4321. OnCompleted<float>(250)
  4322. );
  4323. xs.Subscriptions.AssertEqual(
  4324. Subscribe(200, 250)
  4325. );
  4326. }
  4327. [Fact]
  4328. public void Max_Float_Throw()
  4329. {
  4330. var ex = new Exception();
  4331. var scheduler = new TestScheduler();
  4332. var xs = scheduler.CreateHotObservable(
  4333. OnNext(150, 1f),
  4334. OnError<float>(210, ex)
  4335. );
  4336. var res = scheduler.Start(() =>
  4337. xs.Max()
  4338. );
  4339. res.Messages.AssertEqual(
  4340. OnError<float>(210, ex)
  4341. );
  4342. xs.Subscriptions.AssertEqual(
  4343. Subscribe(200, 210)
  4344. );
  4345. }
  4346. [Fact]
  4347. public void Max_Float_Never()
  4348. {
  4349. var ex = new Exception();
  4350. var scheduler = new TestScheduler();
  4351. var xs = scheduler.CreateHotObservable(
  4352. OnNext(150, 1f)
  4353. );
  4354. var res = scheduler.Start(() =>
  4355. xs.Max()
  4356. );
  4357. res.Messages.AssertEqual(
  4358. );
  4359. xs.Subscriptions.AssertEqual(
  4360. Subscribe(200, 1000)
  4361. );
  4362. }
  4363. [Fact]
  4364. public void Max_Double_Empty()
  4365. {
  4366. var scheduler = new TestScheduler();
  4367. var xs = scheduler.CreateHotObservable(
  4368. OnNext(150, 1.0),
  4369. OnCompleted<double>(250)
  4370. );
  4371. var res = scheduler.Start(() =>
  4372. xs.Max()
  4373. );
  4374. res.Messages.AssertEqual(
  4375. OnError<double>(250, e => e is InvalidOperationException)
  4376. );
  4377. xs.Subscriptions.AssertEqual(
  4378. Subscribe(200, 250)
  4379. );
  4380. }
  4381. [Fact]
  4382. public void Max_Double_Return()
  4383. {
  4384. var scheduler = new TestScheduler();
  4385. var xs = scheduler.CreateHotObservable(
  4386. OnNext(150, 1.0),
  4387. OnNext(210, 2.0),
  4388. OnCompleted<double>(250)
  4389. );
  4390. var res = scheduler.Start(() =>
  4391. xs.Max()
  4392. );
  4393. res.Messages.AssertEqual(
  4394. OnNext(250, 2.0),
  4395. OnCompleted<double>(250)
  4396. );
  4397. xs.Subscriptions.AssertEqual(
  4398. Subscribe(200, 250)
  4399. );
  4400. }
  4401. [Fact]
  4402. public void Max_Double_Some()
  4403. {
  4404. var scheduler = new TestScheduler();
  4405. var xs = scheduler.CreateHotObservable(
  4406. OnNext(150, 1.0),
  4407. OnNext(210, 3.0),
  4408. OnNext(220, 4.0),
  4409. OnNext(230, 2.0),
  4410. OnCompleted<double>(250)
  4411. );
  4412. var res = scheduler.Start(() =>
  4413. xs.Max()
  4414. );
  4415. res.Messages.AssertEqual(
  4416. OnNext(250, 4.0),
  4417. OnCompleted<double>(250)
  4418. );
  4419. xs.Subscriptions.AssertEqual(
  4420. Subscribe(200, 250)
  4421. );
  4422. }
  4423. [Fact]
  4424. public void Max_Double_Throw()
  4425. {
  4426. var ex = new Exception();
  4427. var scheduler = new TestScheduler();
  4428. var xs = scheduler.CreateHotObservable(
  4429. OnNext(150, 1.0),
  4430. OnError<double>(210, ex)
  4431. );
  4432. var res = scheduler.Start(() =>
  4433. xs.Max()
  4434. );
  4435. res.Messages.AssertEqual(
  4436. OnError<double>(210, ex)
  4437. );
  4438. xs.Subscriptions.AssertEqual(
  4439. Subscribe(200, 210)
  4440. );
  4441. }
  4442. [Fact]
  4443. public void Max_Double_Never()
  4444. {
  4445. var ex = new Exception();
  4446. var scheduler = new TestScheduler();
  4447. var xs = scheduler.CreateHotObservable(
  4448. OnNext(150, 1.0)
  4449. );
  4450. var res = scheduler.Start(() =>
  4451. xs.Max()
  4452. );
  4453. res.Messages.AssertEqual(
  4454. );
  4455. xs.Subscriptions.AssertEqual(
  4456. Subscribe(200, 1000)
  4457. );
  4458. }
  4459. [Fact]
  4460. public void Max_Decimal_Empty()
  4461. {
  4462. var scheduler = new TestScheduler();
  4463. var xs = scheduler.CreateHotObservable(
  4464. OnNext(150, 1m),
  4465. OnCompleted<decimal>(250)
  4466. );
  4467. var res = scheduler.Start(() =>
  4468. xs.Max()
  4469. );
  4470. res.Messages.AssertEqual(
  4471. OnError<decimal>(250, e => e is InvalidOperationException)
  4472. );
  4473. xs.Subscriptions.AssertEqual(
  4474. Subscribe(200, 250)
  4475. );
  4476. }
  4477. [Fact]
  4478. public void Max_Decimal_Return()
  4479. {
  4480. var scheduler = new TestScheduler();
  4481. var xs = scheduler.CreateHotObservable(
  4482. OnNext(150, 1m),
  4483. OnNext(210, 2m),
  4484. OnCompleted<decimal>(250)
  4485. );
  4486. var res = scheduler.Start(() =>
  4487. xs.Max()
  4488. );
  4489. res.Messages.AssertEqual(
  4490. OnNext(250, 2m),
  4491. OnCompleted<decimal>(250)
  4492. );
  4493. xs.Subscriptions.AssertEqual(
  4494. Subscribe(200, 250)
  4495. );
  4496. }
  4497. [Fact]
  4498. public void Max_Decimal_Some()
  4499. {
  4500. var scheduler = new TestScheduler();
  4501. var xs = scheduler.CreateHotObservable(
  4502. OnNext(150, 1m),
  4503. OnNext(210, 3m),
  4504. OnNext(220, 4m),
  4505. OnNext(230, 2m),
  4506. OnCompleted<decimal>(250)
  4507. );
  4508. var res = scheduler.Start(() =>
  4509. xs.Max()
  4510. );
  4511. res.Messages.AssertEqual(
  4512. OnNext(250, 4m),
  4513. OnCompleted<decimal>(250)
  4514. );
  4515. xs.Subscriptions.AssertEqual(
  4516. Subscribe(200, 250)
  4517. );
  4518. }
  4519. [Fact]
  4520. public void Max_Decimal_Throw()
  4521. {
  4522. var ex = new Exception();
  4523. var scheduler = new TestScheduler();
  4524. var xs = scheduler.CreateHotObservable(
  4525. OnNext(150, 1m),
  4526. OnError<decimal>(210, ex)
  4527. );
  4528. var res = scheduler.Start(() =>
  4529. xs.Max()
  4530. );
  4531. res.Messages.AssertEqual(
  4532. OnError<decimal>(210, ex)
  4533. );
  4534. xs.Subscriptions.AssertEqual(
  4535. Subscribe(200, 210)
  4536. );
  4537. }
  4538. [Fact]
  4539. public void Max_Decimal_Never()
  4540. {
  4541. var ex = new Exception();
  4542. var scheduler = new TestScheduler();
  4543. var xs = scheduler.CreateHotObservable(
  4544. OnNext(150, 1m)
  4545. );
  4546. var res = scheduler.Start(() =>
  4547. xs.Max()
  4548. );
  4549. res.Messages.AssertEqual(
  4550. );
  4551. xs.Subscriptions.AssertEqual(
  4552. Subscribe(200, 1000)
  4553. );
  4554. }
  4555. [Fact]
  4556. public void Max_Nullable_Int32_Empty()
  4557. {
  4558. var scheduler = new TestScheduler();
  4559. var xs = scheduler.CreateHotObservable(
  4560. OnNext(150, (int?)1),
  4561. OnCompleted<int?>(250)
  4562. );
  4563. var res = scheduler.Start(() =>
  4564. xs.Max()
  4565. );
  4566. res.Messages.AssertEqual(
  4567. OnNext(250, default(int?)),
  4568. OnCompleted<int?>(250)
  4569. );
  4570. xs.Subscriptions.AssertEqual(
  4571. Subscribe(200, 250)
  4572. );
  4573. }
  4574. [Fact]
  4575. public void Max_Nullable_Int32_Return()
  4576. {
  4577. var scheduler = new TestScheduler();
  4578. var xs = scheduler.CreateHotObservable(
  4579. OnNext(150, (int?)1),
  4580. OnNext(210, (int?)2),
  4581. OnCompleted<int?>(250)
  4582. );
  4583. var res = scheduler.Start(() =>
  4584. xs.Max()
  4585. );
  4586. res.Messages.AssertEqual(
  4587. OnNext(250, (int?)2),
  4588. OnCompleted<int?>(250)
  4589. );
  4590. xs.Subscriptions.AssertEqual(
  4591. Subscribe(200, 250)
  4592. );
  4593. }
  4594. [Fact]
  4595. public void Max_Nullable_Int32_Some1()
  4596. {
  4597. var scheduler = new TestScheduler();
  4598. var xs = scheduler.CreateHotObservable(
  4599. OnNext(150, (int?)1),
  4600. OnNext(210, (int?)null),
  4601. OnNext(220, (int?)4),
  4602. OnNext(230, (int?)2),
  4603. OnCompleted<int?>(250)
  4604. );
  4605. var res = scheduler.Start(() =>
  4606. xs.Max()
  4607. );
  4608. res.Messages.AssertEqual(
  4609. OnNext(250, (int?)4),
  4610. OnCompleted<int?>(250)
  4611. );
  4612. xs.Subscriptions.AssertEqual(
  4613. Subscribe(200, 250)
  4614. );
  4615. }
  4616. [Fact]
  4617. public void Max_Nullable_Int32_Some2()
  4618. {
  4619. var scheduler = new TestScheduler();
  4620. var xs = scheduler.CreateHotObservable(
  4621. OnNext(150, (int?)1),
  4622. OnNext(210, (int?)null),
  4623. OnNext(220, (int?)2),
  4624. OnNext(230, (int?)4),
  4625. OnCompleted<int?>(250)
  4626. );
  4627. var res = scheduler.Start(() =>
  4628. xs.Max()
  4629. );
  4630. res.Messages.AssertEqual(
  4631. OnNext(250, (int?)4),
  4632. OnCompleted<int?>(250)
  4633. );
  4634. xs.Subscriptions.AssertEqual(
  4635. Subscribe(200, 250)
  4636. );
  4637. }
  4638. [Fact]
  4639. public void Max_Nullable_GeneralNullableMaxTest_LhsNull()
  4640. {
  4641. var scheduler = new TestScheduler();
  4642. var xs = scheduler.CreateHotObservable(
  4643. OnNext(150, (int?)1),
  4644. OnNext(210, (int?)null),
  4645. OnNext(220, (int?)2),
  4646. OnCompleted<int?>(250)
  4647. );
  4648. var res = scheduler.Start(() =>
  4649. xs.Max()
  4650. );
  4651. res.Messages.AssertEqual(
  4652. OnNext(250, (int?)2),
  4653. OnCompleted<int?>(250)
  4654. );
  4655. xs.Subscriptions.AssertEqual(
  4656. Subscribe(200, 250)
  4657. );
  4658. }
  4659. [Fact]
  4660. public void Max_Nullable_GeneralNullableMaxTest_RhsNull()
  4661. {
  4662. var scheduler = new TestScheduler();
  4663. var xs = scheduler.CreateHotObservable(
  4664. OnNext(150, (int?)1),
  4665. OnNext(210, (int?)2),
  4666. OnNext(220, (int?)null),
  4667. OnCompleted<int?>(250)
  4668. );
  4669. var res = scheduler.Start(() =>
  4670. xs.Max()
  4671. );
  4672. res.Messages.AssertEqual(
  4673. OnNext(250, (int?)2),
  4674. OnCompleted<int?>(250)
  4675. );
  4676. xs.Subscriptions.AssertEqual(
  4677. Subscribe(200, 250)
  4678. );
  4679. }
  4680. [Fact]
  4681. public void Max_Nullable_GeneralNullableMaxTest_Less()
  4682. {
  4683. var scheduler = new TestScheduler();
  4684. var xs = scheduler.CreateHotObservable(
  4685. OnNext(150, (int?)1),
  4686. OnNext(210, (int?)2),
  4687. OnNext(220, (int?)3),
  4688. OnCompleted<int?>(250)
  4689. );
  4690. var res = scheduler.Start(() =>
  4691. xs.Max()
  4692. );
  4693. res.Messages.AssertEqual(
  4694. OnNext(250, (int?)3),
  4695. OnCompleted<int?>(250)
  4696. );
  4697. xs.Subscriptions.AssertEqual(
  4698. Subscribe(200, 250)
  4699. );
  4700. }
  4701. [Fact]
  4702. public void Max_Nullable_GeneralNullableMaxTest_Greater()
  4703. {
  4704. var scheduler = new TestScheduler();
  4705. var xs = scheduler.CreateHotObservable(
  4706. OnNext(150, (int?)1),
  4707. OnNext(210, (int?)3),
  4708. OnNext(220, (int?)2),
  4709. OnCompleted<int?>(250)
  4710. );
  4711. var res = scheduler.Start(() =>
  4712. xs.Max()
  4713. );
  4714. res.Messages.AssertEqual(
  4715. OnNext(250, (int?)3),
  4716. OnCompleted<int?>(250)
  4717. );
  4718. xs.Subscriptions.AssertEqual(
  4719. Subscribe(200, 250)
  4720. );
  4721. }
  4722. [Fact]
  4723. public void Max_Nullable_Int32_Throw()
  4724. {
  4725. var ex = new Exception();
  4726. var scheduler = new TestScheduler();
  4727. var xs = scheduler.CreateHotObservable(
  4728. OnNext(150, (int?)1),
  4729. OnError<int?>(210, ex)
  4730. );
  4731. var res = scheduler.Start(() =>
  4732. xs.Max()
  4733. );
  4734. res.Messages.AssertEqual(
  4735. OnError<int?>(210, ex)
  4736. );
  4737. xs.Subscriptions.AssertEqual(
  4738. Subscribe(200, 210)
  4739. );
  4740. }
  4741. [Fact]
  4742. public void Max_Nullable_Int32_Never()
  4743. {
  4744. var ex = new Exception();
  4745. var scheduler = new TestScheduler();
  4746. var xs = scheduler.CreateHotObservable(
  4747. OnNext(150, (int?)1)
  4748. );
  4749. var res = scheduler.Start(() =>
  4750. xs.Max()
  4751. );
  4752. res.Messages.AssertEqual(
  4753. );
  4754. xs.Subscriptions.AssertEqual(
  4755. Subscribe(200, 1000)
  4756. );
  4757. }
  4758. [Fact]
  4759. public void Max_Nullable_Int64_Empty()
  4760. {
  4761. var scheduler = new TestScheduler();
  4762. var xs = scheduler.CreateHotObservable(
  4763. OnNext(150, (long?)1L),
  4764. OnCompleted<long?>(250)
  4765. );
  4766. var res = scheduler.Start(() =>
  4767. xs.Max()
  4768. );
  4769. res.Messages.AssertEqual(
  4770. OnNext(250, default(long?)),
  4771. OnCompleted<long?>(250)
  4772. );
  4773. xs.Subscriptions.AssertEqual(
  4774. Subscribe(200, 250)
  4775. );
  4776. }
  4777. [Fact]
  4778. public void Max_Nullable_Int64_Return()
  4779. {
  4780. var scheduler = new TestScheduler();
  4781. var xs = scheduler.CreateHotObservable(
  4782. OnNext(150, (long?)1L),
  4783. OnNext(210, (long?)2L),
  4784. OnCompleted<long?>(250)
  4785. );
  4786. var res = scheduler.Start(() =>
  4787. xs.Max()
  4788. );
  4789. res.Messages.AssertEqual(
  4790. OnNext(250, (long?)2L),
  4791. OnCompleted<long?>(250)
  4792. );
  4793. xs.Subscriptions.AssertEqual(
  4794. Subscribe(200, 250)
  4795. );
  4796. }
  4797. [Fact]
  4798. public void Max_Nullable_Int64_Some1()
  4799. {
  4800. var scheduler = new TestScheduler();
  4801. var xs = scheduler.CreateHotObservable(
  4802. OnNext(150, (long?)1L),
  4803. OnNext(210, (long?)null),
  4804. OnNext(220, (long?)4L),
  4805. OnNext(230, (long?)2L),
  4806. OnCompleted<long?>(250)
  4807. );
  4808. var res = scheduler.Start(() =>
  4809. xs.Max()
  4810. );
  4811. res.Messages.AssertEqual(
  4812. OnNext(250, (long?)4L),
  4813. OnCompleted<long?>(250)
  4814. );
  4815. xs.Subscriptions.AssertEqual(
  4816. Subscribe(200, 250)
  4817. );
  4818. }
  4819. [Fact]
  4820. public void Max_Nullable_Int64_Some2()
  4821. {
  4822. var scheduler = new TestScheduler();
  4823. var xs = scheduler.CreateHotObservable(
  4824. OnNext(150, (long?)1L),
  4825. OnNext(210, (long?)null),
  4826. OnNext(220, (long?)2L),
  4827. OnNext(230, (long?)4L),
  4828. OnCompleted<long?>(250)
  4829. );
  4830. var res = scheduler.Start(() =>
  4831. xs.Max()
  4832. );
  4833. res.Messages.AssertEqual(
  4834. OnNext(250, (long?)4L),
  4835. OnCompleted<long?>(250)
  4836. );
  4837. xs.Subscriptions.AssertEqual(
  4838. Subscribe(200, 250)
  4839. );
  4840. }
  4841. [Fact]
  4842. public void Max_Nullable_Int64_Throw()
  4843. {
  4844. var ex = new Exception();
  4845. var scheduler = new TestScheduler();
  4846. var xs = scheduler.CreateHotObservable(
  4847. OnNext(150, (long?)1L),
  4848. OnError<long?>(210, ex)
  4849. );
  4850. var res = scheduler.Start(() =>
  4851. xs.Max()
  4852. );
  4853. res.Messages.AssertEqual(
  4854. OnError<long?>(210, ex)
  4855. );
  4856. xs.Subscriptions.AssertEqual(
  4857. Subscribe(200, 210)
  4858. );
  4859. }
  4860. [Fact]
  4861. public void Max_Nullable_Int64_Never()
  4862. {
  4863. var ex = new Exception();
  4864. var scheduler = new TestScheduler();
  4865. var xs = scheduler.CreateHotObservable(
  4866. OnNext(150, (long?)1L)
  4867. );
  4868. var res = scheduler.Start(() =>
  4869. xs.Max()
  4870. );
  4871. res.Messages.AssertEqual(
  4872. );
  4873. xs.Subscriptions.AssertEqual(
  4874. Subscribe(200, 1000)
  4875. );
  4876. }
  4877. [Fact]
  4878. public void Max_Nullable_Float_Empty()
  4879. {
  4880. var scheduler = new TestScheduler();
  4881. var xs = scheduler.CreateHotObservable(
  4882. OnNext(150, (float?)1f),
  4883. OnCompleted<float?>(250)
  4884. );
  4885. var res = scheduler.Start(() =>
  4886. xs.Max()
  4887. );
  4888. res.Messages.AssertEqual(
  4889. OnNext(250, default(float?)),
  4890. OnCompleted<float?>(250)
  4891. );
  4892. xs.Subscriptions.AssertEqual(
  4893. Subscribe(200, 250)
  4894. );
  4895. }
  4896. [Fact]
  4897. public void Max_Nullable_Float_Return()
  4898. {
  4899. var scheduler = new TestScheduler();
  4900. var xs = scheduler.CreateHotObservable(
  4901. OnNext(150, (float?)1f),
  4902. OnNext(210, (float?)2f),
  4903. OnCompleted<float?>(250)
  4904. );
  4905. var res = scheduler.Start(() =>
  4906. xs.Max()
  4907. );
  4908. res.Messages.AssertEqual(
  4909. OnNext(250, (float?)2f),
  4910. OnCompleted<float?>(250)
  4911. );
  4912. xs.Subscriptions.AssertEqual(
  4913. Subscribe(200, 250)
  4914. );
  4915. }
  4916. [Fact]
  4917. public void Max_Nullable_Float_Some1()
  4918. {
  4919. var scheduler = new TestScheduler();
  4920. var xs = scheduler.CreateHotObservable(
  4921. OnNext(150, (float?)1f),
  4922. OnNext(210, (float?)null),
  4923. OnNext(220, (float?)4f),
  4924. OnNext(230, (float?)2f),
  4925. OnCompleted<float?>(250)
  4926. );
  4927. var res = scheduler.Start(() =>
  4928. xs.Max()
  4929. );
  4930. res.Messages.AssertEqual(
  4931. OnNext(250, (float?)4f),
  4932. OnCompleted<float?>(250)
  4933. );
  4934. xs.Subscriptions.AssertEqual(
  4935. Subscribe(200, 250)
  4936. );
  4937. }
  4938. [Fact]
  4939. public void Max_Nullable_Float_Some2()
  4940. {
  4941. var scheduler = new TestScheduler();
  4942. var xs = scheduler.CreateHotObservable(
  4943. OnNext(150, (float?)1f),
  4944. OnNext(210, (float?)null),
  4945. OnNext(220, (float?)2f),
  4946. OnNext(230, (float?)4f),
  4947. OnCompleted<float?>(250)
  4948. );
  4949. var res = scheduler.Start(() =>
  4950. xs.Max()
  4951. );
  4952. res.Messages.AssertEqual(
  4953. OnNext(250, (float?)4f),
  4954. OnCompleted<float?>(250)
  4955. );
  4956. xs.Subscriptions.AssertEqual(
  4957. Subscribe(200, 250)
  4958. );
  4959. }
  4960. [Fact]
  4961. public void Max_Nullable_Float_Throw()
  4962. {
  4963. var ex = new Exception();
  4964. var scheduler = new TestScheduler();
  4965. var xs = scheduler.CreateHotObservable(
  4966. OnNext(150, (float?)1f),
  4967. OnError<float?>(210, ex)
  4968. );
  4969. var res = scheduler.Start(() =>
  4970. xs.Max()
  4971. );
  4972. res.Messages.AssertEqual(
  4973. OnError<float?>(210, ex)
  4974. );
  4975. xs.Subscriptions.AssertEqual(
  4976. Subscribe(200, 210)
  4977. );
  4978. }
  4979. [Fact]
  4980. public void Max_Nullable_Float_Never()
  4981. {
  4982. var ex = new Exception();
  4983. var scheduler = new TestScheduler();
  4984. var xs = scheduler.CreateHotObservable(
  4985. OnNext(150, (float?)1f)
  4986. );
  4987. var res = scheduler.Start(() =>
  4988. xs.Max()
  4989. );
  4990. res.Messages.AssertEqual(
  4991. );
  4992. xs.Subscriptions.AssertEqual(
  4993. Subscribe(200, 1000)
  4994. );
  4995. }
  4996. [Fact]
  4997. public void Max_Nullable_Double_Empty()
  4998. {
  4999. var scheduler = new TestScheduler();
  5000. var xs = scheduler.CreateHotObservable(
  5001. OnNext(150, (double?)1.0),
  5002. OnCompleted<double?>(250)
  5003. );
  5004. var res = scheduler.Start(() =>
  5005. xs.Max()
  5006. );
  5007. res.Messages.AssertEqual(
  5008. OnNext(250, default(double?)),
  5009. OnCompleted<double?>(250)
  5010. );
  5011. xs.Subscriptions.AssertEqual(
  5012. Subscribe(200, 250)
  5013. );
  5014. }
  5015. [Fact]
  5016. public void Max_Nullable_Double_Return()
  5017. {
  5018. var scheduler = new TestScheduler();
  5019. var xs = scheduler.CreateHotObservable(
  5020. OnNext(150, (double?)1.0),
  5021. OnNext(210, (double?)2.0),
  5022. OnCompleted<double?>(250)
  5023. );
  5024. var res = scheduler.Start(() =>
  5025. xs.Max()
  5026. );
  5027. res.Messages.AssertEqual(
  5028. OnNext(250, (double?)2.0),
  5029. OnCompleted<double?>(250)
  5030. );
  5031. xs.Subscriptions.AssertEqual(
  5032. Subscribe(200, 250)
  5033. );
  5034. }
  5035. [Fact]
  5036. public void Max_Nullable_Double_Some1()
  5037. {
  5038. var scheduler = new TestScheduler();
  5039. var xs = scheduler.CreateHotObservable(
  5040. OnNext(150, (double?)1.0),
  5041. OnNext(210, (double?)null),
  5042. OnNext(220, (double?)4.0),
  5043. OnNext(230, (double?)2.0),
  5044. OnCompleted<double?>(250)
  5045. );
  5046. var res = scheduler.Start(() =>
  5047. xs.Max()
  5048. );
  5049. res.Messages.AssertEqual(
  5050. OnNext(250, (double?)4.0),
  5051. OnCompleted<double?>(250)
  5052. );
  5053. xs.Subscriptions.AssertEqual(
  5054. Subscribe(200, 250)
  5055. );
  5056. }
  5057. [Fact]
  5058. public void Max_Nullable_Double_Some2()
  5059. {
  5060. var scheduler = new TestScheduler();
  5061. var xs = scheduler.CreateHotObservable(
  5062. OnNext(150, (double?)1.0),
  5063. OnNext(210, (double?)null),
  5064. OnNext(220, (double?)2.0),
  5065. OnNext(230, (double?)4.0),
  5066. OnCompleted<double?>(250)
  5067. );
  5068. var res = scheduler.Start(() =>
  5069. xs.Max()
  5070. );
  5071. res.Messages.AssertEqual(
  5072. OnNext(250, (double?)4.0),
  5073. OnCompleted<double?>(250)
  5074. );
  5075. xs.Subscriptions.AssertEqual(
  5076. Subscribe(200, 250)
  5077. );
  5078. }
  5079. [Fact]
  5080. public void Max_Nullable_Double_Throw()
  5081. {
  5082. var ex = new Exception();
  5083. var scheduler = new TestScheduler();
  5084. var xs = scheduler.CreateHotObservable(
  5085. OnNext(150, (double?)1.0),
  5086. OnError<double?>(210, ex)
  5087. );
  5088. var res = scheduler.Start(() =>
  5089. xs.Max()
  5090. );
  5091. res.Messages.AssertEqual(
  5092. OnError<double?>(210, ex)
  5093. );
  5094. xs.Subscriptions.AssertEqual(
  5095. Subscribe(200, 210)
  5096. );
  5097. }
  5098. [Fact]
  5099. public void Max_Nullable_Double_Never()
  5100. {
  5101. var ex = new Exception();
  5102. var scheduler = new TestScheduler();
  5103. var xs = scheduler.CreateHotObservable(
  5104. OnNext(150, (double?)1.0)
  5105. );
  5106. var res = scheduler.Start(() =>
  5107. xs.Max()
  5108. );
  5109. res.Messages.AssertEqual(
  5110. );
  5111. xs.Subscriptions.AssertEqual(
  5112. Subscribe(200, 1000)
  5113. );
  5114. }
  5115. [Fact]
  5116. public void Max_Nullable_Decimal_Empty()
  5117. {
  5118. var scheduler = new TestScheduler();
  5119. var xs = scheduler.CreateHotObservable(
  5120. OnNext(150, (decimal?)1m),
  5121. OnCompleted<decimal?>(250)
  5122. );
  5123. var res = scheduler.Start(() =>
  5124. xs.Max()
  5125. );
  5126. res.Messages.AssertEqual(
  5127. OnNext(250, default(decimal?)),
  5128. OnCompleted<decimal?>(250)
  5129. );
  5130. xs.Subscriptions.AssertEqual(
  5131. Subscribe(200, 250)
  5132. );
  5133. }
  5134. [Fact]
  5135. public void Max_Nullable_Decimal_Return()
  5136. {
  5137. var scheduler = new TestScheduler();
  5138. var xs = scheduler.CreateHotObservable(
  5139. OnNext(150, (decimal?)1m),
  5140. OnNext(210, (decimal?)2m),
  5141. OnCompleted<decimal?>(250)
  5142. );
  5143. var res = scheduler.Start(() =>
  5144. xs.Max()
  5145. );
  5146. res.Messages.AssertEqual(
  5147. OnNext(250, (decimal?)2m),
  5148. OnCompleted<decimal?>(250)
  5149. );
  5150. xs.Subscriptions.AssertEqual(
  5151. Subscribe(200, 250)
  5152. );
  5153. }
  5154. [Fact]
  5155. public void Max_Nullable_Decimal_Some1()
  5156. {
  5157. var scheduler = new TestScheduler();
  5158. var xs = scheduler.CreateHotObservable(
  5159. OnNext(150, (decimal?)1m),
  5160. OnNext(210, (decimal?)null),
  5161. OnNext(220, (decimal?)4m),
  5162. OnNext(230, (decimal?)2m),
  5163. OnCompleted<decimal?>(250)
  5164. );
  5165. var res = scheduler.Start(() =>
  5166. xs.Max()
  5167. );
  5168. res.Messages.AssertEqual(
  5169. OnNext(250, (decimal?)4m),
  5170. OnCompleted<decimal?>(250)
  5171. );
  5172. xs.Subscriptions.AssertEqual(
  5173. Subscribe(200, 250)
  5174. );
  5175. }
  5176. [Fact]
  5177. public void Max_Nullable_Decimal_Some2()
  5178. {
  5179. var scheduler = new TestScheduler();
  5180. var xs = scheduler.CreateHotObservable(
  5181. OnNext(150, (decimal?)1m),
  5182. OnNext(210, (decimal?)null),
  5183. OnNext(220, (decimal?)2m),
  5184. OnNext(230, (decimal?)4m),
  5185. OnCompleted<decimal?>(250)
  5186. );
  5187. var res = scheduler.Start(() =>
  5188. xs.Max()
  5189. );
  5190. res.Messages.AssertEqual(
  5191. OnNext(250, (decimal?)4m),
  5192. OnCompleted<decimal?>(250)
  5193. );
  5194. xs.Subscriptions.AssertEqual(
  5195. Subscribe(200, 250)
  5196. );
  5197. }
  5198. [Fact]
  5199. public void Max_Nullable_Decimal_Throw()
  5200. {
  5201. var ex = new Exception();
  5202. var scheduler = new TestScheduler();
  5203. var xs = scheduler.CreateHotObservable(
  5204. OnNext(150, (decimal?)1m),
  5205. OnError<decimal?>(210, ex)
  5206. );
  5207. var res = scheduler.Start(() =>
  5208. xs.Max()
  5209. );
  5210. res.Messages.AssertEqual(
  5211. OnError<decimal?>(210, ex)
  5212. );
  5213. xs.Subscriptions.AssertEqual(
  5214. Subscribe(200, 210)
  5215. );
  5216. }
  5217. [Fact]
  5218. public void Max_Nullable_Decimal_Never()
  5219. {
  5220. var ex = new Exception();
  5221. var scheduler = new TestScheduler();
  5222. var xs = scheduler.CreateHotObservable(
  5223. OnNext(150, (decimal?)1m)
  5224. );
  5225. var res = scheduler.Start(() =>
  5226. xs.Max()
  5227. );
  5228. res.Messages.AssertEqual(
  5229. );
  5230. xs.Subscriptions.AssertEqual(
  5231. Subscribe(200, 1000)
  5232. );
  5233. }
  5234. [Fact]
  5235. public void MaxOfT_Reference_Empty()
  5236. {
  5237. var scheduler = new TestScheduler();
  5238. var xs = scheduler.CreateHotObservable(
  5239. OnNext(150, "z"),
  5240. OnCompleted<string>(250)
  5241. );
  5242. var res = scheduler.Start(() =>
  5243. xs.Max()
  5244. );
  5245. #if !NO_PERF
  5246. // BREAKING CHANGE v2 > v1.x - Behavior for reference types
  5247. res.Messages.AssertEqual(
  5248. OnNext(250, default(string)),
  5249. OnCompleted<string>(250)
  5250. );
  5251. #else
  5252. res.Messages.AssertEqual(
  5253. OnError<string>(250, e => e is InvalidOperationException)
  5254. );
  5255. #endif
  5256. xs.Subscriptions.AssertEqual(
  5257. Subscribe(200, 250)
  5258. );
  5259. }
  5260. [Fact]
  5261. public void MaxOfT_Value_Empty()
  5262. {
  5263. var scheduler = new TestScheduler();
  5264. var xs = scheduler.CreateHotObservable(
  5265. OnNext(150, DateTime.Now),
  5266. OnCompleted<DateTime>(250)
  5267. );
  5268. var res = scheduler.Start(() =>
  5269. xs.Max()
  5270. );
  5271. res.Messages.AssertEqual(
  5272. OnError<DateTime>(250, e => e is InvalidOperationException)
  5273. );
  5274. xs.Subscriptions.AssertEqual(
  5275. Subscribe(200, 250)
  5276. );
  5277. }
  5278. [Fact]
  5279. public void MaxOfT_Reference_Return()
  5280. {
  5281. var scheduler = new TestScheduler();
  5282. var xs = scheduler.CreateHotObservable(
  5283. OnNext(150, "z"),
  5284. OnNext(210, "a"),
  5285. OnCompleted<string>(250)
  5286. );
  5287. var res = scheduler.Start(() =>
  5288. xs.Max()
  5289. );
  5290. res.Messages.AssertEqual(
  5291. OnNext(250, "a"),
  5292. OnCompleted<string>(250)
  5293. );
  5294. xs.Subscriptions.AssertEqual(
  5295. Subscribe(200, 250)
  5296. );
  5297. }
  5298. [Fact]
  5299. public void MaxOfT_Value_Return()
  5300. {
  5301. var scheduler = new TestScheduler();
  5302. var xs = scheduler.CreateHotObservable(
  5303. OnNext(150, DateTime.Now),
  5304. OnNext(210, new DateTime(1983, 2, 11)),
  5305. OnCompleted<DateTime>(250)
  5306. );
  5307. var res = scheduler.Start(() =>
  5308. xs.Max()
  5309. );
  5310. res.Messages.AssertEqual(
  5311. OnNext(250, new DateTime(1983, 2, 11)),
  5312. OnCompleted<DateTime>(250)
  5313. );
  5314. xs.Subscriptions.AssertEqual(
  5315. Subscribe(200, 250)
  5316. );
  5317. }
  5318. [Fact]
  5319. public void MaxOfT_Reference_Some()
  5320. {
  5321. var scheduler = new TestScheduler();
  5322. var xs = scheduler.CreateHotObservable(
  5323. OnNext(150, "z"),
  5324. OnNext(210, "b"),
  5325. OnNext(220, "c"),
  5326. OnNext(230, "a"),
  5327. OnCompleted<string>(250)
  5328. );
  5329. var res = scheduler.Start(() =>
  5330. xs.Max()
  5331. );
  5332. res.Messages.AssertEqual(
  5333. OnNext(250, "c"),
  5334. OnCompleted<string>(250)
  5335. );
  5336. xs.Subscriptions.AssertEqual(
  5337. Subscribe(200, 250)
  5338. );
  5339. }
  5340. [Fact]
  5341. public void MaxOfT_Value_Some()
  5342. {
  5343. var scheduler = new TestScheduler();
  5344. var xs = scheduler.CreateHotObservable(
  5345. OnNext(150, DateTime.Now),
  5346. OnNext(210, new DateTime(1993, 2, 11)),
  5347. OnNext(220, new DateTime(2003, 2, 11)),
  5348. OnNext(230, new DateTime(1983, 2, 11)),
  5349. OnCompleted<DateTime>(250)
  5350. );
  5351. var res = scheduler.Start(() =>
  5352. xs.Max()
  5353. );
  5354. res.Messages.AssertEqual(
  5355. OnNext(250, new DateTime(2003, 2, 11)),
  5356. OnCompleted<DateTime>(250)
  5357. );
  5358. xs.Subscriptions.AssertEqual(
  5359. Subscribe(200, 250)
  5360. );
  5361. }
  5362. [Fact]
  5363. public void MaxOfT_Reference_Throw()
  5364. {
  5365. var ex = new Exception();
  5366. var scheduler = new TestScheduler();
  5367. var xs = scheduler.CreateHotObservable(
  5368. OnNext(150, "z"),
  5369. OnError<string>(210, ex)
  5370. );
  5371. var res = scheduler.Start(() =>
  5372. xs.Max()
  5373. );
  5374. res.Messages.AssertEqual(
  5375. OnError<string>(210, ex)
  5376. );
  5377. xs.Subscriptions.AssertEqual(
  5378. Subscribe(200, 210)
  5379. );
  5380. }
  5381. [Fact]
  5382. public void MaxOfT_Value_Throw()
  5383. {
  5384. var ex = new Exception();
  5385. var scheduler = new TestScheduler();
  5386. var xs = scheduler.CreateHotObservable(
  5387. OnNext(150, DateTime.Now),
  5388. OnError<DateTime>(210, ex)
  5389. );
  5390. var res = scheduler.Start(() =>
  5391. xs.Max()
  5392. );
  5393. res.Messages.AssertEqual(
  5394. OnError<DateTime>(210, ex)
  5395. );
  5396. xs.Subscriptions.AssertEqual(
  5397. Subscribe(200, 210)
  5398. );
  5399. }
  5400. [Fact]
  5401. public void MaxOfT_Reference_Never()
  5402. {
  5403. var ex = new Exception();
  5404. var scheduler = new TestScheduler();
  5405. var xs = scheduler.CreateHotObservable(
  5406. OnNext(150, "z")
  5407. );
  5408. var res = scheduler.Start(() =>
  5409. xs.Max()
  5410. );
  5411. res.Messages.AssertEqual(
  5412. );
  5413. xs.Subscriptions.AssertEqual(
  5414. Subscribe(200, 1000)
  5415. );
  5416. }
  5417. [Fact]
  5418. public void MaxOfT_Value_Never()
  5419. {
  5420. var ex = new Exception();
  5421. var scheduler = new TestScheduler();
  5422. var xs = scheduler.CreateHotObservable(
  5423. OnNext(150, DateTime.Now)
  5424. );
  5425. var res = scheduler.Start(() =>
  5426. xs.Max()
  5427. );
  5428. res.Messages.AssertEqual(
  5429. );
  5430. xs.Subscriptions.AssertEqual(
  5431. Subscribe(200, 1000)
  5432. );
  5433. }
  5434. [Fact]
  5435. public void MaxOfT_Reference_Comparer_Empty()
  5436. {
  5437. var scheduler = new TestScheduler();
  5438. var xs = scheduler.CreateHotObservable(
  5439. OnNext(150, "z"),
  5440. OnCompleted<string>(250)
  5441. );
  5442. var res = scheduler.Start(() =>
  5443. xs.Max(new ReverseComparer<string>(Comparer<string>.Default))
  5444. );
  5445. #if !NO_PERF
  5446. // BREAKING CHANGE v2 > v1.x - Behavior for reference types
  5447. res.Messages.AssertEqual(
  5448. OnNext(250, default(string)),
  5449. OnCompleted<string>(250)
  5450. );
  5451. #else
  5452. res.Messages.AssertEqual(
  5453. OnError<string>(250, e => e is InvalidOperationException)
  5454. );
  5455. #endif
  5456. xs.Subscriptions.AssertEqual(
  5457. Subscribe(200, 250)
  5458. );
  5459. }
  5460. [Fact]
  5461. public void MaxOfT_Value_Comparer_Empty()
  5462. {
  5463. var scheduler = new TestScheduler();
  5464. var xs = scheduler.CreateHotObservable(
  5465. OnNext(150, DateTime.Now),
  5466. OnCompleted<DateTime>(250)
  5467. );
  5468. var res = scheduler.Start(() =>
  5469. xs.Max(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  5470. );
  5471. res.Messages.AssertEqual(
  5472. OnError<DateTime>(250, e => e is InvalidOperationException)
  5473. );
  5474. xs.Subscriptions.AssertEqual(
  5475. Subscribe(200, 250)
  5476. );
  5477. }
  5478. [Fact]
  5479. public void MaxOfT_Reference_Comparer_Return()
  5480. {
  5481. var scheduler = new TestScheduler();
  5482. var xs = scheduler.CreateHotObservable(
  5483. OnNext(150, "z"),
  5484. OnNext(210, "a"),
  5485. OnCompleted<string>(250)
  5486. );
  5487. var res = scheduler.Start(() =>
  5488. xs.Max(new ReverseComparer<string>(Comparer<string>.Default))
  5489. );
  5490. res.Messages.AssertEqual(
  5491. OnNext(250, "a"),
  5492. OnCompleted<string>(250)
  5493. );
  5494. xs.Subscriptions.AssertEqual(
  5495. Subscribe(200, 250)
  5496. );
  5497. }
  5498. [Fact]
  5499. public void MaxOfT_Value_Comparer_Return()
  5500. {
  5501. var scheduler = new TestScheduler();
  5502. var xs = scheduler.CreateHotObservable(
  5503. OnNext(150, DateTime.Now),
  5504. OnNext(210, new DateTime(1983, 2, 11)),
  5505. OnCompleted<DateTime>(250)
  5506. );
  5507. var res = scheduler.Start(() =>
  5508. xs.Max(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  5509. );
  5510. res.Messages.AssertEqual(
  5511. OnNext(250, new DateTime(1983, 2, 11)),
  5512. OnCompleted<DateTime>(250)
  5513. );
  5514. xs.Subscriptions.AssertEqual(
  5515. Subscribe(200, 250)
  5516. );
  5517. }
  5518. [Fact]
  5519. public void MaxOfT_Reference_Comparer_Some()
  5520. {
  5521. var scheduler = new TestScheduler();
  5522. var xs = scheduler.CreateHotObservable(
  5523. OnNext(150, "z"),
  5524. OnNext(210, "b"),
  5525. OnNext(220, "c"),
  5526. OnNext(230, "a"),
  5527. OnCompleted<string>(250)
  5528. );
  5529. var res = scheduler.Start(() =>
  5530. xs.Max(new ReverseComparer<string>(Comparer<string>.Default))
  5531. );
  5532. res.Messages.AssertEqual(
  5533. OnNext(250, "a"),
  5534. OnCompleted<string>(250)
  5535. );
  5536. xs.Subscriptions.AssertEqual(
  5537. Subscribe(200, 250)
  5538. );
  5539. }
  5540. [Fact]
  5541. public void MaxOfT_Value_Comparer_Some()
  5542. {
  5543. var scheduler = new TestScheduler();
  5544. var xs = scheduler.CreateHotObservable(
  5545. OnNext(150, DateTime.Now),
  5546. OnNext(210, new DateTime(1993, 2, 11)),
  5547. OnNext(220, new DateTime(2003, 2, 11)),
  5548. OnNext(230, new DateTime(1983, 2, 11)),
  5549. OnCompleted<DateTime>(250)
  5550. );
  5551. var res = scheduler.Start(() =>
  5552. xs.Max(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  5553. );
  5554. res.Messages.AssertEqual(
  5555. OnNext(250, new DateTime(1983, 2, 11)),
  5556. OnCompleted<DateTime>(250)
  5557. );
  5558. xs.Subscriptions.AssertEqual(
  5559. Subscribe(200, 250)
  5560. );
  5561. }
  5562. [Fact]
  5563. public void MaxOfT_Reference_Comparer_Throw()
  5564. {
  5565. var ex = new Exception();
  5566. var scheduler = new TestScheduler();
  5567. var xs = scheduler.CreateHotObservable(
  5568. OnNext(150, "z"),
  5569. OnError<string>(210, ex)
  5570. );
  5571. var res = scheduler.Start(() =>
  5572. xs.Max(new ReverseComparer<string>(Comparer<string>.Default))
  5573. );
  5574. res.Messages.AssertEqual(
  5575. OnError<string>(210, ex)
  5576. );
  5577. xs.Subscriptions.AssertEqual(
  5578. Subscribe(200, 210)
  5579. );
  5580. }
  5581. [Fact]
  5582. public void MaxOfT_Value_Comparer_Throw()
  5583. {
  5584. var ex = new Exception();
  5585. var scheduler = new TestScheduler();
  5586. var xs = scheduler.CreateHotObservable(
  5587. OnNext(150, DateTime.Now),
  5588. OnError<DateTime>(210, ex)
  5589. );
  5590. var res = scheduler.Start(() =>
  5591. xs.Max(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  5592. );
  5593. res.Messages.AssertEqual(
  5594. OnError<DateTime>(210, ex)
  5595. );
  5596. xs.Subscriptions.AssertEqual(
  5597. Subscribe(200, 210)
  5598. );
  5599. }
  5600. [Fact]
  5601. public void MaxOfT_Reference_Comparer_Never()
  5602. {
  5603. var ex = new Exception();
  5604. var scheduler = new TestScheduler();
  5605. var xs = scheduler.CreateHotObservable(
  5606. OnNext(150, "z")
  5607. );
  5608. var res = scheduler.Start(() =>
  5609. xs.Max(new ReverseComparer<string>(Comparer<string>.Default))
  5610. );
  5611. res.Messages.AssertEqual(
  5612. );
  5613. xs.Subscriptions.AssertEqual(
  5614. Subscribe(200, 1000)
  5615. );
  5616. }
  5617. [Fact]
  5618. public void MaxOfT_Value_Comparer_Never()
  5619. {
  5620. var ex = new Exception();
  5621. var scheduler = new TestScheduler();
  5622. var xs = scheduler.CreateHotObservable(
  5623. OnNext(150, DateTime.Now)
  5624. );
  5625. var res = scheduler.Start(() =>
  5626. xs.Max(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  5627. );
  5628. res.Messages.AssertEqual(
  5629. );
  5630. xs.Subscriptions.AssertEqual(
  5631. Subscribe(200, 1000)
  5632. );
  5633. }
  5634. [Fact]
  5635. public void MaxOfT_Reference_ComparerThrows()
  5636. {
  5637. var ex = new Exception();
  5638. var scheduler = new TestScheduler();
  5639. var xs = scheduler.CreateHotObservable(
  5640. OnNext(150, "z"),
  5641. OnNext(210, "b"),
  5642. OnNext(220, "c"),
  5643. OnNext(230, "a"),
  5644. OnCompleted<string>(250)
  5645. );
  5646. var res = scheduler.Start(() =>
  5647. xs.Max(new ThrowingComparer<string>(ex))
  5648. );
  5649. res.Messages.AssertEqual(
  5650. OnError<string>(220, ex)
  5651. );
  5652. xs.Subscriptions.AssertEqual(
  5653. Subscribe(200, 220)
  5654. );
  5655. }
  5656. [Fact]
  5657. public void MaxOfT_Value_ComparerThrows()
  5658. {
  5659. var ex = new Exception();
  5660. var scheduler = new TestScheduler();
  5661. var xs = scheduler.CreateHotObservable(
  5662. OnNext(150, DateTime.Now),
  5663. OnNext(210, new DateTime(1993, 2, 11)),
  5664. OnNext(220, new DateTime(2003, 2, 11)),
  5665. OnNext(230, new DateTime(1983, 2, 11)),
  5666. OnCompleted<DateTime>(250)
  5667. );
  5668. var res = scheduler.Start(() =>
  5669. xs.Max(new ThrowingComparer<DateTime>(ex))
  5670. );
  5671. res.Messages.AssertEqual(
  5672. OnError<DateTime>(220, ex)
  5673. );
  5674. xs.Subscriptions.AssertEqual(
  5675. Subscribe(200, 220)
  5676. );
  5677. }
  5678. [Fact]
  5679. public void Max_Selector_Regular_Int32()
  5680. {
  5681. var scheduler = new TestScheduler();
  5682. var xs = scheduler.CreateHotObservable<string>(
  5683. OnNext(210, "fo"),
  5684. OnNext(220, "b"),
  5685. OnNext(230, "qux"),
  5686. OnCompleted<string>(240)
  5687. );
  5688. var res = scheduler.Start(() => xs.Max(x => (int)x.Length));
  5689. res.Messages.AssertEqual(
  5690. OnNext(240, 3),
  5691. OnCompleted<int>(240)
  5692. );
  5693. xs.Subscriptions.AssertEqual(
  5694. Subscribe(200, 240)
  5695. );
  5696. }
  5697. [Fact]
  5698. public void Max_Selector_Regular_Int64()
  5699. {
  5700. var scheduler = new TestScheduler();
  5701. var xs = scheduler.CreateHotObservable<string>(
  5702. OnNext(210, "fo"),
  5703. OnNext(220, "b"),
  5704. OnNext(230, "qux"),
  5705. OnCompleted<string>(240)
  5706. );
  5707. var res = scheduler.Start(() => xs.Max(x => (long)x.Length));
  5708. res.Messages.AssertEqual(
  5709. OnNext(240, 3L),
  5710. OnCompleted<long>(240)
  5711. );
  5712. xs.Subscriptions.AssertEqual(
  5713. Subscribe(200, 240)
  5714. );
  5715. }
  5716. [Fact]
  5717. public void Max_Selector_Regular_Single()
  5718. {
  5719. var scheduler = new TestScheduler();
  5720. var xs = scheduler.CreateHotObservable<string>(
  5721. OnNext(210, "fo"),
  5722. OnNext(220, "b"),
  5723. OnNext(230, "qux"),
  5724. OnCompleted<string>(240)
  5725. );
  5726. var res = scheduler.Start(() => xs.Max(x => (float)x.Length));
  5727. res.Messages.AssertEqual(
  5728. OnNext(240, 3.0f),
  5729. OnCompleted<float>(240)
  5730. );
  5731. xs.Subscriptions.AssertEqual(
  5732. Subscribe(200, 240)
  5733. );
  5734. }
  5735. [Fact]
  5736. public void Max_Selector_Regular_Double()
  5737. {
  5738. var scheduler = new TestScheduler();
  5739. var xs = scheduler.CreateHotObservable<string>(
  5740. OnNext(210, "fo"),
  5741. OnNext(220, "b"),
  5742. OnNext(230, "qux"),
  5743. OnCompleted<string>(240)
  5744. );
  5745. var res = scheduler.Start(() => xs.Max(x => (double)x.Length));
  5746. res.Messages.AssertEqual(
  5747. OnNext(240, 3.0),
  5748. OnCompleted<double>(240)
  5749. );
  5750. xs.Subscriptions.AssertEqual(
  5751. Subscribe(200, 240)
  5752. );
  5753. }
  5754. [Fact]
  5755. public void Max_Selector_Regular_Decimal()
  5756. {
  5757. var scheduler = new TestScheduler();
  5758. var xs = scheduler.CreateHotObservable<string>(
  5759. OnNext(210, "fo"),
  5760. OnNext(220, "b"),
  5761. OnNext(230, "qux"),
  5762. OnCompleted<string>(240)
  5763. );
  5764. var res = scheduler.Start(() => xs.Max(x => (decimal)x.Length));
  5765. res.Messages.AssertEqual(
  5766. OnNext(240, 3.0m),
  5767. OnCompleted<decimal>(240)
  5768. );
  5769. xs.Subscriptions.AssertEqual(
  5770. Subscribe(200, 240)
  5771. );
  5772. }
  5773. [Fact]
  5774. public void Max_Selector_Regular_Int32_Nullable()
  5775. {
  5776. var scheduler = new TestScheduler();
  5777. var xs = scheduler.CreateHotObservable<string>(
  5778. OnNext(210, "fo"),
  5779. OnNext(220, "b"),
  5780. OnNext(230, "qux"),
  5781. OnCompleted<string>(240)
  5782. );
  5783. var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(int?) : x.Length));
  5784. res.Messages.AssertEqual(
  5785. OnNext(240, (int?)3),
  5786. OnCompleted<int?>(240)
  5787. );
  5788. xs.Subscriptions.AssertEqual(
  5789. Subscribe(200, 240)
  5790. );
  5791. }
  5792. [Fact]
  5793. public void Max_Selector_Regular_Int64_Nullable()
  5794. {
  5795. var scheduler = new TestScheduler();
  5796. var xs = scheduler.CreateHotObservable<string>(
  5797. OnNext(210, "fo"),
  5798. OnNext(220, "b"),
  5799. OnNext(230, "qux"),
  5800. OnCompleted<string>(240)
  5801. );
  5802. var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(long?) : x.Length));
  5803. res.Messages.AssertEqual(
  5804. OnNext(240, (long?)3.0),
  5805. OnCompleted<long?>(240)
  5806. );
  5807. xs.Subscriptions.AssertEqual(
  5808. Subscribe(200, 240)
  5809. );
  5810. }
  5811. [Fact]
  5812. public void Max_Selector_Regular_Single_Nullable()
  5813. {
  5814. var scheduler = new TestScheduler();
  5815. var xs = scheduler.CreateHotObservable<string>(
  5816. OnNext(210, "fo"),
  5817. OnNext(220, "b"),
  5818. OnNext(230, "qux"),
  5819. OnCompleted<string>(240)
  5820. );
  5821. var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(float?) : x.Length));
  5822. res.Messages.AssertEqual(
  5823. OnNext(240, (float?)3.0),
  5824. OnCompleted<float?>(240)
  5825. );
  5826. xs.Subscriptions.AssertEqual(
  5827. Subscribe(200, 240)
  5828. );
  5829. }
  5830. [Fact]
  5831. public void Max_Selector_Regular_Double_Nullable()
  5832. {
  5833. var scheduler = new TestScheduler();
  5834. var xs = scheduler.CreateHotObservable<string>(
  5835. OnNext(210, "fo"),
  5836. OnNext(220, "b"),
  5837. OnNext(230, "qux"),
  5838. OnCompleted<string>(240)
  5839. );
  5840. var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(double?) : x.Length));
  5841. res.Messages.AssertEqual(
  5842. OnNext(240, (double?)3.0),
  5843. OnCompleted<double?>(240)
  5844. );
  5845. xs.Subscriptions.AssertEqual(
  5846. Subscribe(200, 240)
  5847. );
  5848. }
  5849. [Fact]
  5850. public void Max_Selector_Regular_Decimal_Nullable()
  5851. {
  5852. var scheduler = new TestScheduler();
  5853. var xs = scheduler.CreateHotObservable<string>(
  5854. OnNext(210, "fo"),
  5855. OnNext(220, "b"),
  5856. OnNext(230, "qux"),
  5857. OnCompleted<string>(240)
  5858. );
  5859. var res = scheduler.Start(() => xs.Max(x => x == "fo" ? default(decimal?) : x.Length));
  5860. res.Messages.AssertEqual(
  5861. OnNext(240, (decimal?)3.0),
  5862. OnCompleted<decimal?>(240)
  5863. );
  5864. xs.Subscriptions.AssertEqual(
  5865. Subscribe(200, 240)
  5866. );
  5867. }
  5868. [Fact]
  5869. public void MaxOfT_Selector_Regular()
  5870. {
  5871. var scheduler = new TestScheduler();
  5872. var xs = scheduler.CreateHotObservable<string>(
  5873. OnNext(210, "bar"),
  5874. OnNext(220, "qux"),
  5875. OnNext(230, "foo"),
  5876. OnCompleted<string>(240)
  5877. );
  5878. var res = scheduler.Start(() => xs.Max(x => new string(x.ToCharArray().Reverse().ToArray())));
  5879. res.Messages.AssertEqual(
  5880. OnNext(240, "xuq"),
  5881. OnCompleted<string>(240)
  5882. );
  5883. xs.Subscriptions.AssertEqual(
  5884. Subscribe(200, 240)
  5885. );
  5886. }
  5887. [Fact]
  5888. public void MaxOfT_Selector_Regular_Comparer()
  5889. {
  5890. var scheduler = new TestScheduler();
  5891. var xs = scheduler.CreateHotObservable<string>(
  5892. OnNext(210, "bar"),
  5893. OnNext(220, "qux"),
  5894. OnNext(230, "foo"),
  5895. OnCompleted<string>(240)
  5896. );
  5897. var res = scheduler.Start(() => xs.Max(x => new string(x.ToCharArray().Reverse().ToArray()), new ReverseComparer<string>(Comparer<string>.Default)));
  5898. res.Messages.AssertEqual(
  5899. OnNext(240, "oof"),
  5900. OnCompleted<string>(240)
  5901. );
  5902. xs.Subscriptions.AssertEqual(
  5903. Subscribe(200, 240)
  5904. );
  5905. }
  5906. #endregion
  5907. #region + MaxBy +
  5908. [Fact]
  5909. public void MaxBy_ArgumentChecking()
  5910. {
  5911. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(default(IObservable<int>), x => x));
  5912. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(DummyObservable<int>.Instance, default(Func<int, int>)));
  5913. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(default(IObservable<int>), x => x, Comparer<int>.Default));
  5914. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(DummyObservable<int>.Instance, default(Func<int, int>), Comparer<int>.Default));
  5915. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MaxBy(DummyObservable<int>.Instance, x => x, null));
  5916. }
  5917. [Fact]
  5918. public void MaxBy_Empty()
  5919. {
  5920. var scheduler = new TestScheduler();
  5921. var xs = scheduler.CreateHotObservable(
  5922. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  5923. OnCompleted<KeyValuePair<int, string>>(250)
  5924. );
  5925. var res = scheduler.Start(() =>
  5926. xs.MaxBy(x => x.Key)
  5927. );
  5928. res.Messages.AssertEqual(
  5929. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.Count == 0),
  5930. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  5931. );
  5932. xs.Subscriptions.AssertEqual(
  5933. Subscribe(200, 250)
  5934. );
  5935. }
  5936. [Fact]
  5937. public void MaxBy_Return()
  5938. {
  5939. var scheduler = new TestScheduler();
  5940. var xs = scheduler.CreateHotObservable(
  5941. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  5942. OnNext(210, new KeyValuePair<int, string>(2, "a")),
  5943. OnCompleted<KeyValuePair<int, string>>(250)
  5944. );
  5945. var res = scheduler.Start(() =>
  5946. xs.MaxBy(x => x.Key)
  5947. );
  5948. res.Messages.AssertEqual(
  5949. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  5950. new KeyValuePair<int, string>(2, "a"),
  5951. })),
  5952. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  5953. );
  5954. xs.Subscriptions.AssertEqual(
  5955. Subscribe(200, 250)
  5956. );
  5957. }
  5958. [Fact]
  5959. public void MaxBy_Some()
  5960. {
  5961. var scheduler = new TestScheduler();
  5962. var xs = scheduler.CreateHotObservable(
  5963. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  5964. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  5965. OnNext(220, new KeyValuePair<int, string>(4, "c")),
  5966. OnNext(230, new KeyValuePair<int, string>(2, "a")),
  5967. OnCompleted<KeyValuePair<int, string>>(250)
  5968. );
  5969. var res = scheduler.Start(() =>
  5970. xs.MaxBy(x => x.Key)
  5971. );
  5972. res.Messages.AssertEqual(
  5973. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  5974. new KeyValuePair<int, string>(4, "c"),
  5975. })),
  5976. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  5977. );
  5978. xs.Subscriptions.AssertEqual(
  5979. Subscribe(200, 250)
  5980. );
  5981. }
  5982. [Fact]
  5983. public void MaxBy_Multiple()
  5984. {
  5985. var scheduler = new TestScheduler();
  5986. var xs = scheduler.CreateHotObservable(
  5987. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  5988. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  5989. OnNext(215, new KeyValuePair<int, string>(2, "d")),
  5990. OnNext(220, new KeyValuePair<int, string>(3, "c")),
  5991. OnNext(225, new KeyValuePair<int, string>(2, "y")),
  5992. OnNext(230, new KeyValuePair<int, string>(4, "a")),
  5993. OnNext(235, new KeyValuePair<int, string>(4, "r")),
  5994. OnCompleted<KeyValuePair<int, string>>(250)
  5995. );
  5996. var res = scheduler.Start(() =>
  5997. xs.MaxBy(x => x.Key)
  5998. );
  5999. res.Messages.AssertEqual(
  6000. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  6001. new KeyValuePair<int, string>(4, "a"),
  6002. new KeyValuePair<int, string>(4, "r"),
  6003. })),
  6004. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  6005. );
  6006. xs.Subscriptions.AssertEqual(
  6007. Subscribe(200, 250)
  6008. );
  6009. }
  6010. [Fact]
  6011. public void MaxBy_Throw()
  6012. {
  6013. var ex = new Exception();
  6014. var scheduler = new TestScheduler();
  6015. var xs = scheduler.CreateHotObservable(
  6016. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  6017. OnError<KeyValuePair<int, string>>(210, ex)
  6018. );
  6019. var res = scheduler.Start(() =>
  6020. xs.MaxBy(x => x.Key)
  6021. );
  6022. res.Messages.AssertEqual(
  6023. OnError<IList<KeyValuePair<int, string>>>(210, ex)
  6024. );
  6025. xs.Subscriptions.AssertEqual(
  6026. Subscribe(200, 210)
  6027. );
  6028. }
  6029. [Fact]
  6030. public void MaxBy_Never()
  6031. {
  6032. var ex = new Exception();
  6033. var scheduler = new TestScheduler();
  6034. var xs = scheduler.CreateHotObservable(
  6035. OnNext(150, new KeyValuePair<int, string>(1, "z"))
  6036. );
  6037. var res = scheduler.Start(() =>
  6038. xs.MaxBy(x => x.Key)
  6039. );
  6040. res.Messages.AssertEqual(
  6041. );
  6042. xs.Subscriptions.AssertEqual(
  6043. Subscribe(200, 1000)
  6044. );
  6045. }
  6046. [Fact]
  6047. public void MaxBy_Comparer_Empty()
  6048. {
  6049. var scheduler = new TestScheduler();
  6050. var xs = scheduler.CreateHotObservable(
  6051. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  6052. OnCompleted<KeyValuePair<int, string>>(250)
  6053. );
  6054. var res = scheduler.Start(() =>
  6055. xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  6056. );
  6057. res.Messages.AssertEqual(
  6058. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.Count == 0),
  6059. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  6060. );
  6061. xs.Subscriptions.AssertEqual(
  6062. Subscribe(200, 250)
  6063. );
  6064. }
  6065. [Fact]
  6066. public void MaxBy_Comparer_Return()
  6067. {
  6068. var scheduler = new TestScheduler();
  6069. var xs = scheduler.CreateHotObservable(
  6070. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  6071. OnNext(210, new KeyValuePair<int, string>(2, "a")),
  6072. OnCompleted<KeyValuePair<int, string>>(250)
  6073. );
  6074. var res = scheduler.Start(() =>
  6075. xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  6076. );
  6077. res.Messages.AssertEqual(
  6078. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  6079. new KeyValuePair<int, string>(2, "a"),
  6080. })),
  6081. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  6082. );
  6083. xs.Subscriptions.AssertEqual(
  6084. Subscribe(200, 250)
  6085. );
  6086. }
  6087. [Fact]
  6088. public void MaxBy_Comparer_Some()
  6089. {
  6090. var scheduler = new TestScheduler();
  6091. var xs = scheduler.CreateHotObservable(
  6092. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  6093. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  6094. OnNext(220, new KeyValuePair<int, string>(4, "c")),
  6095. OnNext(230, new KeyValuePair<int, string>(2, "a")),
  6096. OnCompleted<KeyValuePair<int, string>>(250)
  6097. );
  6098. var res = scheduler.Start(() =>
  6099. xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  6100. );
  6101. res.Messages.AssertEqual(
  6102. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  6103. new KeyValuePair<int, string>(2, "a"),
  6104. })),
  6105. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  6106. );
  6107. xs.Subscriptions.AssertEqual(
  6108. Subscribe(200, 250)
  6109. );
  6110. }
  6111. [Fact]
  6112. public void MaxBy_Comparer_Throw()
  6113. {
  6114. var ex = new Exception();
  6115. var scheduler = new TestScheduler();
  6116. var xs = scheduler.CreateHotObservable(
  6117. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  6118. OnError<KeyValuePair<int, string>>(210, ex)
  6119. );
  6120. var res = scheduler.Start(() =>
  6121. xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  6122. );
  6123. res.Messages.AssertEqual(
  6124. OnError<IList<KeyValuePair<int, string>>>(210, ex)
  6125. );
  6126. xs.Subscriptions.AssertEqual(
  6127. Subscribe(200, 210)
  6128. );
  6129. }
  6130. [Fact]
  6131. public void MaxBy_Comparer_Never()
  6132. {
  6133. var ex = new Exception();
  6134. var scheduler = new TestScheduler();
  6135. var xs = scheduler.CreateHotObservable(
  6136. OnNext(150, new KeyValuePair<int, string>(1, "z"))
  6137. );
  6138. var res = scheduler.Start(() =>
  6139. xs.MaxBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  6140. );
  6141. res.Messages.AssertEqual(
  6142. );
  6143. xs.Subscriptions.AssertEqual(
  6144. Subscribe(200, 1000)
  6145. );
  6146. }
  6147. [Fact]
  6148. public void MaxBy_SelectorThrows()
  6149. {
  6150. var ex = new Exception();
  6151. var scheduler = new TestScheduler();
  6152. var xs = scheduler.CreateHotObservable(
  6153. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  6154. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  6155. OnNext(220, new KeyValuePair<int, string>(2, "c")),
  6156. OnNext(230, new KeyValuePair<int, string>(4, "a")),
  6157. OnCompleted<KeyValuePair<int, string>>(250)
  6158. );
  6159. var res = scheduler.Start(() =>
  6160. xs.MaxBy<KeyValuePair<int, string>, int>(x => { throw ex; })
  6161. );
  6162. res.Messages.AssertEqual(
  6163. OnError<IList<KeyValuePair<int, string>>>(210, ex)
  6164. );
  6165. xs.Subscriptions.AssertEqual(
  6166. Subscribe(200, 210)
  6167. );
  6168. }
  6169. [Fact]
  6170. public void MaxBy_ComparerThrows()
  6171. {
  6172. var ex = new Exception();
  6173. var scheduler = new TestScheduler();
  6174. var xs = scheduler.CreateHotObservable(
  6175. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  6176. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  6177. OnNext(220, new KeyValuePair<int, string>(2, "c")),
  6178. OnNext(230, new KeyValuePair<int, string>(4, "a")),
  6179. OnCompleted<KeyValuePair<int, string>>(250)
  6180. );
  6181. var res = scheduler.Start(() =>
  6182. xs.MaxBy(x => x.Key, new ThrowingComparer<int>(ex))
  6183. );
  6184. res.Messages.AssertEqual(
  6185. OnError<IList<KeyValuePair<int, string>>>(220, ex)
  6186. );
  6187. xs.Subscriptions.AssertEqual(
  6188. Subscribe(200, 220)
  6189. );
  6190. }
  6191. #endregion
  6192. #region + Min +
  6193. [Fact]
  6194. public void Min_ArgumentChecking()
  6195. {
  6196. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<int>)));
  6197. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<double>)));
  6198. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<float>)));
  6199. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<decimal>)));
  6200. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<long>)));
  6201. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<int?>)));
  6202. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<double?>)));
  6203. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<float?>)));
  6204. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<decimal?>)));
  6205. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<long?>)));
  6206. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(int)));
  6207. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(double)));
  6208. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(float)));
  6209. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(decimal)));
  6210. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(long)));
  6211. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(int?)));
  6212. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(double?)));
  6213. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(float?)));
  6214. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(decimal?)));
  6215. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => default(long?)));
  6216. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, int>)));
  6217. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, double>)));
  6218. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, float>)));
  6219. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, decimal>)));
  6220. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, long>)));
  6221. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, int?>)));
  6222. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, double?>)));
  6223. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, float?>)));
  6224. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, decimal?>)));
  6225. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, long?>)));
  6226. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>)));
  6227. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), Comparer<DateTime>.Default));
  6228. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(IComparer<DateTime>)));
  6229. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => ""));
  6230. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, string>)));
  6231. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(default(IObservable<DateTime>), _ => "", Comparer<string>.Default));
  6232. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), default(Func<DateTime, string>), Comparer<string>.Default));
  6233. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Min(Observable.Empty<DateTime>(), _ => "", default(IComparer<string>)));
  6234. }
  6235. [Fact]
  6236. public void Min_Int32_Empty()
  6237. {
  6238. var scheduler = new TestScheduler();
  6239. var xs = scheduler.CreateHotObservable(
  6240. OnNext(150, 1),
  6241. OnCompleted<int>(250)
  6242. );
  6243. var res = scheduler.Start(() =>
  6244. xs.Min()
  6245. );
  6246. res.Messages.AssertEqual(
  6247. OnError<int>(250, e => e is InvalidOperationException)
  6248. );
  6249. xs.Subscriptions.AssertEqual(
  6250. Subscribe(200, 250)
  6251. );
  6252. }
  6253. [Fact]
  6254. public void Min_Int32_Return()
  6255. {
  6256. var scheduler = new TestScheduler();
  6257. var xs = scheduler.CreateHotObservable(
  6258. OnNext(150, 1),
  6259. OnNext(210, 2),
  6260. OnCompleted<int>(250)
  6261. );
  6262. var res = scheduler.Start(() =>
  6263. xs.Min()
  6264. );
  6265. res.Messages.AssertEqual(
  6266. OnNext(250, 2),
  6267. OnCompleted<int>(250)
  6268. );
  6269. xs.Subscriptions.AssertEqual(
  6270. Subscribe(200, 250)
  6271. );
  6272. }
  6273. [Fact]
  6274. public void Min_Int32_Some()
  6275. {
  6276. var scheduler = new TestScheduler();
  6277. var xs = scheduler.CreateHotObservable(
  6278. OnNext(150, 1),
  6279. OnNext(210, 3),
  6280. OnNext(220, 2),
  6281. OnNext(230, 4),
  6282. OnCompleted<int>(250)
  6283. );
  6284. var res = scheduler.Start(() =>
  6285. xs.Min()
  6286. );
  6287. res.Messages.AssertEqual(
  6288. OnNext(250, 2),
  6289. OnCompleted<int>(250)
  6290. );
  6291. xs.Subscriptions.AssertEqual(
  6292. Subscribe(200, 250)
  6293. );
  6294. }
  6295. [Fact]
  6296. public void Min_Int32_Throw()
  6297. {
  6298. var ex = new Exception();
  6299. var scheduler = new TestScheduler();
  6300. var xs = scheduler.CreateHotObservable(
  6301. OnNext(150, 1),
  6302. OnError<int>(210, ex)
  6303. );
  6304. var res = scheduler.Start(() =>
  6305. xs.Min()
  6306. );
  6307. res.Messages.AssertEqual(
  6308. OnError<int>(210, ex)
  6309. );
  6310. xs.Subscriptions.AssertEqual(
  6311. Subscribe(200, 210)
  6312. );
  6313. }
  6314. [Fact]
  6315. public void Min_Int32_Never()
  6316. {
  6317. var ex = new Exception();
  6318. var scheduler = new TestScheduler();
  6319. var xs = scheduler.CreateHotObservable(
  6320. OnNext(150, 1)
  6321. );
  6322. var res = scheduler.Start(() =>
  6323. xs.Min()
  6324. );
  6325. res.Messages.AssertEqual(
  6326. );
  6327. xs.Subscriptions.AssertEqual(
  6328. Subscribe(200, 1000)
  6329. );
  6330. }
  6331. [Fact]
  6332. public void Min_Int64_Empty()
  6333. {
  6334. var scheduler = new TestScheduler();
  6335. var xs = scheduler.CreateHotObservable(
  6336. OnNext(150, 1L),
  6337. OnCompleted<long>(250)
  6338. );
  6339. var res = scheduler.Start(() =>
  6340. xs.Min()
  6341. );
  6342. res.Messages.AssertEqual(
  6343. OnError<long>(250, e => e is InvalidOperationException)
  6344. );
  6345. xs.Subscriptions.AssertEqual(
  6346. Subscribe(200, 250)
  6347. );
  6348. }
  6349. [Fact]
  6350. public void Min_Int64_Return()
  6351. {
  6352. var scheduler = new TestScheduler();
  6353. var xs = scheduler.CreateHotObservable(
  6354. OnNext(150, 1L),
  6355. OnNext(210, 2L),
  6356. OnCompleted<long>(250)
  6357. );
  6358. var res = scheduler.Start(() =>
  6359. xs.Min()
  6360. );
  6361. res.Messages.AssertEqual(
  6362. OnNext(250, 2L),
  6363. OnCompleted<long>(250)
  6364. );
  6365. xs.Subscriptions.AssertEqual(
  6366. Subscribe(200, 250)
  6367. );
  6368. }
  6369. [Fact]
  6370. public void Min_Int64_Some()
  6371. {
  6372. var scheduler = new TestScheduler();
  6373. var xs = scheduler.CreateHotObservable(
  6374. OnNext(150, 1L),
  6375. OnNext(210, 3L),
  6376. OnNext(220, 2L),
  6377. OnNext(230, 4L),
  6378. OnCompleted<long>(250)
  6379. );
  6380. var res = scheduler.Start(() =>
  6381. xs.Min()
  6382. );
  6383. res.Messages.AssertEqual(
  6384. OnNext(250, 2L),
  6385. OnCompleted<long>(250)
  6386. );
  6387. xs.Subscriptions.AssertEqual(
  6388. Subscribe(200, 250)
  6389. );
  6390. }
  6391. [Fact]
  6392. public void Min_Int64_Throw()
  6393. {
  6394. var ex = new Exception();
  6395. var scheduler = new TestScheduler();
  6396. var xs = scheduler.CreateHotObservable(
  6397. OnNext(150, 1L),
  6398. OnError<long>(210, ex)
  6399. );
  6400. var res = scheduler.Start(() =>
  6401. xs.Min()
  6402. );
  6403. res.Messages.AssertEqual(
  6404. OnError<long>(210, ex)
  6405. );
  6406. xs.Subscriptions.AssertEqual(
  6407. Subscribe(200, 210)
  6408. );
  6409. }
  6410. [Fact]
  6411. public void Min_Int64_Never()
  6412. {
  6413. var ex = new Exception();
  6414. var scheduler = new TestScheduler();
  6415. var xs = scheduler.CreateHotObservable(
  6416. OnNext(150, 1L)
  6417. );
  6418. var res = scheduler.Start(() =>
  6419. xs.Min()
  6420. );
  6421. res.Messages.AssertEqual(
  6422. );
  6423. xs.Subscriptions.AssertEqual(
  6424. Subscribe(200, 1000)
  6425. );
  6426. }
  6427. [Fact]
  6428. public void Min_Float_Empty()
  6429. {
  6430. var scheduler = new TestScheduler();
  6431. var xs = scheduler.CreateHotObservable(
  6432. OnNext(150, 1f),
  6433. OnCompleted<float>(250)
  6434. );
  6435. var res = scheduler.Start(() =>
  6436. xs.Min()
  6437. );
  6438. res.Messages.AssertEqual(
  6439. OnError<float>(250, e => e is InvalidOperationException)
  6440. );
  6441. xs.Subscriptions.AssertEqual(
  6442. Subscribe(200, 250)
  6443. );
  6444. }
  6445. [Fact]
  6446. public void Min_Float_Return()
  6447. {
  6448. var scheduler = new TestScheduler();
  6449. var xs = scheduler.CreateHotObservable(
  6450. OnNext(150, 1f),
  6451. OnNext(210, 2f),
  6452. OnCompleted<float>(250)
  6453. );
  6454. var res = scheduler.Start(() =>
  6455. xs.Min()
  6456. );
  6457. res.Messages.AssertEqual(
  6458. OnNext(250, 2f),
  6459. OnCompleted<float>(250)
  6460. );
  6461. xs.Subscriptions.AssertEqual(
  6462. Subscribe(200, 250)
  6463. );
  6464. }
  6465. [Fact]
  6466. public void Min_Float_Some()
  6467. {
  6468. var scheduler = new TestScheduler();
  6469. var xs = scheduler.CreateHotObservable(
  6470. OnNext(150, 1f),
  6471. OnNext(210, 3f),
  6472. OnNext(220, 2f),
  6473. OnNext(230, 4f),
  6474. OnCompleted<float>(250)
  6475. );
  6476. var res = scheduler.Start(() =>
  6477. xs.Min()
  6478. );
  6479. res.Messages.AssertEqual(
  6480. OnNext(250, 2f),
  6481. OnCompleted<float>(250)
  6482. );
  6483. xs.Subscriptions.AssertEqual(
  6484. Subscribe(200, 250)
  6485. );
  6486. }
  6487. [Fact]
  6488. public void Min_Float_Throw()
  6489. {
  6490. var ex = new Exception();
  6491. var scheduler = new TestScheduler();
  6492. var xs = scheduler.CreateHotObservable(
  6493. OnNext(150, 1f),
  6494. OnError<float>(210, ex)
  6495. );
  6496. var res = scheduler.Start(() =>
  6497. xs.Min()
  6498. );
  6499. res.Messages.AssertEqual(
  6500. OnError<float>(210, ex)
  6501. );
  6502. xs.Subscriptions.AssertEqual(
  6503. Subscribe(200, 210)
  6504. );
  6505. }
  6506. [Fact]
  6507. public void Min_Float_Never()
  6508. {
  6509. var ex = new Exception();
  6510. var scheduler = new TestScheduler();
  6511. var xs = scheduler.CreateHotObservable(
  6512. OnNext(150, 1f)
  6513. );
  6514. var res = scheduler.Start(() =>
  6515. xs.Min()
  6516. );
  6517. res.Messages.AssertEqual(
  6518. );
  6519. xs.Subscriptions.AssertEqual(
  6520. Subscribe(200, 1000)
  6521. );
  6522. }
  6523. [Fact]
  6524. public void Min_Double_Empty()
  6525. {
  6526. var scheduler = new TestScheduler();
  6527. var xs = scheduler.CreateHotObservable(
  6528. OnNext(150, 1.0),
  6529. OnCompleted<double>(250)
  6530. );
  6531. var res = scheduler.Start(() =>
  6532. xs.Min()
  6533. );
  6534. res.Messages.AssertEqual(
  6535. OnError<double>(250, e => e is InvalidOperationException)
  6536. );
  6537. xs.Subscriptions.AssertEqual(
  6538. Subscribe(200, 250)
  6539. );
  6540. }
  6541. [Fact]
  6542. public void Min_Double_Return()
  6543. {
  6544. var scheduler = new TestScheduler();
  6545. var xs = scheduler.CreateHotObservable(
  6546. OnNext(150, 1.0),
  6547. OnNext(210, 2.0),
  6548. OnCompleted<double>(250)
  6549. );
  6550. var res = scheduler.Start(() =>
  6551. xs.Min()
  6552. );
  6553. res.Messages.AssertEqual(
  6554. OnNext(250, 2.0),
  6555. OnCompleted<double>(250)
  6556. );
  6557. xs.Subscriptions.AssertEqual(
  6558. Subscribe(200, 250)
  6559. );
  6560. }
  6561. [Fact]
  6562. public void Min_Double_Some()
  6563. {
  6564. var scheduler = new TestScheduler();
  6565. var xs = scheduler.CreateHotObservable(
  6566. OnNext(150, 1.0),
  6567. OnNext(210, 3.0),
  6568. OnNext(220, 2.0),
  6569. OnNext(230, 4.0),
  6570. OnCompleted<double>(250)
  6571. );
  6572. var res = scheduler.Start(() =>
  6573. xs.Min()
  6574. );
  6575. res.Messages.AssertEqual(
  6576. OnNext(250, 2.0),
  6577. OnCompleted<double>(250)
  6578. );
  6579. xs.Subscriptions.AssertEqual(
  6580. Subscribe(200, 250)
  6581. );
  6582. }
  6583. [Fact]
  6584. public void Min_Double_Throw()
  6585. {
  6586. var ex = new Exception();
  6587. var scheduler = new TestScheduler();
  6588. var xs = scheduler.CreateHotObservable(
  6589. OnNext(150, 1.0),
  6590. OnError<double>(210, ex)
  6591. );
  6592. var res = scheduler.Start(() =>
  6593. xs.Min()
  6594. );
  6595. res.Messages.AssertEqual(
  6596. OnError<double>(210, ex)
  6597. );
  6598. xs.Subscriptions.AssertEqual(
  6599. Subscribe(200, 210)
  6600. );
  6601. }
  6602. [Fact]
  6603. public void Min_Double_Never()
  6604. {
  6605. var ex = new Exception();
  6606. var scheduler = new TestScheduler();
  6607. var xs = scheduler.CreateHotObservable(
  6608. OnNext(150, 1.0)
  6609. );
  6610. var res = scheduler.Start(() =>
  6611. xs.Min()
  6612. );
  6613. res.Messages.AssertEqual(
  6614. );
  6615. xs.Subscriptions.AssertEqual(
  6616. Subscribe(200, 1000)
  6617. );
  6618. }
  6619. [Fact]
  6620. public void Min_Decimal_Empty()
  6621. {
  6622. var scheduler = new TestScheduler();
  6623. var xs = scheduler.CreateHotObservable(
  6624. OnNext(150, 1m),
  6625. OnCompleted<decimal>(250)
  6626. );
  6627. var res = scheduler.Start(() =>
  6628. xs.Min()
  6629. );
  6630. res.Messages.AssertEqual(
  6631. OnError<decimal>(250, e => e is InvalidOperationException)
  6632. );
  6633. xs.Subscriptions.AssertEqual(
  6634. Subscribe(200, 250)
  6635. );
  6636. }
  6637. [Fact]
  6638. public void Min_Decimal_Return()
  6639. {
  6640. var scheduler = new TestScheduler();
  6641. var xs = scheduler.CreateHotObservable(
  6642. OnNext(150, 1m),
  6643. OnNext(210, 2m),
  6644. OnCompleted<decimal>(250)
  6645. );
  6646. var res = scheduler.Start(() =>
  6647. xs.Min()
  6648. );
  6649. res.Messages.AssertEqual(
  6650. OnNext(250, 2m),
  6651. OnCompleted<decimal>(250)
  6652. );
  6653. xs.Subscriptions.AssertEqual(
  6654. Subscribe(200, 250)
  6655. );
  6656. }
  6657. [Fact]
  6658. public void Min_Decimal_Some()
  6659. {
  6660. var scheduler = new TestScheduler();
  6661. var xs = scheduler.CreateHotObservable(
  6662. OnNext(150, 1m),
  6663. OnNext(210, 3m),
  6664. OnNext(220, 2m),
  6665. OnNext(230, 4m),
  6666. OnCompleted<decimal>(250)
  6667. );
  6668. var res = scheduler.Start(() =>
  6669. xs.Min()
  6670. );
  6671. res.Messages.AssertEqual(
  6672. OnNext(250, 2m),
  6673. OnCompleted<decimal>(250)
  6674. );
  6675. xs.Subscriptions.AssertEqual(
  6676. Subscribe(200, 250)
  6677. );
  6678. }
  6679. [Fact]
  6680. public void Min_Decimal_Throw()
  6681. {
  6682. var ex = new Exception();
  6683. var scheduler = new TestScheduler();
  6684. var xs = scheduler.CreateHotObservable(
  6685. OnNext(150, 1m),
  6686. OnError<decimal>(210, ex)
  6687. );
  6688. var res = scheduler.Start(() =>
  6689. xs.Min()
  6690. );
  6691. res.Messages.AssertEqual(
  6692. OnError<decimal>(210, ex)
  6693. );
  6694. xs.Subscriptions.AssertEqual(
  6695. Subscribe(200, 210)
  6696. );
  6697. }
  6698. [Fact]
  6699. public void Min_Decimal_Never()
  6700. {
  6701. var ex = new Exception();
  6702. var scheduler = new TestScheduler();
  6703. var xs = scheduler.CreateHotObservable(
  6704. OnNext(150, 1m)
  6705. );
  6706. var res = scheduler.Start(() =>
  6707. xs.Min()
  6708. );
  6709. res.Messages.AssertEqual(
  6710. );
  6711. xs.Subscriptions.AssertEqual(
  6712. Subscribe(200, 1000)
  6713. );
  6714. }
  6715. [Fact]
  6716. public void Min_Nullable_Int32_Empty()
  6717. {
  6718. var scheduler = new TestScheduler();
  6719. var xs = scheduler.CreateHotObservable(
  6720. OnNext(150, (int?)1),
  6721. OnCompleted<int?>(250)
  6722. );
  6723. var res = scheduler.Start(() =>
  6724. xs.Min()
  6725. );
  6726. res.Messages.AssertEqual(
  6727. OnNext(250, default(int?)),
  6728. OnCompleted<int?>(250)
  6729. );
  6730. xs.Subscriptions.AssertEqual(
  6731. Subscribe(200, 250)
  6732. );
  6733. }
  6734. [Fact]
  6735. public void Min_Nullable_Int32_Return()
  6736. {
  6737. var scheduler = new TestScheduler();
  6738. var xs = scheduler.CreateHotObservable(
  6739. OnNext(150, (int?)1),
  6740. OnNext(210, (int?)2),
  6741. OnCompleted<int?>(250)
  6742. );
  6743. var res = scheduler.Start(() =>
  6744. xs.Min()
  6745. );
  6746. res.Messages.AssertEqual(
  6747. OnNext(250, (int?)2),
  6748. OnCompleted<int?>(250)
  6749. );
  6750. xs.Subscriptions.AssertEqual(
  6751. Subscribe(200, 250)
  6752. );
  6753. }
  6754. [Fact]
  6755. public void Min_Nullable_Int32_Some1()
  6756. {
  6757. var scheduler = new TestScheduler();
  6758. var xs = scheduler.CreateHotObservable(
  6759. OnNext(150, (int?)1),
  6760. OnNext(210, (int?)null),
  6761. OnNext(220, (int?)2),
  6762. OnNext(230, (int?)4),
  6763. OnCompleted<int?>(250)
  6764. );
  6765. var res = scheduler.Start(() =>
  6766. xs.Min()
  6767. );
  6768. res.Messages.AssertEqual(
  6769. OnNext(250, (int?)2),
  6770. OnCompleted<int?>(250)
  6771. );
  6772. xs.Subscriptions.AssertEqual(
  6773. Subscribe(200, 250)
  6774. );
  6775. }
  6776. [Fact]
  6777. public void Min_Nullable_Int32_Some2()
  6778. {
  6779. var scheduler = new TestScheduler();
  6780. var xs = scheduler.CreateHotObservable(
  6781. OnNext(150, (int?)1),
  6782. OnNext(210, (int?)null),
  6783. OnNext(220, (int?)4),
  6784. OnNext(230, (int?)2),
  6785. OnCompleted<int?>(250)
  6786. );
  6787. var res = scheduler.Start(() =>
  6788. xs.Min()
  6789. );
  6790. res.Messages.AssertEqual(
  6791. OnNext(250, (int?)2),
  6792. OnCompleted<int?>(250)
  6793. );
  6794. xs.Subscriptions.AssertEqual(
  6795. Subscribe(200, 250)
  6796. );
  6797. }
  6798. [Fact]
  6799. public void Min_Nullable_GeneralNullableMinTest_LhsNull()
  6800. {
  6801. var scheduler = new TestScheduler();
  6802. var xs = scheduler.CreateHotObservable(
  6803. OnNext(150, (int?)1),
  6804. OnNext(210, (int?)null),
  6805. OnNext(220, (int?)2),
  6806. OnCompleted<int?>(250)
  6807. );
  6808. var res = scheduler.Start(() =>
  6809. xs.Min()
  6810. );
  6811. res.Messages.AssertEqual(
  6812. OnNext(250, (int?)2),
  6813. OnCompleted<int?>(250)
  6814. );
  6815. xs.Subscriptions.AssertEqual(
  6816. Subscribe(200, 250)
  6817. );
  6818. }
  6819. [Fact]
  6820. public void Min_Nullable_GeneralNullableMinTest_RhsNull()
  6821. {
  6822. var scheduler = new TestScheduler();
  6823. var xs = scheduler.CreateHotObservable(
  6824. OnNext(150, (int?)1),
  6825. OnNext(210, (int?)2),
  6826. OnNext(220, (int?)null),
  6827. OnCompleted<int?>(250)
  6828. );
  6829. var res = scheduler.Start(() =>
  6830. xs.Min()
  6831. );
  6832. res.Messages.AssertEqual(
  6833. OnNext(250, (int?)2),
  6834. OnCompleted<int?>(250)
  6835. );
  6836. xs.Subscriptions.AssertEqual(
  6837. Subscribe(200, 250)
  6838. );
  6839. }
  6840. [Fact]
  6841. public void Min_Nullable_GeneralNullableMinTest_Less()
  6842. {
  6843. var scheduler = new TestScheduler();
  6844. var xs = scheduler.CreateHotObservable(
  6845. OnNext(150, (int?)1),
  6846. OnNext(210, (int?)2),
  6847. OnNext(220, (int?)3),
  6848. OnCompleted<int?>(250)
  6849. );
  6850. var res = scheduler.Start(() =>
  6851. xs.Min()
  6852. );
  6853. res.Messages.AssertEqual(
  6854. OnNext(250, (int?)2),
  6855. OnCompleted<int?>(250)
  6856. );
  6857. xs.Subscriptions.AssertEqual(
  6858. Subscribe(200, 250)
  6859. );
  6860. }
  6861. [Fact]
  6862. public void Min_Nullable_GeneralNullableMinTest_Greater()
  6863. {
  6864. var scheduler = new TestScheduler();
  6865. var xs = scheduler.CreateHotObservable(
  6866. OnNext(150, (int?)1),
  6867. OnNext(210, (int?)3),
  6868. OnNext(220, (int?)2),
  6869. OnCompleted<int?>(250)
  6870. );
  6871. var res = scheduler.Start(() =>
  6872. xs.Min()
  6873. );
  6874. res.Messages.AssertEqual(
  6875. OnNext(250, (int?)2),
  6876. OnCompleted<int?>(250)
  6877. );
  6878. xs.Subscriptions.AssertEqual(
  6879. Subscribe(200, 250)
  6880. );
  6881. }
  6882. [Fact]
  6883. public void Min_Nullable_Int32_Throw()
  6884. {
  6885. var ex = new Exception();
  6886. var scheduler = new TestScheduler();
  6887. var xs = scheduler.CreateHotObservable(
  6888. OnNext(150, (int?)1),
  6889. OnError<int?>(210, ex)
  6890. );
  6891. var res = scheduler.Start(() =>
  6892. xs.Min()
  6893. );
  6894. res.Messages.AssertEqual(
  6895. OnError<int?>(210, ex)
  6896. );
  6897. xs.Subscriptions.AssertEqual(
  6898. Subscribe(200, 210)
  6899. );
  6900. }
  6901. [Fact]
  6902. public void Min_Nullable_Int32_Never()
  6903. {
  6904. var ex = new Exception();
  6905. var scheduler = new TestScheduler();
  6906. var xs = scheduler.CreateHotObservable(
  6907. OnNext(150, (int?)1)
  6908. );
  6909. var res = scheduler.Start(() =>
  6910. xs.Min()
  6911. );
  6912. res.Messages.AssertEqual(
  6913. );
  6914. xs.Subscriptions.AssertEqual(
  6915. Subscribe(200, 1000)
  6916. );
  6917. }
  6918. [Fact]
  6919. public void Min_Nullable_Int64_Empty()
  6920. {
  6921. var scheduler = new TestScheduler();
  6922. var xs = scheduler.CreateHotObservable(
  6923. OnNext(150, (long?)1L),
  6924. OnCompleted<long?>(250)
  6925. );
  6926. var res = scheduler.Start(() =>
  6927. xs.Min()
  6928. );
  6929. res.Messages.AssertEqual(
  6930. OnNext(250, default(long?)),
  6931. OnCompleted<long?>(250)
  6932. );
  6933. xs.Subscriptions.AssertEqual(
  6934. Subscribe(200, 250)
  6935. );
  6936. }
  6937. [Fact]
  6938. public void Min_Nullable_Int64_Return()
  6939. {
  6940. var scheduler = new TestScheduler();
  6941. var xs = scheduler.CreateHotObservable(
  6942. OnNext(150, (long?)1L),
  6943. OnNext(210, (long?)2L),
  6944. OnCompleted<long?>(250)
  6945. );
  6946. var res = scheduler.Start(() =>
  6947. xs.Min()
  6948. );
  6949. res.Messages.AssertEqual(
  6950. OnNext(250, (long?)2L),
  6951. OnCompleted<long?>(250)
  6952. );
  6953. xs.Subscriptions.AssertEqual(
  6954. Subscribe(200, 250)
  6955. );
  6956. }
  6957. [Fact]
  6958. public void Min_Nullable_Int64_Some1()
  6959. {
  6960. var scheduler = new TestScheduler();
  6961. var xs = scheduler.CreateHotObservable(
  6962. OnNext(150, (long?)1L),
  6963. OnNext(210, (long?)null),
  6964. OnNext(220, (long?)2L),
  6965. OnNext(230, (long?)4L),
  6966. OnCompleted<long?>(250)
  6967. );
  6968. var res = scheduler.Start(() =>
  6969. xs.Min()
  6970. );
  6971. res.Messages.AssertEqual(
  6972. OnNext(250, (long?)2L),
  6973. OnCompleted<long?>(250)
  6974. );
  6975. xs.Subscriptions.AssertEqual(
  6976. Subscribe(200, 250)
  6977. );
  6978. }
  6979. [Fact]
  6980. public void Min_Nullable_Int64_Some2()
  6981. {
  6982. var scheduler = new TestScheduler();
  6983. var xs = scheduler.CreateHotObservable(
  6984. OnNext(150, (long?)1L),
  6985. OnNext(210, (long?)null),
  6986. OnNext(220, (long?)4L),
  6987. OnNext(230, (long?)2L),
  6988. OnCompleted<long?>(250)
  6989. );
  6990. var res = scheduler.Start(() =>
  6991. xs.Min()
  6992. );
  6993. res.Messages.AssertEqual(
  6994. OnNext(250, (long?)2L),
  6995. OnCompleted<long?>(250)
  6996. );
  6997. xs.Subscriptions.AssertEqual(
  6998. Subscribe(200, 250)
  6999. );
  7000. }
  7001. [Fact]
  7002. public void Min_Nullable_Int64_Throw()
  7003. {
  7004. var ex = new Exception();
  7005. var scheduler = new TestScheduler();
  7006. var xs = scheduler.CreateHotObservable(
  7007. OnNext(150, (long?)1L),
  7008. OnError<long?>(210, ex)
  7009. );
  7010. var res = scheduler.Start(() =>
  7011. xs.Min()
  7012. );
  7013. res.Messages.AssertEqual(
  7014. OnError<long?>(210, ex)
  7015. );
  7016. xs.Subscriptions.AssertEqual(
  7017. Subscribe(200, 210)
  7018. );
  7019. }
  7020. [Fact]
  7021. public void Min_Nullable_Int64_Never()
  7022. {
  7023. var ex = new Exception();
  7024. var scheduler = new TestScheduler();
  7025. var xs = scheduler.CreateHotObservable(
  7026. OnNext(150, (long?)1L)
  7027. );
  7028. var res = scheduler.Start(() =>
  7029. xs.Min()
  7030. );
  7031. res.Messages.AssertEqual(
  7032. );
  7033. xs.Subscriptions.AssertEqual(
  7034. Subscribe(200, 1000)
  7035. );
  7036. }
  7037. [Fact]
  7038. public void Min_Nullable_Float_Empty()
  7039. {
  7040. var scheduler = new TestScheduler();
  7041. var xs = scheduler.CreateHotObservable(
  7042. OnNext(150, (float?)1f),
  7043. OnCompleted<float?>(250)
  7044. );
  7045. var res = scheduler.Start(() =>
  7046. xs.Min()
  7047. );
  7048. res.Messages.AssertEqual(
  7049. OnNext(250, default(float?)),
  7050. OnCompleted<float?>(250)
  7051. );
  7052. xs.Subscriptions.AssertEqual(
  7053. Subscribe(200, 250)
  7054. );
  7055. }
  7056. [Fact]
  7057. public void Min_Nullable_Float_Return()
  7058. {
  7059. var scheduler = new TestScheduler();
  7060. var xs = scheduler.CreateHotObservable(
  7061. OnNext(150, (float?)1f),
  7062. OnNext(210, (float?)2f),
  7063. OnCompleted<float?>(250)
  7064. );
  7065. var res = scheduler.Start(() =>
  7066. xs.Min()
  7067. );
  7068. res.Messages.AssertEqual(
  7069. OnNext(250, (float?)2f),
  7070. OnCompleted<float?>(250)
  7071. );
  7072. xs.Subscriptions.AssertEqual(
  7073. Subscribe(200, 250)
  7074. );
  7075. }
  7076. [Fact]
  7077. public void Min_Nullable_Float_Some1()
  7078. {
  7079. var scheduler = new TestScheduler();
  7080. var xs = scheduler.CreateHotObservable(
  7081. OnNext(150, (float?)1f),
  7082. OnNext(210, (float?)null),
  7083. OnNext(220, (float?)2f),
  7084. OnNext(230, (float?)4f),
  7085. OnCompleted<float?>(250)
  7086. );
  7087. var res = scheduler.Start(() =>
  7088. xs.Min()
  7089. );
  7090. res.Messages.AssertEqual(
  7091. OnNext(250, (float?)2f),
  7092. OnCompleted<float?>(250)
  7093. );
  7094. xs.Subscriptions.AssertEqual(
  7095. Subscribe(200, 250)
  7096. );
  7097. }
  7098. [Fact]
  7099. public void Min_Nullable_Float_Some2()
  7100. {
  7101. var scheduler = new TestScheduler();
  7102. var xs = scheduler.CreateHotObservable(
  7103. OnNext(150, (float?)1f),
  7104. OnNext(210, (float?)null),
  7105. OnNext(220, (float?)4f),
  7106. OnNext(230, (float?)2f),
  7107. OnCompleted<float?>(250)
  7108. );
  7109. var res = scheduler.Start(() =>
  7110. xs.Min()
  7111. );
  7112. res.Messages.AssertEqual(
  7113. OnNext(250, (float?)2f),
  7114. OnCompleted<float?>(250)
  7115. );
  7116. xs.Subscriptions.AssertEqual(
  7117. Subscribe(200, 250)
  7118. );
  7119. }
  7120. [Fact]
  7121. public void Min_Nullable_Float_Throw()
  7122. {
  7123. var ex = new Exception();
  7124. var scheduler = new TestScheduler();
  7125. var xs = scheduler.CreateHotObservable(
  7126. OnNext(150, (float?)1f),
  7127. OnError<float?>(210, ex)
  7128. );
  7129. var res = scheduler.Start(() =>
  7130. xs.Min()
  7131. );
  7132. res.Messages.AssertEqual(
  7133. OnError<float?>(210, ex)
  7134. );
  7135. xs.Subscriptions.AssertEqual(
  7136. Subscribe(200, 210)
  7137. );
  7138. }
  7139. [Fact]
  7140. public void Min_Nullable_Float_Never()
  7141. {
  7142. var ex = new Exception();
  7143. var scheduler = new TestScheduler();
  7144. var xs = scheduler.CreateHotObservable(
  7145. OnNext(150, (float?)1f)
  7146. );
  7147. var res = scheduler.Start(() =>
  7148. xs.Min()
  7149. );
  7150. res.Messages.AssertEqual(
  7151. );
  7152. xs.Subscriptions.AssertEqual(
  7153. Subscribe(200, 1000)
  7154. );
  7155. }
  7156. [Fact]
  7157. public void Min_Nullable_Double_Empty()
  7158. {
  7159. var scheduler = new TestScheduler();
  7160. var xs = scheduler.CreateHotObservable(
  7161. OnNext(150, (double?)1.0),
  7162. OnCompleted<double?>(250)
  7163. );
  7164. var res = scheduler.Start(() =>
  7165. xs.Min()
  7166. );
  7167. res.Messages.AssertEqual(
  7168. OnNext(250, default(double?)),
  7169. OnCompleted<double?>(250)
  7170. );
  7171. xs.Subscriptions.AssertEqual(
  7172. Subscribe(200, 250)
  7173. );
  7174. }
  7175. [Fact]
  7176. public void Min_Nullable_Double_Return()
  7177. {
  7178. var scheduler = new TestScheduler();
  7179. var xs = scheduler.CreateHotObservable(
  7180. OnNext(150, (double?)1.0),
  7181. OnNext(210, (double?)2.0),
  7182. OnCompleted<double?>(250)
  7183. );
  7184. var res = scheduler.Start(() =>
  7185. xs.Min()
  7186. );
  7187. res.Messages.AssertEqual(
  7188. OnNext(250, (double?)2.0),
  7189. OnCompleted<double?>(250)
  7190. );
  7191. xs.Subscriptions.AssertEqual(
  7192. Subscribe(200, 250)
  7193. );
  7194. }
  7195. [Fact]
  7196. public void Min_Nullable_Double_Some1()
  7197. {
  7198. var scheduler = new TestScheduler();
  7199. var xs = scheduler.CreateHotObservable(
  7200. OnNext(150, (double?)1.0),
  7201. OnNext(210, (double?)null),
  7202. OnNext(220, (double?)2.0),
  7203. OnNext(230, (double?)4.0),
  7204. OnCompleted<double?>(250)
  7205. );
  7206. var res = scheduler.Start(() =>
  7207. xs.Min()
  7208. );
  7209. res.Messages.AssertEqual(
  7210. OnNext(250, (double?)2.0),
  7211. OnCompleted<double?>(250)
  7212. );
  7213. xs.Subscriptions.AssertEqual(
  7214. Subscribe(200, 250)
  7215. );
  7216. }
  7217. [Fact]
  7218. public void Min_Nullable_Double_Some2()
  7219. {
  7220. var scheduler = new TestScheduler();
  7221. var xs = scheduler.CreateHotObservable(
  7222. OnNext(150, (double?)1.0),
  7223. OnNext(210, (double?)null),
  7224. OnNext(220, (double?)4.0),
  7225. OnNext(230, (double?)2.0),
  7226. OnCompleted<double?>(250)
  7227. );
  7228. var res = scheduler.Start(() =>
  7229. xs.Min()
  7230. );
  7231. res.Messages.AssertEqual(
  7232. OnNext(250, (double?)2.0),
  7233. OnCompleted<double?>(250)
  7234. );
  7235. xs.Subscriptions.AssertEqual(
  7236. Subscribe(200, 250)
  7237. );
  7238. }
  7239. [Fact]
  7240. public void Min_Nullable_Double_Throw()
  7241. {
  7242. var ex = new Exception();
  7243. var scheduler = new TestScheduler();
  7244. var xs = scheduler.CreateHotObservable(
  7245. OnNext(150, (double?)1.0),
  7246. OnError<double?>(210, ex)
  7247. );
  7248. var res = scheduler.Start(() =>
  7249. xs.Min()
  7250. );
  7251. res.Messages.AssertEqual(
  7252. OnError<double?>(210, ex)
  7253. );
  7254. xs.Subscriptions.AssertEqual(
  7255. Subscribe(200, 210)
  7256. );
  7257. }
  7258. [Fact]
  7259. public void Min_Nullable_Double_Never()
  7260. {
  7261. var ex = new Exception();
  7262. var scheduler = new TestScheduler();
  7263. var xs = scheduler.CreateHotObservable(
  7264. OnNext(150, (double?)1.0)
  7265. );
  7266. var res = scheduler.Start(() =>
  7267. xs.Min()
  7268. );
  7269. res.Messages.AssertEqual(
  7270. );
  7271. xs.Subscriptions.AssertEqual(
  7272. Subscribe(200, 1000)
  7273. );
  7274. }
  7275. [Fact]
  7276. public void Min_Nullable_Decimal_Empty()
  7277. {
  7278. var scheduler = new TestScheduler();
  7279. var xs = scheduler.CreateHotObservable(
  7280. OnNext(150, (decimal?)1m),
  7281. OnCompleted<decimal?>(250)
  7282. );
  7283. var res = scheduler.Start(() =>
  7284. xs.Min()
  7285. );
  7286. res.Messages.AssertEqual(
  7287. OnNext(250, default(decimal?)),
  7288. OnCompleted<decimal?>(250)
  7289. );
  7290. xs.Subscriptions.AssertEqual(
  7291. Subscribe(200, 250)
  7292. );
  7293. }
  7294. [Fact]
  7295. public void Min_Nullable_Decimal_Return()
  7296. {
  7297. var scheduler = new TestScheduler();
  7298. var xs = scheduler.CreateHotObservable(
  7299. OnNext(150, (decimal?)1m),
  7300. OnNext(210, (decimal?)2m),
  7301. OnCompleted<decimal?>(250)
  7302. );
  7303. var res = scheduler.Start(() =>
  7304. xs.Min()
  7305. );
  7306. res.Messages.AssertEqual(
  7307. OnNext(250, (decimal?)2m),
  7308. OnCompleted<decimal?>(250)
  7309. );
  7310. xs.Subscriptions.AssertEqual(
  7311. Subscribe(200, 250)
  7312. );
  7313. }
  7314. [Fact]
  7315. public void Min_Nullable_Decimal_Some1()
  7316. {
  7317. var scheduler = new TestScheduler();
  7318. var xs = scheduler.CreateHotObservable(
  7319. OnNext(150, (decimal?)1m),
  7320. OnNext(210, (decimal?)null),
  7321. OnNext(220, (decimal?)2m),
  7322. OnNext(230, (decimal?)4m),
  7323. OnCompleted<decimal?>(250)
  7324. );
  7325. var res = scheduler.Start(() =>
  7326. xs.Min()
  7327. );
  7328. res.Messages.AssertEqual(
  7329. OnNext(250, (decimal?)2m),
  7330. OnCompleted<decimal?>(250)
  7331. );
  7332. xs.Subscriptions.AssertEqual(
  7333. Subscribe(200, 250)
  7334. );
  7335. }
  7336. [Fact]
  7337. public void Min_Nullable_Decimal_Some2()
  7338. {
  7339. var scheduler = new TestScheduler();
  7340. var xs = scheduler.CreateHotObservable(
  7341. OnNext(150, (decimal?)1m),
  7342. OnNext(210, (decimal?)null),
  7343. OnNext(220, (decimal?)4m),
  7344. OnNext(230, (decimal?)2m),
  7345. OnCompleted<decimal?>(250)
  7346. );
  7347. var res = scheduler.Start(() =>
  7348. xs.Min()
  7349. );
  7350. res.Messages.AssertEqual(
  7351. OnNext(250, (decimal?)2m),
  7352. OnCompleted<decimal?>(250)
  7353. );
  7354. xs.Subscriptions.AssertEqual(
  7355. Subscribe(200, 250)
  7356. );
  7357. }
  7358. [Fact]
  7359. public void Min_Nullable_Decimal_Throw()
  7360. {
  7361. var ex = new Exception();
  7362. var scheduler = new TestScheduler();
  7363. var xs = scheduler.CreateHotObservable(
  7364. OnNext(150, (decimal?)1m),
  7365. OnError<decimal?>(210, ex)
  7366. );
  7367. var res = scheduler.Start(() =>
  7368. xs.Min()
  7369. );
  7370. res.Messages.AssertEqual(
  7371. OnError<decimal?>(210, ex)
  7372. );
  7373. xs.Subscriptions.AssertEqual(
  7374. Subscribe(200, 210)
  7375. );
  7376. }
  7377. [Fact]
  7378. public void Min_Nullable_Decimal_Never()
  7379. {
  7380. var ex = new Exception();
  7381. var scheduler = new TestScheduler();
  7382. var xs = scheduler.CreateHotObservable(
  7383. OnNext(150, (decimal?)1m)
  7384. );
  7385. var res = scheduler.Start(() =>
  7386. xs.Min()
  7387. );
  7388. res.Messages.AssertEqual(
  7389. );
  7390. xs.Subscriptions.AssertEqual(
  7391. Subscribe(200, 1000)
  7392. );
  7393. }
  7394. [Fact]
  7395. public void MinOfT_Reference_Empty()
  7396. {
  7397. var scheduler = new TestScheduler();
  7398. var xs = scheduler.CreateHotObservable(
  7399. OnNext(150, "z"),
  7400. OnCompleted<string>(250)
  7401. );
  7402. var res = scheduler.Start(() =>
  7403. xs.Min()
  7404. );
  7405. #if !NO_PERF
  7406. // BREAKING CHANGE v2 > v1.x - Behavior for reference types
  7407. res.Messages.AssertEqual(
  7408. OnNext(250, default(string)),
  7409. OnCompleted<string>(250)
  7410. );
  7411. #else
  7412. res.Messages.AssertEqual(
  7413. OnError<string>(250, e => e is InvalidOperationException)
  7414. );
  7415. #endif
  7416. xs.Subscriptions.AssertEqual(
  7417. Subscribe(200, 250)
  7418. );
  7419. }
  7420. [Fact]
  7421. public void MinOfT_Value_Empty()
  7422. {
  7423. var scheduler = new TestScheduler();
  7424. var xs = scheduler.CreateHotObservable(
  7425. OnNext(150, DateTime.Now),
  7426. OnCompleted<DateTime>(250)
  7427. );
  7428. var res = scheduler.Start(() =>
  7429. xs.Min()
  7430. );
  7431. res.Messages.AssertEqual(
  7432. OnError<DateTime>(250, e => e is InvalidOperationException)
  7433. );
  7434. xs.Subscriptions.AssertEqual(
  7435. Subscribe(200, 250)
  7436. );
  7437. }
  7438. [Fact]
  7439. public void MinOfT_Reference_Return()
  7440. {
  7441. var scheduler = new TestScheduler();
  7442. var xs = scheduler.CreateHotObservable(
  7443. OnNext(150, "z"),
  7444. OnNext(210, "a"),
  7445. OnCompleted<string>(250)
  7446. );
  7447. var res = scheduler.Start(() =>
  7448. xs.Min()
  7449. );
  7450. res.Messages.AssertEqual(
  7451. OnNext(250, "a"),
  7452. OnCompleted<string>(250)
  7453. );
  7454. xs.Subscriptions.AssertEqual(
  7455. Subscribe(200, 250)
  7456. );
  7457. }
  7458. [Fact]
  7459. public void MinOfT_Value_Return()
  7460. {
  7461. var scheduler = new TestScheduler();
  7462. var xs = scheduler.CreateHotObservable(
  7463. OnNext(150, DateTime.Now),
  7464. OnNext(210, new DateTime(1983, 2, 11)),
  7465. OnCompleted<DateTime>(250)
  7466. );
  7467. var res = scheduler.Start(() =>
  7468. xs.Min()
  7469. );
  7470. res.Messages.AssertEqual(
  7471. OnNext(250, new DateTime(1983, 2, 11)),
  7472. OnCompleted<DateTime>(250)
  7473. );
  7474. xs.Subscriptions.AssertEqual(
  7475. Subscribe(200, 250)
  7476. );
  7477. }
  7478. [Fact]
  7479. public void MinOfT_Reference_Some()
  7480. {
  7481. var scheduler = new TestScheduler();
  7482. var xs = scheduler.CreateHotObservable(
  7483. OnNext(150, "z"),
  7484. OnNext(210, "b"),
  7485. OnNext(220, "c"),
  7486. OnNext(230, "a"),
  7487. OnCompleted<string>(250)
  7488. );
  7489. var res = scheduler.Start(() =>
  7490. xs.Min()
  7491. );
  7492. res.Messages.AssertEqual(
  7493. OnNext(250, "a"),
  7494. OnCompleted<string>(250)
  7495. );
  7496. xs.Subscriptions.AssertEqual(
  7497. Subscribe(200, 250)
  7498. );
  7499. }
  7500. [Fact]
  7501. public void MinOfT_Value_Some()
  7502. {
  7503. var scheduler = new TestScheduler();
  7504. var xs = scheduler.CreateHotObservable(
  7505. OnNext(150, DateTime.Now),
  7506. OnNext(210, new DateTime(1993, 2, 11)),
  7507. OnNext(220, new DateTime(2003, 2, 11)),
  7508. OnNext(230, new DateTime(1983, 2, 11)),
  7509. OnCompleted<DateTime>(250)
  7510. );
  7511. var res = scheduler.Start(() =>
  7512. xs.Min()
  7513. );
  7514. res.Messages.AssertEqual(
  7515. OnNext(250, new DateTime(1983, 2, 11)),
  7516. OnCompleted<DateTime>(250)
  7517. );
  7518. xs.Subscriptions.AssertEqual(
  7519. Subscribe(200, 250)
  7520. );
  7521. }
  7522. [Fact]
  7523. public void MinOfT_Reference_Throw()
  7524. {
  7525. var ex = new Exception();
  7526. var scheduler = new TestScheduler();
  7527. var xs = scheduler.CreateHotObservable(
  7528. OnNext(150, "z"),
  7529. OnError<string>(210, ex)
  7530. );
  7531. var res = scheduler.Start(() =>
  7532. xs.Min()
  7533. );
  7534. res.Messages.AssertEqual(
  7535. OnError<string>(210, ex)
  7536. );
  7537. xs.Subscriptions.AssertEqual(
  7538. Subscribe(200, 210)
  7539. );
  7540. }
  7541. [Fact]
  7542. public void MinOfT_Value_Throw()
  7543. {
  7544. var ex = new Exception();
  7545. var scheduler = new TestScheduler();
  7546. var xs = scheduler.CreateHotObservable(
  7547. OnNext(150, DateTime.Now),
  7548. OnError<DateTime>(210, ex)
  7549. );
  7550. var res = scheduler.Start(() =>
  7551. xs.Min()
  7552. );
  7553. res.Messages.AssertEqual(
  7554. OnError<DateTime>(210, ex)
  7555. );
  7556. xs.Subscriptions.AssertEqual(
  7557. Subscribe(200, 210)
  7558. );
  7559. }
  7560. [Fact]
  7561. public void MinOfT_Reference_Never()
  7562. {
  7563. var ex = new Exception();
  7564. var scheduler = new TestScheduler();
  7565. var xs = scheduler.CreateHotObservable(
  7566. OnNext(150, "z")
  7567. );
  7568. var res = scheduler.Start(() =>
  7569. xs.Min()
  7570. );
  7571. res.Messages.AssertEqual(
  7572. );
  7573. xs.Subscriptions.AssertEqual(
  7574. Subscribe(200, 1000)
  7575. );
  7576. }
  7577. [Fact]
  7578. public void MinOfT_Value_Never()
  7579. {
  7580. var ex = new Exception();
  7581. var scheduler = new TestScheduler();
  7582. var xs = scheduler.CreateHotObservable(
  7583. OnNext(150, DateTime.Now)
  7584. );
  7585. var res = scheduler.Start(() =>
  7586. xs.Min()
  7587. );
  7588. res.Messages.AssertEqual(
  7589. );
  7590. xs.Subscriptions.AssertEqual(
  7591. Subscribe(200, 1000)
  7592. );
  7593. }
  7594. [Fact]
  7595. public void MinOfT_Reference_Comparer_Empty()
  7596. {
  7597. var scheduler = new TestScheduler();
  7598. var xs = scheduler.CreateHotObservable(
  7599. OnNext(150, "z"),
  7600. OnCompleted<string>(250)
  7601. );
  7602. var res = scheduler.Start(() =>
  7603. xs.Min(new ReverseComparer<string>(Comparer<string>.Default))
  7604. );
  7605. #if !NO_PERF
  7606. // BREAKING CHANGE v2 > v1.x - Behavior for reference types
  7607. res.Messages.AssertEqual(
  7608. OnNext(250, default(string)),
  7609. OnCompleted<string>(250)
  7610. );
  7611. #else
  7612. res.Messages.AssertEqual(
  7613. OnError<string>(250, e => e is InvalidOperationException)
  7614. );
  7615. #endif
  7616. xs.Subscriptions.AssertEqual(
  7617. Subscribe(200, 250)
  7618. );
  7619. }
  7620. [Fact]
  7621. public void MinOfT_Value_Comparer_Empty()
  7622. {
  7623. var scheduler = new TestScheduler();
  7624. var xs = scheduler.CreateHotObservable(
  7625. OnNext(150, DateTime.Now),
  7626. OnCompleted<DateTime>(250)
  7627. );
  7628. var res = scheduler.Start(() =>
  7629. xs.Min(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  7630. );
  7631. res.Messages.AssertEqual(
  7632. OnError<DateTime>(250, e => e is InvalidOperationException)
  7633. );
  7634. xs.Subscriptions.AssertEqual(
  7635. Subscribe(200, 250)
  7636. );
  7637. }
  7638. [Fact]
  7639. public void MinOfT_Reference_Comparer_Return()
  7640. {
  7641. var scheduler = new TestScheduler();
  7642. var xs = scheduler.CreateHotObservable(
  7643. OnNext(150, "z"),
  7644. OnNext(210, "a"),
  7645. OnCompleted<string>(250)
  7646. );
  7647. var res = scheduler.Start(() =>
  7648. xs.Min(new ReverseComparer<string>(Comparer<string>.Default))
  7649. );
  7650. res.Messages.AssertEqual(
  7651. OnNext(250, "a"),
  7652. OnCompleted<string>(250)
  7653. );
  7654. xs.Subscriptions.AssertEqual(
  7655. Subscribe(200, 250)
  7656. );
  7657. }
  7658. [Fact]
  7659. public void MinOfT_Value_Comparer_Return()
  7660. {
  7661. var scheduler = new TestScheduler();
  7662. var xs = scheduler.CreateHotObservable(
  7663. OnNext(150, DateTime.Now),
  7664. OnNext(210, new DateTime(1983, 2, 11)),
  7665. OnCompleted<DateTime>(250)
  7666. );
  7667. var res = scheduler.Start(() =>
  7668. xs.Min(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  7669. );
  7670. res.Messages.AssertEqual(
  7671. OnNext(250, new DateTime(1983, 2, 11)),
  7672. OnCompleted<DateTime>(250)
  7673. );
  7674. xs.Subscriptions.AssertEqual(
  7675. Subscribe(200, 250)
  7676. );
  7677. }
  7678. [Fact]
  7679. public void MinOfT_Reference_Comparer_Some()
  7680. {
  7681. var scheduler = new TestScheduler();
  7682. var xs = scheduler.CreateHotObservable(
  7683. OnNext(150, "z"),
  7684. OnNext(210, "b"),
  7685. OnNext(220, "c"),
  7686. OnNext(230, "a"),
  7687. OnCompleted<string>(250)
  7688. );
  7689. var res = scheduler.Start(() =>
  7690. xs.Min(new ReverseComparer<string>(Comparer<string>.Default))
  7691. );
  7692. res.Messages.AssertEqual(
  7693. OnNext(250, "c"),
  7694. OnCompleted<string>(250)
  7695. );
  7696. xs.Subscriptions.AssertEqual(
  7697. Subscribe(200, 250)
  7698. );
  7699. }
  7700. [Fact]
  7701. public void MinOfT_Value_Comparer_Some()
  7702. {
  7703. var scheduler = new TestScheduler();
  7704. var xs = scheduler.CreateHotObservable(
  7705. OnNext(150, DateTime.Now),
  7706. OnNext(210, new DateTime(1993, 2, 11)),
  7707. OnNext(220, new DateTime(2003, 2, 11)),
  7708. OnNext(230, new DateTime(1983, 2, 11)),
  7709. OnCompleted<DateTime>(250)
  7710. );
  7711. var res = scheduler.Start(() =>
  7712. xs.Min(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  7713. );
  7714. res.Messages.AssertEqual(
  7715. OnNext(250, new DateTime(2003, 2, 11)),
  7716. OnCompleted<DateTime>(250)
  7717. );
  7718. xs.Subscriptions.AssertEqual(
  7719. Subscribe(200, 250)
  7720. );
  7721. }
  7722. [Fact]
  7723. public void MinOfT_Reference_Comparer_Throw()
  7724. {
  7725. var ex = new Exception();
  7726. var scheduler = new TestScheduler();
  7727. var xs = scheduler.CreateHotObservable(
  7728. OnNext(150, "z"),
  7729. OnError<string>(210, ex)
  7730. );
  7731. var res = scheduler.Start(() =>
  7732. xs.Min(new ReverseComparer<string>(Comparer<string>.Default))
  7733. );
  7734. res.Messages.AssertEqual(
  7735. OnError<string>(210, ex)
  7736. );
  7737. xs.Subscriptions.AssertEqual(
  7738. Subscribe(200, 210)
  7739. );
  7740. }
  7741. [Fact]
  7742. public void MinOfT_Value_Comparer_Throw()
  7743. {
  7744. var ex = new Exception();
  7745. var scheduler = new TestScheduler();
  7746. var xs = scheduler.CreateHotObservable(
  7747. OnNext(150, DateTime.Now),
  7748. OnError<DateTime>(210, ex)
  7749. );
  7750. var res = scheduler.Start(() =>
  7751. xs.Min(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  7752. );
  7753. res.Messages.AssertEqual(
  7754. OnError<DateTime>(210, ex)
  7755. );
  7756. xs.Subscriptions.AssertEqual(
  7757. Subscribe(200, 210)
  7758. );
  7759. }
  7760. [Fact]
  7761. public void MinOfT_Reference_Comparer_Never()
  7762. {
  7763. var ex = new Exception();
  7764. var scheduler = new TestScheduler();
  7765. var xs = scheduler.CreateHotObservable(
  7766. OnNext(150, "z")
  7767. );
  7768. var res = scheduler.Start(() =>
  7769. xs.Min(new ReverseComparer<string>(Comparer<string>.Default))
  7770. );
  7771. res.Messages.AssertEqual(
  7772. );
  7773. xs.Subscriptions.AssertEqual(
  7774. Subscribe(200, 1000)
  7775. );
  7776. }
  7777. [Fact]
  7778. public void MinOfT_Value_Comparer_Never()
  7779. {
  7780. var ex = new Exception();
  7781. var scheduler = new TestScheduler();
  7782. var xs = scheduler.CreateHotObservable(
  7783. OnNext(150, DateTime.Now)
  7784. );
  7785. var res = scheduler.Start(() =>
  7786. xs.Min(new ReverseComparer<DateTime>(Comparer<DateTime>.Default))
  7787. );
  7788. res.Messages.AssertEqual(
  7789. );
  7790. xs.Subscriptions.AssertEqual(
  7791. Subscribe(200, 1000)
  7792. );
  7793. }
  7794. [Fact]
  7795. public void MinOfT_Reference_ComparerThrows()
  7796. {
  7797. var ex = new Exception();
  7798. var scheduler = new TestScheduler();
  7799. var xs = scheduler.CreateHotObservable(
  7800. OnNext(150, "z"),
  7801. OnNext(210, "b"),
  7802. OnNext(220, "c"),
  7803. OnNext(230, "a"),
  7804. OnCompleted<string>(250)
  7805. );
  7806. var res = scheduler.Start(() =>
  7807. xs.Min(new ThrowingComparer<string>(ex))
  7808. );
  7809. res.Messages.AssertEqual(
  7810. OnError<string>(220, ex)
  7811. );
  7812. xs.Subscriptions.AssertEqual(
  7813. Subscribe(200, 220)
  7814. );
  7815. }
  7816. [Fact]
  7817. public void MinOfT_Value_ComparerThrows()
  7818. {
  7819. var ex = new Exception();
  7820. var scheduler = new TestScheduler();
  7821. var xs = scheduler.CreateHotObservable(
  7822. OnNext(150, DateTime.Now),
  7823. OnNext(210, new DateTime(1993, 2, 11)),
  7824. OnNext(220, new DateTime(2003, 2, 11)),
  7825. OnNext(230, new DateTime(1983, 2, 11)),
  7826. OnCompleted<DateTime>(250)
  7827. );
  7828. var res = scheduler.Start(() =>
  7829. xs.Min(new ThrowingComparer<DateTime>(ex))
  7830. );
  7831. res.Messages.AssertEqual(
  7832. OnError<DateTime>(220, ex)
  7833. );
  7834. xs.Subscriptions.AssertEqual(
  7835. Subscribe(200, 220)
  7836. );
  7837. }
  7838. [Fact]
  7839. public void Min_Selector_Regular_Int32()
  7840. {
  7841. var scheduler = new TestScheduler();
  7842. var xs = scheduler.CreateHotObservable<string>(
  7843. OnNext(210, "fo"),
  7844. OnNext(220, "b"),
  7845. OnNext(230, "qux"),
  7846. OnCompleted<string>(240)
  7847. );
  7848. var res = scheduler.Start(() => xs.Min(x => (int)x.Length));
  7849. res.Messages.AssertEqual(
  7850. OnNext(240, 1),
  7851. OnCompleted<int>(240)
  7852. );
  7853. xs.Subscriptions.AssertEqual(
  7854. Subscribe(200, 240)
  7855. );
  7856. }
  7857. [Fact]
  7858. public void Min_Selector_Regular_Int64()
  7859. {
  7860. var scheduler = new TestScheduler();
  7861. var xs = scheduler.CreateHotObservable<string>(
  7862. OnNext(210, "fo"),
  7863. OnNext(220, "b"),
  7864. OnNext(230, "qux"),
  7865. OnCompleted<string>(240)
  7866. );
  7867. var res = scheduler.Start(() => xs.Min(x => (long)x.Length));
  7868. res.Messages.AssertEqual(
  7869. OnNext(240, 1L),
  7870. OnCompleted<long>(240)
  7871. );
  7872. xs.Subscriptions.AssertEqual(
  7873. Subscribe(200, 240)
  7874. );
  7875. }
  7876. [Fact]
  7877. public void Min_Selector_Regular_Single()
  7878. {
  7879. var scheduler = new TestScheduler();
  7880. var xs = scheduler.CreateHotObservable<string>(
  7881. OnNext(210, "fo"),
  7882. OnNext(220, "b"),
  7883. OnNext(230, "qux"),
  7884. OnCompleted<string>(240)
  7885. );
  7886. var res = scheduler.Start(() => xs.Min(x => (float)x.Length));
  7887. res.Messages.AssertEqual(
  7888. OnNext(240, 1.0f),
  7889. OnCompleted<float>(240)
  7890. );
  7891. xs.Subscriptions.AssertEqual(
  7892. Subscribe(200, 240)
  7893. );
  7894. }
  7895. [Fact]
  7896. public void Min_Selector_Regular_Double()
  7897. {
  7898. var scheduler = new TestScheduler();
  7899. var xs = scheduler.CreateHotObservable<string>(
  7900. OnNext(210, "fo"),
  7901. OnNext(220, "b"),
  7902. OnNext(230, "qux"),
  7903. OnCompleted<string>(240)
  7904. );
  7905. var res = scheduler.Start(() => xs.Min(x => (double)x.Length));
  7906. res.Messages.AssertEqual(
  7907. OnNext(240, 1.0),
  7908. OnCompleted<double>(240)
  7909. );
  7910. xs.Subscriptions.AssertEqual(
  7911. Subscribe(200, 240)
  7912. );
  7913. }
  7914. [Fact]
  7915. public void Min_Selector_Regular_Decimal()
  7916. {
  7917. var scheduler = new TestScheduler();
  7918. var xs = scheduler.CreateHotObservable<string>(
  7919. OnNext(210, "fo"),
  7920. OnNext(220, "b"),
  7921. OnNext(230, "qux"),
  7922. OnCompleted<string>(240)
  7923. );
  7924. var res = scheduler.Start(() => xs.Min(x => (decimal)x.Length));
  7925. res.Messages.AssertEqual(
  7926. OnNext(240, 1.0m),
  7927. OnCompleted<decimal>(240)
  7928. );
  7929. xs.Subscriptions.AssertEqual(
  7930. Subscribe(200, 240)
  7931. );
  7932. }
  7933. [Fact]
  7934. public void Min_Selector_Regular_Int32_Nullable()
  7935. {
  7936. var scheduler = new TestScheduler();
  7937. var xs = scheduler.CreateHotObservable<string>(
  7938. OnNext(210, "fo"),
  7939. OnNext(220, "b"),
  7940. OnNext(230, "qux"),
  7941. OnCompleted<string>(240)
  7942. );
  7943. var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(int?) : x.Length));
  7944. res.Messages.AssertEqual(
  7945. OnNext(240, (int?)1),
  7946. OnCompleted<int?>(240)
  7947. );
  7948. xs.Subscriptions.AssertEqual(
  7949. Subscribe(200, 240)
  7950. );
  7951. }
  7952. [Fact]
  7953. public void Min_Selector_Regular_Int64_Nullable()
  7954. {
  7955. var scheduler = new TestScheduler();
  7956. var xs = scheduler.CreateHotObservable<string>(
  7957. OnNext(210, "fo"),
  7958. OnNext(220, "b"),
  7959. OnNext(230, "qux"),
  7960. OnCompleted<string>(240)
  7961. );
  7962. var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(long?) : x.Length));
  7963. res.Messages.AssertEqual(
  7964. OnNext(240, (long?)1.0),
  7965. OnCompleted<long?>(240)
  7966. );
  7967. xs.Subscriptions.AssertEqual(
  7968. Subscribe(200, 240)
  7969. );
  7970. }
  7971. [Fact]
  7972. public void Min_Selector_Regular_Single_Nullable()
  7973. {
  7974. var scheduler = new TestScheduler();
  7975. var xs = scheduler.CreateHotObservable<string>(
  7976. OnNext(210, "fo"),
  7977. OnNext(220, "b"),
  7978. OnNext(230, "qux"),
  7979. OnCompleted<string>(240)
  7980. );
  7981. var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(float?) : x.Length));
  7982. res.Messages.AssertEqual(
  7983. OnNext(240, (float?)1.0),
  7984. OnCompleted<float?>(240)
  7985. );
  7986. xs.Subscriptions.AssertEqual(
  7987. Subscribe(200, 240)
  7988. );
  7989. }
  7990. [Fact]
  7991. public void Min_Selector_Regular_Double_Nullable()
  7992. {
  7993. var scheduler = new TestScheduler();
  7994. var xs = scheduler.CreateHotObservable<string>(
  7995. OnNext(210, "fo"),
  7996. OnNext(220, "b"),
  7997. OnNext(230, "qux"),
  7998. OnCompleted<string>(240)
  7999. );
  8000. var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(double?) : x.Length));
  8001. res.Messages.AssertEqual(
  8002. OnNext(240, (double?)1.0),
  8003. OnCompleted<double?>(240)
  8004. );
  8005. xs.Subscriptions.AssertEqual(
  8006. Subscribe(200, 240)
  8007. );
  8008. }
  8009. [Fact]
  8010. public void Min_Selector_Regular_Decimal_Nullable()
  8011. {
  8012. var scheduler = new TestScheduler();
  8013. var xs = scheduler.CreateHotObservable<string>(
  8014. OnNext(210, "fo"),
  8015. OnNext(220, "b"),
  8016. OnNext(230, "qux"),
  8017. OnCompleted<string>(240)
  8018. );
  8019. var res = scheduler.Start(() => xs.Min(x => x == "fo" ? default(decimal?) : x.Length));
  8020. res.Messages.AssertEqual(
  8021. OnNext(240, (decimal?)1.0),
  8022. OnCompleted<decimal?>(240)
  8023. );
  8024. xs.Subscriptions.AssertEqual(
  8025. Subscribe(200, 240)
  8026. );
  8027. }
  8028. [Fact]
  8029. public void MinOfT_Selector_Regular()
  8030. {
  8031. var scheduler = new TestScheduler();
  8032. var xs = scheduler.CreateHotObservable<string>(
  8033. OnNext(210, "qux"),
  8034. OnNext(220, "foo"),
  8035. OnNext(230, "bar"),
  8036. OnCompleted<string>(240)
  8037. );
  8038. var res = scheduler.Start(() => xs.Min(x => new string(x.ToCharArray().Reverse().ToArray())));
  8039. res.Messages.AssertEqual(
  8040. OnNext(240, "oof"),
  8041. OnCompleted<string>(240)
  8042. );
  8043. xs.Subscriptions.AssertEqual(
  8044. Subscribe(200, 240)
  8045. );
  8046. }
  8047. [Fact]
  8048. public void MinOfT_Selector_Regular_Comparer()
  8049. {
  8050. var scheduler = new TestScheduler();
  8051. var xs = scheduler.CreateHotObservable<string>(
  8052. OnNext(210, "qux"),
  8053. OnNext(220, "foo"),
  8054. OnNext(230, "bar"),
  8055. OnCompleted<string>(240)
  8056. );
  8057. var res = scheduler.Start(() => xs.Min(x => new string(x.ToCharArray().Reverse().ToArray()), new ReverseComparer<string>(Comparer<string>.Default)));
  8058. res.Messages.AssertEqual(
  8059. OnNext(240, "xuq"),
  8060. OnCompleted<string>(240)
  8061. );
  8062. xs.Subscriptions.AssertEqual(
  8063. Subscribe(200, 240)
  8064. );
  8065. }
  8066. #endregion
  8067. #region + MinBy +
  8068. [Fact]
  8069. public void MinBy_ArgumentChecking()
  8070. {
  8071. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(default(IObservable<int>), x => x));
  8072. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(DummyObservable<int>.Instance, default(Func<int, int>)));
  8073. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(default(IObservable<int>), x => x, Comparer<int>.Default));
  8074. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(DummyObservable<int>.Instance, default(Func<int, int>), Comparer<int>.Default));
  8075. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.MinBy(DummyObservable<int>.Instance, x => x, null));
  8076. }
  8077. [Fact]
  8078. public void MinBy_Empty()
  8079. {
  8080. var scheduler = new TestScheduler();
  8081. var xs = scheduler.CreateHotObservable(
  8082. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8083. OnCompleted<KeyValuePair<int, string>>(250)
  8084. );
  8085. var res = scheduler.Start(() =>
  8086. xs.MinBy(x => x.Key)
  8087. );
  8088. res.Messages.AssertEqual(
  8089. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.Count == 0),
  8090. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  8091. );
  8092. xs.Subscriptions.AssertEqual(
  8093. Subscribe(200, 250)
  8094. );
  8095. }
  8096. [Fact]
  8097. public void MinBy_Return()
  8098. {
  8099. var scheduler = new TestScheduler();
  8100. var xs = scheduler.CreateHotObservable(
  8101. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8102. OnNext(210, new KeyValuePair<int, string>(2, "a")),
  8103. OnCompleted<KeyValuePair<int, string>>(250)
  8104. );
  8105. var res = scheduler.Start(() =>
  8106. xs.MinBy(x => x.Key)
  8107. );
  8108. res.Messages.AssertEqual(
  8109. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  8110. new KeyValuePair<int, string>(2, "a"),
  8111. })),
  8112. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  8113. );
  8114. xs.Subscriptions.AssertEqual(
  8115. Subscribe(200, 250)
  8116. );
  8117. }
  8118. [Fact]
  8119. public void MinBy_Some()
  8120. {
  8121. var scheduler = new TestScheduler();
  8122. var xs = scheduler.CreateHotObservable(
  8123. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8124. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  8125. OnNext(220, new KeyValuePair<int, string>(2, "c")),
  8126. OnNext(230, new KeyValuePair<int, string>(4, "a")),
  8127. OnCompleted<KeyValuePair<int, string>>(250)
  8128. );
  8129. var res = scheduler.Start(() =>
  8130. xs.MinBy(x => x.Key)
  8131. );
  8132. res.Messages.AssertEqual(
  8133. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  8134. new KeyValuePair<int, string>(2, "c"),
  8135. })),
  8136. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  8137. );
  8138. xs.Subscriptions.AssertEqual(
  8139. Subscribe(200, 250)
  8140. );
  8141. }
  8142. [Fact]
  8143. public void MinBy_Multiple()
  8144. {
  8145. var scheduler = new TestScheduler();
  8146. var xs = scheduler.CreateHotObservable(
  8147. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8148. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  8149. OnNext(215, new KeyValuePair<int, string>(2, "d")),
  8150. OnNext(220, new KeyValuePair<int, string>(3, "c")),
  8151. OnNext(225, new KeyValuePair<int, string>(2, "y")),
  8152. OnNext(230, new KeyValuePair<int, string>(4, "a")),
  8153. OnNext(235, new KeyValuePair<int, string>(4, "r")),
  8154. OnCompleted<KeyValuePair<int, string>>(250)
  8155. );
  8156. var res = scheduler.Start(() =>
  8157. xs.MinBy(x => x.Key)
  8158. );
  8159. res.Messages.AssertEqual(
  8160. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  8161. new KeyValuePair<int, string>(2, "d"),
  8162. new KeyValuePair<int, string>(2, "y"),
  8163. })),
  8164. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  8165. );
  8166. xs.Subscriptions.AssertEqual(
  8167. Subscribe(200, 250)
  8168. );
  8169. }
  8170. [Fact]
  8171. public void MinBy_Throw()
  8172. {
  8173. var ex = new Exception();
  8174. var scheduler = new TestScheduler();
  8175. var xs = scheduler.CreateHotObservable(
  8176. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8177. OnError<KeyValuePair<int, string>>(210, ex)
  8178. );
  8179. var res = scheduler.Start(() =>
  8180. xs.MinBy(x => x.Key)
  8181. );
  8182. res.Messages.AssertEqual(
  8183. OnError<IList<KeyValuePair<int, string>>>(210, ex)
  8184. );
  8185. xs.Subscriptions.AssertEqual(
  8186. Subscribe(200, 210)
  8187. );
  8188. }
  8189. [Fact]
  8190. public void MinBy_Never()
  8191. {
  8192. var ex = new Exception();
  8193. var scheduler = new TestScheduler();
  8194. var xs = scheduler.CreateHotObservable(
  8195. OnNext(150, new KeyValuePair<int, string>(1, "z"))
  8196. );
  8197. var res = scheduler.Start(() =>
  8198. xs.MinBy(x => x.Key)
  8199. );
  8200. res.Messages.AssertEqual(
  8201. );
  8202. xs.Subscriptions.AssertEqual(
  8203. Subscribe(200, 1000)
  8204. );
  8205. }
  8206. [Fact]
  8207. public void MinBy_Comparer_Empty()
  8208. {
  8209. var scheduler = new TestScheduler();
  8210. var xs = scheduler.CreateHotObservable(
  8211. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8212. OnCompleted<KeyValuePair<int, string>>(250)
  8213. );
  8214. var res = scheduler.Start(() =>
  8215. xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  8216. );
  8217. res.Messages.AssertEqual(
  8218. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.Count == 0),
  8219. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  8220. );
  8221. xs.Subscriptions.AssertEqual(
  8222. Subscribe(200, 250)
  8223. );
  8224. }
  8225. [Fact]
  8226. public void MinBy_Comparer_Return()
  8227. {
  8228. var scheduler = new TestScheduler();
  8229. var xs = scheduler.CreateHotObservable(
  8230. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8231. OnNext(210, new KeyValuePair<int, string>(2, "a")),
  8232. OnCompleted<KeyValuePair<int, string>>(250)
  8233. );
  8234. var res = scheduler.Start(() =>
  8235. xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  8236. );
  8237. res.Messages.AssertEqual(
  8238. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  8239. new KeyValuePair<int, string>(2, "a"),
  8240. })),
  8241. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  8242. );
  8243. xs.Subscriptions.AssertEqual(
  8244. Subscribe(200, 250)
  8245. );
  8246. }
  8247. [Fact]
  8248. public void MinBy_Comparer_Some()
  8249. {
  8250. var scheduler = new TestScheduler();
  8251. var xs = scheduler.CreateHotObservable(
  8252. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8253. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  8254. OnNext(220, new KeyValuePair<int, string>(20, "c")),
  8255. OnNext(230, new KeyValuePair<int, string>(4, "a")),
  8256. OnCompleted<KeyValuePair<int, string>>(250)
  8257. );
  8258. var res = scheduler.Start(() =>
  8259. xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  8260. );
  8261. res.Messages.AssertEqual(
  8262. OnNext<IList<KeyValuePair<int, string>>>(250, x => x.SequenceEqual(new[] {
  8263. new KeyValuePair<int, string>(20, "c"),
  8264. })),
  8265. OnCompleted<IList<KeyValuePair<int, string>>>(250)
  8266. );
  8267. xs.Subscriptions.AssertEqual(
  8268. Subscribe(200, 250)
  8269. );
  8270. }
  8271. [Fact]
  8272. public void MinBy_Comparer_Throw()
  8273. {
  8274. var ex = new Exception();
  8275. var scheduler = new TestScheduler();
  8276. var xs = scheduler.CreateHotObservable(
  8277. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8278. OnError<KeyValuePair<int, string>>(210, ex)
  8279. );
  8280. var res = scheduler.Start(() =>
  8281. xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  8282. );
  8283. res.Messages.AssertEqual(
  8284. OnError<IList<KeyValuePair<int, string>>>(210, ex)
  8285. );
  8286. xs.Subscriptions.AssertEqual(
  8287. Subscribe(200, 210)
  8288. );
  8289. }
  8290. [Fact]
  8291. public void MinBy_Comparer_Never()
  8292. {
  8293. var ex = new Exception();
  8294. var scheduler = new TestScheduler();
  8295. var xs = scheduler.CreateHotObservable(
  8296. OnNext(150, new KeyValuePair<int, string>(1, "z"))
  8297. );
  8298. var res = scheduler.Start(() =>
  8299. xs.MinBy(x => x.Key, new ReverseComparer<int>(Comparer<int>.Default))
  8300. );
  8301. res.Messages.AssertEqual(
  8302. );
  8303. xs.Subscriptions.AssertEqual(
  8304. Subscribe(200, 1000)
  8305. );
  8306. }
  8307. [Fact]
  8308. public void MinBy_SelectorThrows()
  8309. {
  8310. var ex = new Exception();
  8311. var scheduler = new TestScheduler();
  8312. var xs = scheduler.CreateHotObservable(
  8313. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8314. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  8315. OnNext(220, new KeyValuePair<int, string>(2, "c")),
  8316. OnNext(230, new KeyValuePair<int, string>(4, "a")),
  8317. OnCompleted<KeyValuePair<int, string>>(250)
  8318. );
  8319. var res = scheduler.Start(() =>
  8320. xs.MinBy<KeyValuePair<int, string>, int>(x => { throw ex; })
  8321. );
  8322. res.Messages.AssertEqual(
  8323. OnError<IList<KeyValuePair<int, string>>>(210, ex)
  8324. );
  8325. xs.Subscriptions.AssertEqual(
  8326. Subscribe(200, 210)
  8327. );
  8328. }
  8329. [Fact]
  8330. public void MinBy_ComparerThrows()
  8331. {
  8332. var ex = new Exception();
  8333. var scheduler = new TestScheduler();
  8334. var xs = scheduler.CreateHotObservable(
  8335. OnNext(150, new KeyValuePair<int, string>(1, "z")),
  8336. OnNext(210, new KeyValuePair<int, string>(3, "b")),
  8337. OnNext(220, new KeyValuePair<int, string>(2, "c")),
  8338. OnNext(230, new KeyValuePair<int, string>(4, "a")),
  8339. OnCompleted<KeyValuePair<int, string>>(250)
  8340. );
  8341. var res = scheduler.Start(() =>
  8342. xs.MinBy(x => x.Key, new ThrowingComparer<int>(ex))
  8343. );
  8344. res.Messages.AssertEqual(
  8345. OnError<IList<KeyValuePair<int, string>>>(220, ex)
  8346. );
  8347. xs.Subscriptions.AssertEqual(
  8348. Subscribe(200, 220)
  8349. );
  8350. }
  8351. class ReverseComparer<T> : IComparer<T>
  8352. {
  8353. private IComparer<T> _comparer;
  8354. public ReverseComparer(IComparer<T> comparer)
  8355. {
  8356. _comparer = comparer;
  8357. }
  8358. public int Compare(T x, T y)
  8359. {
  8360. return -_comparer.Compare(x, y);
  8361. }
  8362. }
  8363. class ThrowingComparer<T> : IComparer<T>
  8364. {
  8365. private Exception _ex;
  8366. public ThrowingComparer(Exception ex)
  8367. {
  8368. _ex = ex;
  8369. }
  8370. public int Compare(T x, T y)
  8371. {
  8372. throw _ex;
  8373. }
  8374. }
  8375. #endregion
  8376. #region + SequenceEqual +
  8377. [Fact]
  8378. public void SequenceEqual_ArgumentChecking()
  8379. {
  8380. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(default(IObservable<int>), DummyObservable<int>.Instance));
  8381. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, default(IObservable<int>)));
  8382. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(default(IObservable<int>), DummyObservable<int>.Instance, EqualityComparer<int>.Default));
  8383. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, default(IObservable<int>), EqualityComparer<int>.Default));
  8384. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, DummyObservable<int>.Instance, default(IEqualityComparer<int>)));
  8385. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(default(IObservable<int>), new[] { 42 }));
  8386. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, default(IEnumerable<int>)));
  8387. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(default(IObservable<int>), new[] { 42 }, EqualityComparer<int>.Default));
  8388. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, default(IEnumerable<int>), EqualityComparer<int>.Default));
  8389. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SequenceEqual<int>(DummyObservable<int>.Instance, new[] { 42 }, default(IEqualityComparer<int>)));
  8390. }
  8391. [Fact]
  8392. public void SequenceEqual_Observable_Equal()
  8393. {
  8394. var scheduler = new TestScheduler();
  8395. var xs = scheduler.CreateHotObservable(
  8396. OnNext(110, 1),
  8397. OnNext(190, 2),
  8398. OnNext(240, 3),
  8399. OnNext(290, 4),
  8400. OnNext(310, 5),
  8401. OnNext(340, 6),
  8402. OnNext(450, 7),
  8403. OnCompleted<int>(510)
  8404. );
  8405. var ys = scheduler.CreateHotObservable(
  8406. OnNext(90, 1),
  8407. OnNext(270, 3),
  8408. OnNext(280, 4),
  8409. OnNext(300, 5),
  8410. OnNext(330, 6),
  8411. OnNext(340, 7),
  8412. OnCompleted<int>(720)
  8413. );
  8414. var res = scheduler.Start(() =>
  8415. xs.SequenceEqual(ys)
  8416. );
  8417. res.Messages.AssertEqual(
  8418. OnNext(720, true),
  8419. OnCompleted<bool>(720)
  8420. );
  8421. xs.Subscriptions.AssertEqual(
  8422. Subscribe(200, 720)
  8423. );
  8424. ys.Subscriptions.AssertEqual(
  8425. Subscribe(200, 720)
  8426. );
  8427. }
  8428. [Fact]
  8429. public void SequenceEqual_Observable_Equal_Sym()
  8430. {
  8431. var scheduler = new TestScheduler();
  8432. var xs = scheduler.CreateHotObservable(
  8433. OnNext(110, 1),
  8434. OnNext(190, 2),
  8435. OnNext(240, 3),
  8436. OnNext(290, 4),
  8437. OnNext(310, 5),
  8438. OnNext(340, 6),
  8439. OnNext(450, 7),
  8440. OnCompleted<int>(510)
  8441. );
  8442. var ys = scheduler.CreateHotObservable(
  8443. OnNext(90, 1),
  8444. OnNext(270, 3),
  8445. OnNext(280, 4),
  8446. OnNext(300, 5),
  8447. OnNext(330, 6),
  8448. OnNext(340, 7),
  8449. OnCompleted<int>(720)
  8450. );
  8451. var res = scheduler.Start(() =>
  8452. ys.SequenceEqual(xs)
  8453. );
  8454. res.Messages.AssertEqual(
  8455. OnNext(720, true),
  8456. OnCompleted<bool>(720)
  8457. );
  8458. xs.Subscriptions.AssertEqual(
  8459. Subscribe(200, 720)
  8460. );
  8461. ys.Subscriptions.AssertEqual(
  8462. Subscribe(200, 720)
  8463. );
  8464. }
  8465. [Fact]
  8466. public void SequenceEqual_Observable_NotEqual_Left()
  8467. {
  8468. var scheduler = new TestScheduler();
  8469. var xs = scheduler.CreateHotObservable(
  8470. OnNext(110, 1),
  8471. OnNext(190, 2),
  8472. OnNext(240, 3),
  8473. OnNext(290, 4),
  8474. OnNext(310, 0),
  8475. OnNext(340, 6),
  8476. OnNext(450, 7),
  8477. OnCompleted<int>(510)
  8478. );
  8479. var ys = scheduler.CreateHotObservable(
  8480. OnNext(90, 1),
  8481. OnNext(270, 3),
  8482. OnNext(280, 4),
  8483. OnNext(300, 5),
  8484. OnNext(330, 6),
  8485. OnNext(340, 7),
  8486. OnCompleted<int>(720)
  8487. );
  8488. var res = scheduler.Start(() =>
  8489. xs.SequenceEqual(ys)
  8490. );
  8491. res.Messages.AssertEqual(
  8492. OnNext(310, false),
  8493. OnCompleted<bool>(310)
  8494. );
  8495. xs.Subscriptions.AssertEqual(
  8496. Subscribe(200, 310)
  8497. );
  8498. ys.Subscriptions.AssertEqual(
  8499. Subscribe(200, 310)
  8500. );
  8501. }
  8502. [Fact]
  8503. public void SequenceEqual_Observable_NotEqual_Left_Sym()
  8504. {
  8505. var scheduler = new TestScheduler();
  8506. var xs = scheduler.CreateHotObservable(
  8507. OnNext(110, 1),
  8508. OnNext(190, 2),
  8509. OnNext(240, 3),
  8510. OnNext(290, 4),
  8511. OnNext(310, 0),
  8512. OnNext(340, 6),
  8513. OnNext(450, 7),
  8514. OnCompleted<int>(510)
  8515. );
  8516. var ys = scheduler.CreateHotObservable(
  8517. OnNext(90, 1),
  8518. OnNext(270, 3),
  8519. OnNext(280, 4),
  8520. OnNext(300, 5),
  8521. OnNext(330, 6),
  8522. OnNext(340, 7),
  8523. OnCompleted<int>(720)
  8524. );
  8525. var res = scheduler.Start(() =>
  8526. ys.SequenceEqual(xs)
  8527. );
  8528. res.Messages.AssertEqual(
  8529. OnNext(310, false),
  8530. OnCompleted<bool>(310)
  8531. );
  8532. xs.Subscriptions.AssertEqual(
  8533. Subscribe(200, 310)
  8534. );
  8535. ys.Subscriptions.AssertEqual(
  8536. Subscribe(200, 310)
  8537. );
  8538. }
  8539. [Fact]
  8540. public void SequenceEqual_Observable_NotEqual_Right()
  8541. {
  8542. var scheduler = new TestScheduler();
  8543. var xs = scheduler.CreateHotObservable(
  8544. OnNext(110, 1),
  8545. OnNext(190, 2),
  8546. OnNext(240, 3),
  8547. OnNext(290, 4),
  8548. OnNext(310, 5),
  8549. OnNext(340, 6),
  8550. OnNext(450, 7),
  8551. OnCompleted<int>(510)
  8552. );
  8553. var ys = scheduler.CreateHotObservable(
  8554. OnNext(90, 1),
  8555. OnNext(270, 3),
  8556. OnNext(280, 4),
  8557. OnNext(300, 5),
  8558. OnNext(330, 6),
  8559. OnNext(340, 7),
  8560. OnNext(350, 8)
  8561. );
  8562. var res = scheduler.Start(() =>
  8563. xs.SequenceEqual(ys)
  8564. );
  8565. res.Messages.AssertEqual(
  8566. OnNext(510, false),
  8567. OnCompleted<bool>(510)
  8568. );
  8569. xs.Subscriptions.AssertEqual(
  8570. Subscribe(200, 510)
  8571. );
  8572. ys.Subscriptions.AssertEqual(
  8573. Subscribe(200, 510)
  8574. );
  8575. }
  8576. [Fact]
  8577. public void SequenceEqual_Observable_NotEqual_Right_Sym()
  8578. {
  8579. var scheduler = new TestScheduler();
  8580. var xs = scheduler.CreateHotObservable(
  8581. OnNext(110, 1),
  8582. OnNext(190, 2),
  8583. OnNext(240, 3),
  8584. OnNext(290, 4),
  8585. OnNext(310, 5),
  8586. OnNext(340, 6),
  8587. OnNext(450, 7),
  8588. OnCompleted<int>(510)
  8589. );
  8590. var ys = scheduler.CreateHotObservable(
  8591. OnNext(90, 1),
  8592. OnNext(270, 3),
  8593. OnNext(280, 4),
  8594. OnNext(300, 5),
  8595. OnNext(330, 6),
  8596. OnNext(340, 7),
  8597. OnNext(350, 8)
  8598. );
  8599. var res = scheduler.Start(() =>
  8600. ys.SequenceEqual(xs)
  8601. );
  8602. res.Messages.AssertEqual(
  8603. OnNext(510, false),
  8604. OnCompleted<bool>(510)
  8605. );
  8606. xs.Subscriptions.AssertEqual(
  8607. Subscribe(200, 510)
  8608. );
  8609. ys.Subscriptions.AssertEqual(
  8610. Subscribe(200, 510)
  8611. );
  8612. }
  8613. [Fact]
  8614. public void SequenceEqual_Observable_NotEqual_2()
  8615. {
  8616. var scheduler = new TestScheduler();
  8617. var xs = scheduler.CreateHotObservable(
  8618. OnNext(110, 1),
  8619. OnNext(190, 2),
  8620. OnNext(240, 3),
  8621. OnNext(290, 4),
  8622. OnNext(310, 5),
  8623. OnNext(340, 6),
  8624. OnNext(450, 7),
  8625. OnNext(490, 8),
  8626. OnNext(520, 9),
  8627. OnNext(580, 10),
  8628. OnNext(600, 11)
  8629. );
  8630. var ys = scheduler.CreateHotObservable(
  8631. OnNext(90, 1),
  8632. OnNext(270, 3),
  8633. OnNext(280, 4),
  8634. OnNext(300, 5),
  8635. OnNext(330, 6),
  8636. OnNext(340, 7),
  8637. OnNext(350, 9),
  8638. OnNext(400, 9),
  8639. OnNext(410, 10),
  8640. OnNext(490, 11),
  8641. OnNext(550, 12),
  8642. OnNext(560, 13)
  8643. );
  8644. var res = scheduler.Start(() =>
  8645. xs.SequenceEqual(ys)
  8646. );
  8647. res.Messages.AssertEqual(
  8648. OnNext(490, false),
  8649. OnCompleted<bool>(490)
  8650. );
  8651. xs.Subscriptions.AssertEqual(
  8652. Subscribe(200, 490)
  8653. );
  8654. ys.Subscriptions.AssertEqual(
  8655. Subscribe(200, 490)
  8656. );
  8657. }
  8658. [Fact]
  8659. public void SequenceEqual_Observable_NotEqual_2_Sym()
  8660. {
  8661. var scheduler = new TestScheduler();
  8662. var xs = scheduler.CreateHotObservable(
  8663. OnNext(110, 1),
  8664. OnNext(190, 2),
  8665. OnNext(240, 3),
  8666. OnNext(290, 4),
  8667. OnNext(310, 5),
  8668. OnNext(340, 6),
  8669. OnNext(450, 7),
  8670. OnNext(490, 8),
  8671. OnNext(520, 9),
  8672. OnNext(580, 10),
  8673. OnNext(600, 11)
  8674. );
  8675. var ys = scheduler.CreateHotObservable(
  8676. OnNext(90, 1),
  8677. OnNext(270, 3),
  8678. OnNext(280, 4),
  8679. OnNext(300, 5),
  8680. OnNext(330, 6),
  8681. OnNext(340, 7),
  8682. OnNext(350, 9),
  8683. OnNext(400, 9),
  8684. OnNext(410, 10),
  8685. OnNext(490, 11),
  8686. OnNext(550, 12),
  8687. OnNext(560, 13)
  8688. );
  8689. var res = scheduler.Start(() =>
  8690. ys.SequenceEqual(xs)
  8691. );
  8692. res.Messages.AssertEqual(
  8693. OnNext(490, false),
  8694. OnCompleted<bool>(490)
  8695. );
  8696. xs.Subscriptions.AssertEqual(
  8697. Subscribe(200, 490)
  8698. );
  8699. ys.Subscriptions.AssertEqual(
  8700. Subscribe(200, 490)
  8701. );
  8702. }
  8703. [Fact]
  8704. public void SequenceEqual_Observable_NotEqual_3()
  8705. {
  8706. var scheduler = new TestScheduler();
  8707. var xs = scheduler.CreateHotObservable(
  8708. OnNext(110, 1),
  8709. OnNext(190, 2),
  8710. OnNext(240, 3),
  8711. OnNext(290, 4),
  8712. OnNext(310, 5),
  8713. OnCompleted<int>(330)
  8714. );
  8715. var ys = scheduler.CreateHotObservable(
  8716. OnNext(90, 1),
  8717. OnNext(270, 3),
  8718. OnNext(400, 4),
  8719. OnCompleted<int>(420)
  8720. );
  8721. var res = scheduler.Start(() =>
  8722. xs.SequenceEqual(ys)
  8723. );
  8724. res.Messages.AssertEqual(
  8725. OnNext(420, false),
  8726. OnCompleted<bool>(420)
  8727. );
  8728. xs.Subscriptions.AssertEqual(
  8729. Subscribe(200, 420)
  8730. );
  8731. ys.Subscriptions.AssertEqual(
  8732. Subscribe(200, 420)
  8733. );
  8734. }
  8735. [Fact]
  8736. public void SequenceEqual_Observable_NotEqual_3_Sym()
  8737. {
  8738. var scheduler = new TestScheduler();
  8739. var xs = scheduler.CreateHotObservable(
  8740. OnNext(110, 1),
  8741. OnNext(190, 2),
  8742. OnNext(240, 3),
  8743. OnNext(290, 4),
  8744. OnNext(310, 5),
  8745. OnCompleted<int>(330)
  8746. );
  8747. var ys = scheduler.CreateHotObservable(
  8748. OnNext(90, 1),
  8749. OnNext(270, 3),
  8750. OnNext(400, 4),
  8751. OnCompleted<int>(420)
  8752. );
  8753. var res = scheduler.Start(() =>
  8754. ys.SequenceEqual(xs)
  8755. );
  8756. res.Messages.AssertEqual(
  8757. OnNext(420, false),
  8758. OnCompleted<bool>(420)
  8759. );
  8760. xs.Subscriptions.AssertEqual(
  8761. Subscribe(200, 420)
  8762. );
  8763. ys.Subscriptions.AssertEqual(
  8764. Subscribe(200, 420)
  8765. );
  8766. }
  8767. [Fact]
  8768. public void SequenceEqual_Observable_ComparerThrows()
  8769. {
  8770. var scheduler = new TestScheduler();
  8771. var xs = scheduler.CreateHotObservable(
  8772. OnNext(110, 1),
  8773. OnNext(190, 2),
  8774. OnNext(240, 3),
  8775. OnNext(290, 4),
  8776. OnNext(310, 5),
  8777. OnCompleted<int>(330)
  8778. );
  8779. var ys = scheduler.CreateHotObservable(
  8780. OnNext(90, 1),
  8781. OnNext(270, 3),
  8782. OnNext(400, 4),
  8783. OnCompleted<int>(420)
  8784. );
  8785. var ex = new Exception();
  8786. var res = scheduler.Start(() =>
  8787. xs.SequenceEqual(ys, new ThrowComparer(ex))
  8788. );
  8789. res.Messages.AssertEqual(
  8790. OnError<bool>(270, ex)
  8791. );
  8792. xs.Subscriptions.AssertEqual(
  8793. Subscribe(200, 270)
  8794. );
  8795. ys.Subscriptions.AssertEqual(
  8796. Subscribe(200, 270)
  8797. );
  8798. }
  8799. [Fact]
  8800. public void SequenceEqual_Observable_ComparerThrows_Sym()
  8801. {
  8802. var scheduler = new TestScheduler();
  8803. var xs = scheduler.CreateHotObservable(
  8804. OnNext(110, 1),
  8805. OnNext(190, 2),
  8806. OnNext(240, 3),
  8807. OnNext(290, 4),
  8808. OnNext(310, 5),
  8809. OnCompleted<int>(330)
  8810. );
  8811. var ys = scheduler.CreateHotObservable(
  8812. OnNext(90, 1),
  8813. OnNext(270, 3),
  8814. OnNext(400, 4),
  8815. OnCompleted<int>(420)
  8816. );
  8817. var ex = new Exception();
  8818. var res = scheduler.Start(() =>
  8819. ys.SequenceEqual(xs, new ThrowComparer(ex))
  8820. );
  8821. res.Messages.AssertEqual(
  8822. OnError<bool>(270, ex)
  8823. );
  8824. xs.Subscriptions.AssertEqual(
  8825. Subscribe(200, 270)
  8826. );
  8827. ys.Subscriptions.AssertEqual(
  8828. Subscribe(200, 270)
  8829. );
  8830. }
  8831. class ThrowComparer : IEqualityComparer<int>
  8832. {
  8833. private Exception _ex;
  8834. public ThrowComparer(Exception ex)
  8835. {
  8836. _ex = ex;
  8837. }
  8838. public bool Equals(int x, int y)
  8839. {
  8840. throw _ex;
  8841. }
  8842. public int GetHashCode(int obj)
  8843. {
  8844. throw new NotImplementedException();
  8845. }
  8846. }
  8847. [Fact]
  8848. public void SequenceEqual_Observable_NotEqual_4()
  8849. {
  8850. var scheduler = new TestScheduler();
  8851. var xs = scheduler.CreateHotObservable(
  8852. OnNext(250, 1),
  8853. OnCompleted<int>(300)
  8854. );
  8855. var ys = scheduler.CreateHotObservable(
  8856. OnNext(290, 1),
  8857. OnNext(310, 2),
  8858. OnCompleted<int>(350)
  8859. );
  8860. var res = scheduler.Start(() =>
  8861. xs.SequenceEqual(ys)
  8862. );
  8863. res.Messages.AssertEqual(
  8864. OnNext(310, false),
  8865. OnCompleted<bool>(310)
  8866. );
  8867. xs.Subscriptions.AssertEqual(
  8868. Subscribe(200, 310)
  8869. );
  8870. ys.Subscriptions.AssertEqual(
  8871. Subscribe(200, 310)
  8872. );
  8873. }
  8874. [Fact]
  8875. public void SequenceEqual_Observable_NotEqual_4_Sym()
  8876. {
  8877. var scheduler = new TestScheduler();
  8878. var xs = scheduler.CreateHotObservable(
  8879. OnNext(250, 1),
  8880. OnCompleted<int>(300)
  8881. );
  8882. var ys = scheduler.CreateHotObservable(
  8883. OnNext(290, 1),
  8884. OnNext(310, 2),
  8885. OnCompleted<int>(350)
  8886. );
  8887. var res = scheduler.Start(() =>
  8888. ys.SequenceEqual(xs)
  8889. );
  8890. res.Messages.AssertEqual(
  8891. OnNext(310, false),
  8892. OnCompleted<bool>(310)
  8893. );
  8894. xs.Subscriptions.AssertEqual(
  8895. Subscribe(200, 310)
  8896. );
  8897. ys.Subscriptions.AssertEqual(
  8898. Subscribe(200, 310)
  8899. );
  8900. }
  8901. [Fact]
  8902. public void SequenceEqual_Observable_Left_Throw()
  8903. {
  8904. var scheduler = new TestScheduler();
  8905. var ex = new Exception();
  8906. var xs = scheduler.CreateHotObservable(
  8907. OnNext(250, 1),
  8908. OnError<int>(300, ex)
  8909. );
  8910. var ys = scheduler.CreateHotObservable(
  8911. OnNext(290, 1),
  8912. OnNext(310, 2),
  8913. OnCompleted<int>(350)
  8914. );
  8915. var res = scheduler.Start(() =>
  8916. ys.SequenceEqual(xs)
  8917. );
  8918. res.Messages.AssertEqual(
  8919. OnError<bool>(300, ex)
  8920. );
  8921. xs.Subscriptions.AssertEqual(
  8922. Subscribe(200, 300)
  8923. );
  8924. ys.Subscriptions.AssertEqual(
  8925. Subscribe(200, 300)
  8926. );
  8927. }
  8928. [Fact]
  8929. public void SequenceEqual_Observable_Right_Throw()
  8930. {
  8931. var scheduler = new TestScheduler();
  8932. var ex = new Exception();
  8933. var xs = scheduler.CreateHotObservable(
  8934. OnNext(290, 1),
  8935. OnNext(310, 2),
  8936. OnCompleted<int>(350)
  8937. );
  8938. var ys = scheduler.CreateHotObservable(
  8939. OnNext(250, 1),
  8940. OnError<int>(300, ex)
  8941. );
  8942. var res = scheduler.Start(() =>
  8943. ys.SequenceEqual(xs)
  8944. );
  8945. res.Messages.AssertEqual(
  8946. OnError<bool>(300, ex)
  8947. );
  8948. xs.Subscriptions.AssertEqual(
  8949. Subscribe(200, 300)
  8950. );
  8951. ys.Subscriptions.AssertEqual(
  8952. Subscribe(200, 300)
  8953. );
  8954. }
  8955. [Fact]
  8956. public void SequenceEqual_Enumerable_Equal()
  8957. {
  8958. var scheduler = new TestScheduler();
  8959. var xs = scheduler.CreateHotObservable(
  8960. OnNext(110, 1),
  8961. OnNext(190, 2),
  8962. OnNext(240, 3),
  8963. OnNext(290, 4),
  8964. OnNext(310, 5),
  8965. OnNext(340, 6),
  8966. OnNext(450, 7),
  8967. OnCompleted<int>(510)
  8968. );
  8969. var res = scheduler.Start(() =>
  8970. xs.SequenceEqual(new[] { 3, 4, 5, 6, 7 })
  8971. );
  8972. res.Messages.AssertEqual(
  8973. OnNext(510, true),
  8974. OnCompleted<bool>(510)
  8975. );
  8976. xs.Subscriptions.AssertEqual(
  8977. Subscribe(200, 510)
  8978. );
  8979. }
  8980. [Fact]
  8981. public void SequenceEqual_Enumerable_NotEqual_Elements()
  8982. {
  8983. var scheduler = new TestScheduler();
  8984. var xs = scheduler.CreateHotObservable(
  8985. OnNext(110, 1),
  8986. OnNext(190, 2),
  8987. OnNext(240, 3),
  8988. OnNext(290, 4),
  8989. OnNext(310, 5),
  8990. OnNext(340, 6),
  8991. OnNext(450, 7),
  8992. OnCompleted<int>(510)
  8993. );
  8994. var res = scheduler.Start(() =>
  8995. xs.SequenceEqual(new[] { 3, 4, 9, 6, 7 })
  8996. );
  8997. res.Messages.AssertEqual(
  8998. OnNext(310, false),
  8999. OnCompleted<bool>(310)
  9000. );
  9001. xs.Subscriptions.AssertEqual(
  9002. Subscribe(200, 310)
  9003. );
  9004. }
  9005. [Fact]
  9006. public void SequenceEqual_Enumerable_Comparer_Equal()
  9007. {
  9008. var scheduler = new TestScheduler();
  9009. var xs = scheduler.CreateHotObservable(
  9010. OnNext(110, 1),
  9011. OnNext(190, 2),
  9012. OnNext(240, 3),
  9013. OnNext(290, 4),
  9014. OnNext(310, 5),
  9015. OnNext(340, 6),
  9016. OnNext(450, 7),
  9017. OnCompleted<int>(510)
  9018. );
  9019. var res = scheduler.Start(() =>
  9020. xs.SequenceEqual(new[] { 3 - 2, 4, 5, 6 + 42, 7 - 6 }, new OddEvenComparer())
  9021. );
  9022. res.Messages.AssertEqual(
  9023. OnNext(510, true),
  9024. OnCompleted<bool>(510)
  9025. );
  9026. xs.Subscriptions.AssertEqual(
  9027. Subscribe(200, 510)
  9028. );
  9029. }
  9030. [Fact]
  9031. public void SequenceEqual_Enumerable_Comparer_NotEqual()
  9032. {
  9033. var scheduler = new TestScheduler();
  9034. var xs = scheduler.CreateHotObservable(
  9035. OnNext(110, 1),
  9036. OnNext(190, 2),
  9037. OnNext(240, 3),
  9038. OnNext(290, 4),
  9039. OnNext(310, 5),
  9040. OnNext(340, 6),
  9041. OnNext(450, 7),
  9042. OnCompleted<int>(510)
  9043. );
  9044. var res = scheduler.Start(() =>
  9045. xs.SequenceEqual(new[] { 3 - 2, 4, 5 + 9, 6 + 42, 7 - 6 }, new OddEvenComparer())
  9046. );
  9047. res.Messages.AssertEqual(
  9048. OnNext(310, false),
  9049. OnCompleted<bool>(310)
  9050. );
  9051. xs.Subscriptions.AssertEqual(
  9052. Subscribe(200, 310)
  9053. );
  9054. }
  9055. class OddEvenComparer : IEqualityComparer<int>
  9056. {
  9057. public bool Equals(int x, int y)
  9058. {
  9059. return x % 2 == y % 2;
  9060. }
  9061. public int GetHashCode(int obj)
  9062. {
  9063. return (obj % 2).GetHashCode();
  9064. }
  9065. }
  9066. [Fact]
  9067. public void SequenceEqual_Enumerable_Comparer_Throws()
  9068. {
  9069. var scheduler = new TestScheduler();
  9070. var xs = scheduler.CreateHotObservable(
  9071. OnNext(110, 1),
  9072. OnNext(190, 2),
  9073. OnNext(240, 3),
  9074. OnNext(290, 4),
  9075. OnNext(310, 5),
  9076. OnNext(340, 6),
  9077. OnNext(450, 7),
  9078. OnCompleted<int>(510)
  9079. );
  9080. var ex = new Exception();
  9081. var res = scheduler.Start(() =>
  9082. xs.SequenceEqual(new[] { 3, 4, 5, 6, 7 }, new ThrowingComparer(5, ex))
  9083. );
  9084. res.Messages.AssertEqual(
  9085. OnError<bool>(310, ex)
  9086. );
  9087. xs.Subscriptions.AssertEqual(
  9088. Subscribe(200, 310)
  9089. );
  9090. }
  9091. class ThrowingComparer : IEqualityComparer<int>
  9092. {
  9093. private int _x;
  9094. private Exception _ex;
  9095. public ThrowingComparer(int x, Exception ex)
  9096. {
  9097. _x = x;
  9098. _ex = ex;
  9099. }
  9100. public bool Equals(int x, int y)
  9101. {
  9102. if (x == _x)
  9103. throw _ex;
  9104. return x == y;
  9105. }
  9106. public int GetHashCode(int obj)
  9107. {
  9108. return obj.GetHashCode();
  9109. }
  9110. }
  9111. [Fact]
  9112. public void SequenceEqual_Enumerable_NotEqual_TooLong()
  9113. {
  9114. var scheduler = new TestScheduler();
  9115. var xs = scheduler.CreateHotObservable(
  9116. OnNext(110, 1),
  9117. OnNext(190, 2),
  9118. OnNext(240, 3),
  9119. OnNext(290, 4),
  9120. OnNext(310, 5),
  9121. OnNext(340, 6),
  9122. OnNext(450, 7),
  9123. OnCompleted<int>(510)
  9124. );
  9125. var res = scheduler.Start(() =>
  9126. xs.SequenceEqual(new[] { 3, 4, 5, 6, 7, 8 })
  9127. );
  9128. res.Messages.AssertEqual(
  9129. OnNext(510, false),
  9130. OnCompleted<bool>(510)
  9131. );
  9132. xs.Subscriptions.AssertEqual(
  9133. Subscribe(200, 510)
  9134. );
  9135. }
  9136. [Fact]
  9137. public void SequenceEqual_Enumerable_NotEqual_TooShort()
  9138. {
  9139. var scheduler = new TestScheduler();
  9140. var xs = scheduler.CreateHotObservable(
  9141. OnNext(110, 1),
  9142. OnNext(190, 2),
  9143. OnNext(240, 3),
  9144. OnNext(290, 4),
  9145. OnNext(310, 5),
  9146. OnNext(340, 6),
  9147. OnNext(450, 7),
  9148. OnCompleted<int>(510)
  9149. );
  9150. var res = scheduler.Start(() =>
  9151. xs.SequenceEqual(new[] { 3, 4, 5, 6 })
  9152. );
  9153. res.Messages.AssertEqual(
  9154. OnNext(450, false),
  9155. OnCompleted<bool>(450)
  9156. );
  9157. xs.Subscriptions.AssertEqual(
  9158. Subscribe(200, 450)
  9159. );
  9160. }
  9161. [Fact]
  9162. public void SequenceEqual_Enumerable_OnError()
  9163. {
  9164. var ex = new Exception();
  9165. var scheduler = new TestScheduler();
  9166. var xs = scheduler.CreateHotObservable(
  9167. OnNext(110, 1),
  9168. OnNext(190, 2),
  9169. OnNext(240, 3),
  9170. OnNext(290, 4),
  9171. OnError<int>(310, ex)
  9172. );
  9173. var res = scheduler.Start(() =>
  9174. xs.SequenceEqual(new[] { 3, 4 })
  9175. );
  9176. res.Messages.AssertEqual(
  9177. OnError<bool>(310, ex)
  9178. );
  9179. xs.Subscriptions.AssertEqual(
  9180. Subscribe(200, 310)
  9181. );
  9182. }
  9183. [Fact]
  9184. public void SequenceEqual_Enumerable_IteratorThrows1()
  9185. {
  9186. var ex = new Exception();
  9187. var scheduler = new TestScheduler();
  9188. var xs = scheduler.CreateHotObservable(
  9189. OnNext(110, 1),
  9190. OnNext(190, 2),
  9191. OnNext(240, 3),
  9192. OnNext(290, 4),
  9193. OnCompleted<int>(310)
  9194. );
  9195. var res = scheduler.Start(() =>
  9196. xs.SequenceEqual(Throw(ex))
  9197. );
  9198. res.Messages.AssertEqual(
  9199. OnError<bool>(290, ex)
  9200. );
  9201. xs.Subscriptions.AssertEqual(
  9202. Subscribe(200, 290)
  9203. );
  9204. }
  9205. [Fact]
  9206. public void SequenceEqual_Enumerable_IteratorThrows2()
  9207. {
  9208. var ex = new Exception();
  9209. var scheduler = new TestScheduler();
  9210. var xs = scheduler.CreateHotObservable(
  9211. OnNext(110, 1),
  9212. OnNext(190, 2),
  9213. OnNext(240, 3),
  9214. OnCompleted<int>(310)
  9215. );
  9216. var res = scheduler.Start(() =>
  9217. xs.SequenceEqual(Throw(ex))
  9218. );
  9219. res.Messages.AssertEqual(
  9220. OnError<bool>(310, ex)
  9221. );
  9222. xs.Subscriptions.AssertEqual(
  9223. Subscribe(200, 310)
  9224. );
  9225. }
  9226. private IEnumerable<int> Throw(Exception ex)
  9227. {
  9228. yield return 3;
  9229. throw ex;
  9230. }
  9231. [Fact]
  9232. public void SequenceEqual_Enumerable_GetEnumeratorThrows()
  9233. {
  9234. var ex = new Exception();
  9235. var scheduler = new TestScheduler();
  9236. var xs = scheduler.CreateHotObservable(
  9237. OnNext(110, 1),
  9238. OnNext(190, 2),
  9239. OnNext(240, 3),
  9240. OnCompleted<int>(310)
  9241. );
  9242. var res = scheduler.Start(() =>
  9243. xs.SequenceEqual(new RogueEnumerable<int>(ex))
  9244. );
  9245. res.Messages.AssertEqual(
  9246. OnError<bool>(200, ex)
  9247. );
  9248. xs.Subscriptions.AssertEqual(
  9249. );
  9250. }
  9251. #endregion
  9252. #region + SingleAsync +
  9253. [Fact]
  9254. public void SingleAsync_ArgumentChecking()
  9255. {
  9256. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleAsync(default(IObservable<int>)));
  9257. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleAsync(default(IObservable<int>), _ => true));
  9258. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
  9259. }
  9260. [Fact]
  9261. public void SingleAsync_Empty()
  9262. {
  9263. var scheduler = new TestScheduler();
  9264. var xs = scheduler.CreateHotObservable(
  9265. OnNext(150, 1),
  9266. OnCompleted<int>(250)
  9267. );
  9268. var res = scheduler.Start(() =>
  9269. xs.SingleAsync()
  9270. );
  9271. res.Messages.AssertEqual(
  9272. OnError<int>(250, e => e is InvalidOperationException)
  9273. );
  9274. xs.Subscriptions.AssertEqual(
  9275. Subscribe(200, 250)
  9276. );
  9277. }
  9278. [Fact]
  9279. public void SingleAsync_One()
  9280. {
  9281. var scheduler = new TestScheduler();
  9282. var xs = scheduler.CreateHotObservable(
  9283. OnNext(150, 1),
  9284. OnNext(210, 2),
  9285. OnCompleted<int>(250)
  9286. );
  9287. var res = scheduler.Start(() =>
  9288. xs.SingleAsync()
  9289. );
  9290. res.Messages.AssertEqual(
  9291. OnNext(250, 2),
  9292. OnCompleted<int>(250)
  9293. );
  9294. xs.Subscriptions.AssertEqual(
  9295. Subscribe(200, 250)
  9296. );
  9297. }
  9298. [Fact]
  9299. public void SingleAsync_Many()
  9300. {
  9301. var scheduler = new TestScheduler();
  9302. var xs = scheduler.CreateHotObservable(
  9303. OnNext(150, 1),
  9304. OnNext(210, 2),
  9305. OnNext(220, 3),
  9306. OnCompleted<int>(250)
  9307. );
  9308. var res = scheduler.Start(() =>
  9309. xs.SingleAsync()
  9310. );
  9311. res.Messages.AssertEqual(
  9312. OnError<int>(220, e => e is InvalidOperationException)
  9313. );
  9314. xs.Subscriptions.AssertEqual(
  9315. Subscribe(200, 220)
  9316. );
  9317. }
  9318. [Fact]
  9319. public void SingleAsync_Error()
  9320. {
  9321. var scheduler = new TestScheduler();
  9322. var ex = new Exception();
  9323. var xs = scheduler.CreateHotObservable(
  9324. OnNext(150, 1),
  9325. OnError<int>(210, ex)
  9326. );
  9327. var res = scheduler.Start(() =>
  9328. xs.SingleAsync()
  9329. );
  9330. res.Messages.AssertEqual(
  9331. OnError<int>(210, ex)
  9332. );
  9333. xs.Subscriptions.AssertEqual(
  9334. Subscribe(200, 210)
  9335. );
  9336. }
  9337. [Fact]
  9338. public void SingleAsync_Predicate()
  9339. {
  9340. var scheduler = new TestScheduler();
  9341. var xs = scheduler.CreateHotObservable(
  9342. OnNext(150, 1),
  9343. OnNext(210, 2),
  9344. OnNext(220, 3),
  9345. OnNext(230, 4),
  9346. OnNext(240, 5),
  9347. OnCompleted<int>(250)
  9348. );
  9349. var res = scheduler.Start(() =>
  9350. xs.SingleAsync(x => x % 2 == 1)
  9351. );
  9352. res.Messages.AssertEqual(
  9353. OnError<int>(240, e => e is InvalidOperationException)
  9354. );
  9355. xs.Subscriptions.AssertEqual(
  9356. Subscribe(200, 240)
  9357. );
  9358. }
  9359. [Fact]
  9360. public void SingleAsync_Predicate_Empty()
  9361. {
  9362. var scheduler = new TestScheduler();
  9363. var ex = new Exception();
  9364. var xs = scheduler.CreateHotObservable(
  9365. OnNext(150, 1),
  9366. OnCompleted<int>(250)
  9367. );
  9368. var res = scheduler.Start(() =>
  9369. xs.SingleAsync(x => x % 2 == 1)
  9370. );
  9371. res.Messages.AssertEqual(
  9372. OnError<int>(250, e => e is InvalidOperationException)
  9373. );
  9374. xs.Subscriptions.AssertEqual(
  9375. Subscribe(200, 250)
  9376. );
  9377. }
  9378. [Fact]
  9379. public void SingleAsync_Predicate_One()
  9380. {
  9381. var scheduler = new TestScheduler();
  9382. var xs = scheduler.CreateHotObservable(
  9383. OnNext(150, 1),
  9384. OnNext(210, 2),
  9385. OnNext(220, 3),
  9386. OnNext(230, 4),
  9387. OnNext(240, 5),
  9388. OnCompleted<int>(250)
  9389. );
  9390. var res = scheduler.Start(() =>
  9391. xs.SingleAsync(x => x == 4)
  9392. );
  9393. res.Messages.AssertEqual(
  9394. OnNext(250, 4),
  9395. OnCompleted<int>(250)
  9396. );
  9397. xs.Subscriptions.AssertEqual(
  9398. Subscribe(200, 250)
  9399. );
  9400. }
  9401. [Fact]
  9402. public void SingleAsync_Predicate_Throw()
  9403. {
  9404. var scheduler = new TestScheduler();
  9405. var ex = new Exception();
  9406. var xs = scheduler.CreateHotObservable(
  9407. OnNext(150, 1),
  9408. OnError<int>(210, ex)
  9409. );
  9410. var res = scheduler.Start(() =>
  9411. xs.SingleAsync(x => x > 10)
  9412. );
  9413. res.Messages.AssertEqual(
  9414. OnError<int>(210, ex)
  9415. );
  9416. xs.Subscriptions.AssertEqual(
  9417. Subscribe(200, 210)
  9418. );
  9419. }
  9420. [Fact]
  9421. public void SingleAsync_PredicateThrows()
  9422. {
  9423. var scheduler = new TestScheduler();
  9424. var ex = new Exception();
  9425. var xs = scheduler.CreateHotObservable(
  9426. OnNext(150, 1),
  9427. OnNext(210, 2),
  9428. OnNext(220, 3),
  9429. OnNext(230, 4),
  9430. OnNext(240, 5),
  9431. OnCompleted<int>(250)
  9432. );
  9433. var res = scheduler.Start(() =>
  9434. xs.SingleAsync(x => { if (x < 4) return false; throw ex; })
  9435. );
  9436. res.Messages.AssertEqual(
  9437. OnError<int>(230, ex)
  9438. );
  9439. xs.Subscriptions.AssertEqual(
  9440. Subscribe(200, 230)
  9441. );
  9442. }
  9443. #endregion
  9444. #region + SingleOrDefaultAsync +
  9445. [Fact]
  9446. public void SingleOrDefaultAsync_ArgumentChecking()
  9447. {
  9448. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleOrDefaultAsync(default(IObservable<int>)));
  9449. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleOrDefaultAsync(default(IObservable<int>), _ => true));
  9450. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SingleOrDefaultAsync(DummyObservable<int>.Instance, default(Func<int, bool>)));
  9451. }
  9452. [Fact]
  9453. public void SingleOrDefaultAsync_Empty()
  9454. {
  9455. var scheduler = new TestScheduler();
  9456. var xs = scheduler.CreateHotObservable(
  9457. OnNext(150, 1),
  9458. OnCompleted<int>(250)
  9459. );
  9460. var res = scheduler.Start(() =>
  9461. xs.SingleOrDefaultAsync()
  9462. );
  9463. res.Messages.AssertEqual(
  9464. OnNext(250, 0),
  9465. OnCompleted<int>(250)
  9466. );
  9467. xs.Subscriptions.AssertEqual(
  9468. Subscribe(200, 250)
  9469. );
  9470. }
  9471. [Fact]
  9472. public void SingleOrDefaultAsync_One()
  9473. {
  9474. var scheduler = new TestScheduler();
  9475. var xs = scheduler.CreateHotObservable(
  9476. OnNext(150, 1),
  9477. OnNext(210, 2),
  9478. OnCompleted<int>(250)
  9479. );
  9480. var res = scheduler.Start(() =>
  9481. xs.SingleOrDefaultAsync()
  9482. );
  9483. res.Messages.AssertEqual(
  9484. OnNext(250, 2),
  9485. OnCompleted<int>(250)
  9486. );
  9487. xs.Subscriptions.AssertEqual(
  9488. Subscribe(200, 250)
  9489. );
  9490. }
  9491. [Fact]
  9492. public void SingleOrDefaultAsync_Many()
  9493. {
  9494. var scheduler = new TestScheduler();
  9495. var xs = scheduler.CreateHotObservable(
  9496. OnNext(150, 1),
  9497. OnNext(210, 2),
  9498. OnNext(220, 3),
  9499. OnCompleted<int>(250)
  9500. );
  9501. var res = scheduler.Start(() =>
  9502. xs.SingleOrDefaultAsync()
  9503. );
  9504. res.Messages.AssertEqual(
  9505. OnError<int>(220, e => e is InvalidOperationException)
  9506. );
  9507. xs.Subscriptions.AssertEqual(
  9508. Subscribe(200, 220)
  9509. );
  9510. }
  9511. [Fact]
  9512. public void SingleOrDefaultAsync_Error()
  9513. {
  9514. var scheduler = new TestScheduler();
  9515. var ex = new Exception();
  9516. var xs = scheduler.CreateHotObservable(
  9517. OnNext(150, 1),
  9518. OnError<int>(210, ex)
  9519. );
  9520. var res = scheduler.Start(() =>
  9521. xs.SingleOrDefaultAsync()
  9522. );
  9523. res.Messages.AssertEqual(
  9524. OnError<int>(210, ex)
  9525. );
  9526. xs.Subscriptions.AssertEqual(
  9527. Subscribe(200, 210)
  9528. );
  9529. }
  9530. [Fact]
  9531. public void SingleOrDefaultAsync_Predicate()
  9532. {
  9533. var scheduler = new TestScheduler();
  9534. var ex = new Exception();
  9535. var xs = scheduler.CreateHotObservable(
  9536. OnNext(150, 1),
  9537. OnNext(210, 2),
  9538. OnNext(220, 3),
  9539. OnNext(230, 4),
  9540. OnNext(240, 5),
  9541. OnCompleted<int>(250)
  9542. );
  9543. var res = scheduler.Start(() =>
  9544. xs.SingleOrDefaultAsync(x => x % 2 == 1)
  9545. );
  9546. res.Messages.AssertEqual(
  9547. OnError<int>(240, e => e is InvalidOperationException)
  9548. );
  9549. xs.Subscriptions.AssertEqual(
  9550. Subscribe(200, 240)
  9551. );
  9552. }
  9553. [Fact]
  9554. public void SingleOrDefaultAsync_Predicate_Empty()
  9555. {
  9556. var scheduler = new TestScheduler();
  9557. var ex = new Exception();
  9558. var xs = scheduler.CreateHotObservable(
  9559. OnNext(150, 1),
  9560. OnCompleted<int>(250)
  9561. );
  9562. var res = scheduler.Start(() =>
  9563. xs.SingleOrDefaultAsync(x => x % 2 == 1)
  9564. );
  9565. res.Messages.AssertEqual(
  9566. OnNext(250, 0),
  9567. OnCompleted<int>(250)
  9568. );
  9569. xs.Subscriptions.AssertEqual(
  9570. Subscribe(200, 250)
  9571. );
  9572. }
  9573. [Fact]
  9574. public void SingleOrDefaultAsync_Predicate_One()
  9575. {
  9576. var scheduler = new TestScheduler();
  9577. var ex = new Exception();
  9578. var xs = scheduler.CreateHotObservable(
  9579. OnNext(150, 1),
  9580. OnNext(210, 2),
  9581. OnNext(220, 3),
  9582. OnNext(230, 4),
  9583. OnNext(240, 5),
  9584. OnCompleted<int>(250)
  9585. );
  9586. var res = scheduler.Start(() =>
  9587. xs.SingleOrDefaultAsync(x => x == 4)
  9588. );
  9589. res.Messages.AssertEqual(
  9590. OnNext(250, 4),
  9591. OnCompleted<int>(250)
  9592. );
  9593. xs.Subscriptions.AssertEqual(
  9594. Subscribe(200, 250)
  9595. );
  9596. }
  9597. [Fact]
  9598. public void SingleOrDefaultAsync_Predicate_None()
  9599. {
  9600. var scheduler = new TestScheduler();
  9601. var ex = new Exception();
  9602. var xs = scheduler.CreateHotObservable(
  9603. OnNext(150, 1),
  9604. OnNext(210, 2),
  9605. OnNext(220, 3),
  9606. OnNext(230, 4),
  9607. OnNext(240, 5),
  9608. OnCompleted<int>(250)
  9609. );
  9610. var res = scheduler.Start(() =>
  9611. xs.SingleOrDefaultAsync(x => x > 10)
  9612. );
  9613. res.Messages.AssertEqual(
  9614. OnNext(250, 0),
  9615. OnCompleted<int>(250)
  9616. );
  9617. xs.Subscriptions.AssertEqual(
  9618. Subscribe(200, 250)
  9619. );
  9620. }
  9621. [Fact]
  9622. public void SingleOrDefaultAsync_Predicate_Throw()
  9623. {
  9624. var scheduler = new TestScheduler();
  9625. var ex = new Exception();
  9626. var xs = scheduler.CreateHotObservable(
  9627. OnNext(150, 1),
  9628. OnError<int>(210, ex)
  9629. );
  9630. var res = scheduler.Start(() =>
  9631. xs.SingleOrDefaultAsync(x => x > 10)
  9632. );
  9633. res.Messages.AssertEqual(
  9634. OnError<int>(210, ex)
  9635. );
  9636. xs.Subscriptions.AssertEqual(
  9637. Subscribe(200, 210)
  9638. );
  9639. }
  9640. [Fact]
  9641. public void SingleOrDefaultAsync_PredicateThrows()
  9642. {
  9643. var scheduler = new TestScheduler();
  9644. var ex = new Exception();
  9645. var xs = scheduler.CreateHotObservable(
  9646. OnNext(150, 1),
  9647. OnNext(210, 2),
  9648. OnNext(220, 3),
  9649. OnNext(230, 4),
  9650. OnNext(240, 5),
  9651. OnCompleted<int>(250)
  9652. );
  9653. var res = scheduler.Start(() =>
  9654. xs.SingleOrDefaultAsync(x => { if (x < 4) return false; throw ex; })
  9655. );
  9656. res.Messages.AssertEqual(
  9657. OnError<int>(230, ex)
  9658. );
  9659. xs.Subscriptions.AssertEqual(
  9660. Subscribe(200, 230)
  9661. );
  9662. }
  9663. #endregion
  9664. #region + Sum +
  9665. [Fact]
  9666. public void Sum_ArgumentChecking()
  9667. {
  9668. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<int>)));
  9669. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<double>)));
  9670. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<float>)));
  9671. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<decimal>)));
  9672. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<long>)));
  9673. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<int?>)));
  9674. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<double?>)));
  9675. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<float?>)));
  9676. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<decimal?>)));
  9677. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<long?>)));
  9678. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(int)));
  9679. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(double)));
  9680. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(float)));
  9681. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(decimal)));
  9682. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(long)));
  9683. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(int?)));
  9684. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(double?)));
  9685. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(float?)));
  9686. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(decimal?)));
  9687. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(default(IObservable<DateTime>), _ => default(long?)));
  9688. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, int>)));
  9689. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, double>)));
  9690. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, float>)));
  9691. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, decimal>)));
  9692. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, long>)));
  9693. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, int?>)));
  9694. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, double?>)));
  9695. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, float?>)));
  9696. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, decimal?>)));
  9697. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Sum(Observable.Empty<DateTime>(), default(Func<DateTime, long?>)));
  9698. }
  9699. [Fact]
  9700. public void Sum_Int32_Empty()
  9701. {
  9702. var scheduler = new TestScheduler();
  9703. var xs = scheduler.CreateHotObservable(
  9704. OnNext(150, 1),
  9705. OnCompleted<int>(250)
  9706. );
  9707. var res = scheduler.Start(() =>
  9708. xs.Sum()
  9709. );
  9710. res.Messages.AssertEqual(
  9711. OnNext(250, 0),
  9712. OnCompleted<int>(250)
  9713. );
  9714. xs.Subscriptions.AssertEqual(
  9715. Subscribe(200, 250)
  9716. );
  9717. }
  9718. [Fact]
  9719. public void Sum_Int32_Return()
  9720. {
  9721. var scheduler = new TestScheduler();
  9722. var xs = scheduler.CreateHotObservable(
  9723. OnNext(150, 1),
  9724. OnNext(210, 2),
  9725. OnCompleted<int>(250)
  9726. );
  9727. var res = scheduler.Start(() =>
  9728. xs.Sum()
  9729. );
  9730. res.Messages.AssertEqual(
  9731. OnNext(250, 2),
  9732. OnCompleted<int>(250)
  9733. );
  9734. xs.Subscriptions.AssertEqual(
  9735. Subscribe(200, 250)
  9736. );
  9737. }
  9738. [Fact]
  9739. public void Sum_Int32_Some()
  9740. {
  9741. var scheduler = new TestScheduler();
  9742. var xs = scheduler.CreateHotObservable(
  9743. OnNext(150, 1),
  9744. OnNext(210, 2),
  9745. OnNext(220, 3),
  9746. OnNext(230, 4),
  9747. OnCompleted<int>(250)
  9748. );
  9749. var res = scheduler.Start(() =>
  9750. xs.Sum()
  9751. );
  9752. res.Messages.AssertEqual(
  9753. OnNext(250, 2 + 3 + 4),
  9754. OnCompleted<int>(250)
  9755. );
  9756. xs.Subscriptions.AssertEqual(
  9757. Subscribe(200, 250)
  9758. );
  9759. }
  9760. [Fact]
  9761. public void Sum_Int32_Overflow()
  9762. {
  9763. var scheduler = new TestScheduler();
  9764. var xs = scheduler.CreateHotObservable(
  9765. OnNext(150, 1),
  9766. OnNext(210, int.MaxValue),
  9767. OnNext(220, 1),
  9768. OnCompleted<int>(250)
  9769. );
  9770. var res = scheduler.Start(() =>
  9771. xs.Sum()
  9772. );
  9773. res.Messages.AssertEqual(
  9774. OnError<int>(220, e => e is OverflowException)
  9775. );
  9776. xs.Subscriptions.AssertEqual(
  9777. Subscribe(200, 220)
  9778. );
  9779. }
  9780. [Fact]
  9781. public void Sum_Int32_Throw()
  9782. {
  9783. var ex = new Exception();
  9784. var scheduler = new TestScheduler();
  9785. var xs = scheduler.CreateHotObservable(
  9786. OnNext(150, 1),
  9787. OnError<int>(210, ex)
  9788. );
  9789. var res = scheduler.Start(() =>
  9790. xs.Sum()
  9791. );
  9792. res.Messages.AssertEqual(
  9793. OnError<int>(210, ex)
  9794. );
  9795. xs.Subscriptions.AssertEqual(
  9796. Subscribe(200, 210)
  9797. );
  9798. }
  9799. [Fact]
  9800. public void Sum_Int32_Never()
  9801. {
  9802. var ex = new Exception();
  9803. var scheduler = new TestScheduler();
  9804. var xs = scheduler.CreateHotObservable(
  9805. OnNext(150, 1)
  9806. );
  9807. var res = scheduler.Start(() =>
  9808. xs.Sum()
  9809. );
  9810. res.Messages.AssertEqual(
  9811. );
  9812. xs.Subscriptions.AssertEqual(
  9813. Subscribe(200, 1000)
  9814. );
  9815. }
  9816. [Fact]
  9817. public void Sum_Int64_Empty()
  9818. {
  9819. var scheduler = new TestScheduler();
  9820. var xs = scheduler.CreateHotObservable(
  9821. OnNext(150, 1L),
  9822. OnCompleted<long>(250)
  9823. );
  9824. var res = scheduler.Start(() =>
  9825. xs.Sum()
  9826. );
  9827. res.Messages.AssertEqual(
  9828. OnNext(250, 0L),
  9829. OnCompleted<long>(250)
  9830. );
  9831. xs.Subscriptions.AssertEqual(
  9832. Subscribe(200, 250)
  9833. );
  9834. }
  9835. [Fact]
  9836. public void Sum_Int64_Return()
  9837. {
  9838. var scheduler = new TestScheduler();
  9839. var xs = scheduler.CreateHotObservable(
  9840. OnNext(150, 1L),
  9841. OnNext(210, 2L),
  9842. OnCompleted<long>(250)
  9843. );
  9844. var res = scheduler.Start(() =>
  9845. xs.Sum()
  9846. );
  9847. res.Messages.AssertEqual(
  9848. OnNext(250, 2L),
  9849. OnCompleted<long>(250)
  9850. );
  9851. xs.Subscriptions.AssertEqual(
  9852. Subscribe(200, 250)
  9853. );
  9854. }
  9855. [Fact]
  9856. public void Sum_Int64_Some()
  9857. {
  9858. var scheduler = new TestScheduler();
  9859. var xs = scheduler.CreateHotObservable(
  9860. OnNext(150, 1L),
  9861. OnNext(210, 2L),
  9862. OnNext(220, 3L),
  9863. OnNext(230, 4L),
  9864. OnCompleted<long>(250)
  9865. );
  9866. var res = scheduler.Start(() =>
  9867. xs.Sum()
  9868. );
  9869. res.Messages.AssertEqual(
  9870. OnNext(250, 2L + 3L + 4L),
  9871. OnCompleted<long>(250)
  9872. );
  9873. xs.Subscriptions.AssertEqual(
  9874. Subscribe(200, 250)
  9875. );
  9876. }
  9877. [Fact]
  9878. public void Sum_Int64_Overflow()
  9879. {
  9880. var scheduler = new TestScheduler();
  9881. var xs = scheduler.CreateHotObservable(
  9882. OnNext(150, 1L),
  9883. OnNext(210, long.MaxValue),
  9884. OnNext(220, 1L),
  9885. OnCompleted<long>(250)
  9886. );
  9887. var res = scheduler.Start(() =>
  9888. xs.Sum()
  9889. );
  9890. res.Messages.AssertEqual(
  9891. OnError<long>(220, e => e is OverflowException)
  9892. );
  9893. xs.Subscriptions.AssertEqual(
  9894. Subscribe(200, 220)
  9895. );
  9896. }
  9897. [Fact]
  9898. public void Sum_Int64_Throw()
  9899. {
  9900. var ex = new Exception();
  9901. var scheduler = new TestScheduler();
  9902. var xs = scheduler.CreateHotObservable(
  9903. OnNext(150, 1L),
  9904. OnError<long>(210, ex)
  9905. );
  9906. var res = scheduler.Start(() =>
  9907. xs.Sum()
  9908. );
  9909. res.Messages.AssertEqual(
  9910. OnError<long>(210, ex)
  9911. );
  9912. xs.Subscriptions.AssertEqual(
  9913. Subscribe(200, 210)
  9914. );
  9915. }
  9916. [Fact]
  9917. public void Sum_Int64_Never()
  9918. {
  9919. var ex = new Exception();
  9920. var scheduler = new TestScheduler();
  9921. var xs = scheduler.CreateHotObservable(
  9922. OnNext(150, 1L)
  9923. );
  9924. var res = scheduler.Start(() =>
  9925. xs.Sum()
  9926. );
  9927. res.Messages.AssertEqual(
  9928. );
  9929. xs.Subscriptions.AssertEqual(
  9930. Subscribe(200, 1000)
  9931. );
  9932. }
  9933. [Fact]
  9934. public void Sum_Float_Empty()
  9935. {
  9936. var scheduler = new TestScheduler();
  9937. var xs = scheduler.CreateHotObservable(
  9938. OnNext(150, 1f),
  9939. OnCompleted<float>(250)
  9940. );
  9941. var res = scheduler.Start(() =>
  9942. xs.Sum()
  9943. );
  9944. res.Messages.AssertEqual(
  9945. OnNext(250, 0f),
  9946. OnCompleted<float>(250)
  9947. );
  9948. xs.Subscriptions.AssertEqual(
  9949. Subscribe(200, 250)
  9950. );
  9951. }
  9952. [Fact]
  9953. public void Sum_Float_Return()
  9954. {
  9955. var scheduler = new TestScheduler();
  9956. var xs = scheduler.CreateHotObservable(
  9957. OnNext(150, 1f),
  9958. OnNext(210, 2f),
  9959. OnCompleted<float>(250)
  9960. );
  9961. var res = scheduler.Start(() =>
  9962. xs.Sum()
  9963. );
  9964. res.Messages.AssertEqual(
  9965. OnNext(250, 2f),
  9966. OnCompleted<float>(250)
  9967. );
  9968. xs.Subscriptions.AssertEqual(
  9969. Subscribe(200, 250)
  9970. );
  9971. }
  9972. [Fact]
  9973. public void Sum_Float_Some()
  9974. {
  9975. var scheduler = new TestScheduler();
  9976. var xs = scheduler.CreateHotObservable(
  9977. OnNext(150, 1f),
  9978. OnNext(210, 2f),
  9979. OnNext(220, 3f),
  9980. OnNext(230, 4f),
  9981. OnCompleted<float>(250)
  9982. );
  9983. var res = scheduler.Start(() =>
  9984. xs.Sum()
  9985. );
  9986. res.Messages.AssertEqual(
  9987. OnNext(250, 2f + 3f + 4f),
  9988. OnCompleted<float>(250)
  9989. );
  9990. xs.Subscriptions.AssertEqual(
  9991. Subscribe(200, 250)
  9992. );
  9993. }
  9994. [Fact]
  9995. public void Sum_Float_Throw()
  9996. {
  9997. var ex = new Exception();
  9998. var scheduler = new TestScheduler();
  9999. var xs = scheduler.CreateHotObservable(
  10000. OnNext(150, 1f),
  10001. OnError<float>(210, ex)
  10002. );
  10003. var res = scheduler.Start(() =>
  10004. xs.Sum()
  10005. );
  10006. res.Messages.AssertEqual(
  10007. OnError<float>(210, ex)
  10008. );
  10009. xs.Subscriptions.AssertEqual(
  10010. Subscribe(200, 210)
  10011. );
  10012. }
  10013. [Fact]
  10014. public void Sum_Float_Never()
  10015. {
  10016. var ex = new Exception();
  10017. var scheduler = new TestScheduler();
  10018. var xs = scheduler.CreateHotObservable(
  10019. OnNext(150, 1f)
  10020. );
  10021. var res = scheduler.Start(() =>
  10022. xs.Sum()
  10023. );
  10024. res.Messages.AssertEqual(
  10025. );
  10026. xs.Subscriptions.AssertEqual(
  10027. Subscribe(200, 1000)
  10028. );
  10029. }
  10030. [Fact]
  10031. public void Sum_Double_Empty()
  10032. {
  10033. var scheduler = new TestScheduler();
  10034. var xs = scheduler.CreateHotObservable(
  10035. OnNext(150, 1.0),
  10036. OnCompleted<double>(250)
  10037. );
  10038. var res = scheduler.Start(() =>
  10039. xs.Sum()
  10040. );
  10041. res.Messages.AssertEqual(
  10042. OnNext(250, 0.0),
  10043. OnCompleted<double>(250)
  10044. );
  10045. xs.Subscriptions.AssertEqual(
  10046. Subscribe(200, 250)
  10047. );
  10048. }
  10049. [Fact]
  10050. public void Sum_Double_Return()
  10051. {
  10052. var scheduler = new TestScheduler();
  10053. var xs = scheduler.CreateHotObservable(
  10054. OnNext(150, 1.0),
  10055. OnNext(210, 2.0),
  10056. OnCompleted<double>(250)
  10057. );
  10058. var res = scheduler.Start(() =>
  10059. xs.Sum()
  10060. );
  10061. res.Messages.AssertEqual(
  10062. OnNext(250, 2.0),
  10063. OnCompleted<double>(250)
  10064. );
  10065. xs.Subscriptions.AssertEqual(
  10066. Subscribe(200, 250)
  10067. );
  10068. }
  10069. [Fact]
  10070. public void Sum_Double_Some()
  10071. {
  10072. var scheduler = new TestScheduler();
  10073. var xs = scheduler.CreateHotObservable(
  10074. OnNext(150, 1.0),
  10075. OnNext(210, 2.0),
  10076. OnNext(220, 3.0),
  10077. OnNext(230, 4.0),
  10078. OnCompleted<double>(250)
  10079. );
  10080. var res = scheduler.Start(() =>
  10081. xs.Sum()
  10082. );
  10083. res.Messages.AssertEqual(
  10084. OnNext(250, 2.0 + 3.0 + 4.0),
  10085. OnCompleted<double>(250)
  10086. );
  10087. xs.Subscriptions.AssertEqual(
  10088. Subscribe(200, 250)
  10089. );
  10090. }
  10091. [Fact]
  10092. public void Sum_Double_Throw()
  10093. {
  10094. var ex = new Exception();
  10095. var scheduler = new TestScheduler();
  10096. var xs = scheduler.CreateHotObservable(
  10097. OnNext(150, 1.0),
  10098. OnError<double>(210, ex)
  10099. );
  10100. var res = scheduler.Start(() =>
  10101. xs.Sum()
  10102. );
  10103. res.Messages.AssertEqual(
  10104. OnError<double>(210, ex)
  10105. );
  10106. xs.Subscriptions.AssertEqual(
  10107. Subscribe(200, 210)
  10108. );
  10109. }
  10110. [Fact]
  10111. public void Sum_Double_Never()
  10112. {
  10113. var ex = new Exception();
  10114. var scheduler = new TestScheduler();
  10115. var xs = scheduler.CreateHotObservable(
  10116. OnNext(150, 1.0)
  10117. );
  10118. var res = scheduler.Start(() =>
  10119. xs.Sum()
  10120. );
  10121. res.Messages.AssertEqual(
  10122. );
  10123. xs.Subscriptions.AssertEqual(
  10124. Subscribe(200, 1000)
  10125. );
  10126. }
  10127. [Fact]
  10128. public void Sum_Decimal_Empty()
  10129. {
  10130. var scheduler = new TestScheduler();
  10131. var xs = scheduler.CreateHotObservable(
  10132. OnNext(150, 1m),
  10133. OnCompleted<decimal>(250)
  10134. );
  10135. var res = scheduler.Start(() =>
  10136. xs.Sum()
  10137. );
  10138. res.Messages.AssertEqual(
  10139. OnNext(250, 0m),
  10140. OnCompleted<decimal>(250)
  10141. );
  10142. xs.Subscriptions.AssertEqual(
  10143. Subscribe(200, 250)
  10144. );
  10145. }
  10146. [Fact]
  10147. public void Sum_Decimal_Return()
  10148. {
  10149. var scheduler = new TestScheduler();
  10150. var xs = scheduler.CreateHotObservable(
  10151. OnNext(150, 1m),
  10152. OnNext(210, 2m),
  10153. OnCompleted<decimal>(250)
  10154. );
  10155. var res = scheduler.Start(() =>
  10156. xs.Sum()
  10157. );
  10158. res.Messages.AssertEqual(
  10159. OnNext(250, 2m),
  10160. OnCompleted<decimal>(250)
  10161. );
  10162. xs.Subscriptions.AssertEqual(
  10163. Subscribe(200, 250)
  10164. );
  10165. }
  10166. [Fact]
  10167. public void Sum_Decimal_Some()
  10168. {
  10169. var scheduler = new TestScheduler();
  10170. var xs = scheduler.CreateHotObservable(
  10171. OnNext(150, 1m),
  10172. OnNext(210, 2m),
  10173. OnNext(220, 3m),
  10174. OnNext(230, 4m),
  10175. OnCompleted<decimal>(250)
  10176. );
  10177. var res = scheduler.Start(() =>
  10178. xs.Sum()
  10179. );
  10180. res.Messages.AssertEqual(
  10181. OnNext(250, 2m + 3m + 4m),
  10182. OnCompleted<decimal>(250)
  10183. );
  10184. xs.Subscriptions.AssertEqual(
  10185. Subscribe(200, 250)
  10186. );
  10187. }
  10188. [Fact]
  10189. public void Sum_Decimal_Throw()
  10190. {
  10191. var ex = new Exception();
  10192. var scheduler = new TestScheduler();
  10193. var xs = scheduler.CreateHotObservable(
  10194. OnNext(150, 1m),
  10195. OnError<decimal>(210, ex)
  10196. );
  10197. var res = scheduler.Start(() =>
  10198. xs.Sum()
  10199. );
  10200. res.Messages.AssertEqual(
  10201. OnError<decimal>(210, ex)
  10202. );
  10203. xs.Subscriptions.AssertEqual(
  10204. Subscribe(200, 210)
  10205. );
  10206. }
  10207. [Fact]
  10208. public void Sum_Decimal_Never()
  10209. {
  10210. var ex = new Exception();
  10211. var scheduler = new TestScheduler();
  10212. var xs = scheduler.CreateHotObservable(
  10213. OnNext(150, 1m)
  10214. );
  10215. var res = scheduler.Start(() =>
  10216. xs.Sum()
  10217. );
  10218. res.Messages.AssertEqual(
  10219. );
  10220. xs.Subscriptions.AssertEqual(
  10221. Subscribe(200, 1000)
  10222. );
  10223. }
  10224. [Fact]
  10225. public void Sum_Nullable_Int32_Empty()
  10226. {
  10227. var scheduler = new TestScheduler();
  10228. var xs = scheduler.CreateHotObservable(
  10229. OnNext(150, (int?)1),
  10230. OnCompleted<int?>(250)
  10231. );
  10232. var res = scheduler.Start(() =>
  10233. xs.Sum()
  10234. );
  10235. res.Messages.AssertEqual(
  10236. OnNext(250, (int?)0),
  10237. OnCompleted<int?>(250)
  10238. );
  10239. xs.Subscriptions.AssertEqual(
  10240. Subscribe(200, 250)
  10241. );
  10242. }
  10243. [Fact]
  10244. public void Sum_Nullable_Int32_Return()
  10245. {
  10246. var scheduler = new TestScheduler();
  10247. var xs = scheduler.CreateHotObservable(
  10248. OnNext(150, (int?)1),
  10249. OnNext(210, (int?)2),
  10250. OnCompleted<int?>(250)
  10251. );
  10252. var res = scheduler.Start(() =>
  10253. xs.Sum()
  10254. );
  10255. res.Messages.AssertEqual(
  10256. OnNext(250, (int?)2),
  10257. OnCompleted<int?>(250)
  10258. );
  10259. xs.Subscriptions.AssertEqual(
  10260. Subscribe(200, 250)
  10261. );
  10262. }
  10263. [Fact]
  10264. public void Sum_Nullable_Int32_Some()
  10265. {
  10266. var scheduler = new TestScheduler();
  10267. var xs = scheduler.CreateHotObservable(
  10268. OnNext(150, (int?)1),
  10269. OnNext(210, (int?)2),
  10270. OnNext(220, (int?)null),
  10271. OnNext(230, (int?)4),
  10272. OnCompleted<int?>(250)
  10273. );
  10274. var res = scheduler.Start(() =>
  10275. xs.Sum()
  10276. );
  10277. res.Messages.AssertEqual(
  10278. OnNext(250, (int?)(2 + 4)),
  10279. OnCompleted<int?>(250)
  10280. );
  10281. xs.Subscriptions.AssertEqual(
  10282. Subscribe(200, 250)
  10283. );
  10284. }
  10285. [Fact]
  10286. public void Sum_Nullable_Int32_Overflow()
  10287. {
  10288. var scheduler = new TestScheduler();
  10289. var xs = scheduler.CreateHotObservable(
  10290. OnNext(150, (int?)1),
  10291. OnNext(210, (int?)int.MaxValue),
  10292. OnNext(220, (int?)1),
  10293. OnCompleted<int?>(250)
  10294. );
  10295. var res = scheduler.Start(() =>
  10296. xs.Sum()
  10297. );
  10298. res.Messages.AssertEqual(
  10299. OnError<int?>(220, e => e is OverflowException)
  10300. );
  10301. xs.Subscriptions.AssertEqual(
  10302. Subscribe(200, 220)
  10303. );
  10304. }
  10305. [Fact]
  10306. public void Sum_Nullable_Int32_Throw()
  10307. {
  10308. var ex = new Exception();
  10309. var scheduler = new TestScheduler();
  10310. var xs = scheduler.CreateHotObservable(
  10311. OnNext(150, (int?)1),
  10312. OnError<int?>(210, ex)
  10313. );
  10314. var res = scheduler.Start(() =>
  10315. xs.Sum()
  10316. );
  10317. res.Messages.AssertEqual(
  10318. OnError<int?>(210, ex)
  10319. );
  10320. xs.Subscriptions.AssertEqual(
  10321. Subscribe(200, 210)
  10322. );
  10323. }
  10324. [Fact]
  10325. public void Sum_Nullable_Int32_Never()
  10326. {
  10327. var ex = new Exception();
  10328. var scheduler = new TestScheduler();
  10329. var xs = scheduler.CreateHotObservable(
  10330. OnNext(150, (int?)1)
  10331. );
  10332. var res = scheduler.Start(() =>
  10333. xs.Sum()
  10334. );
  10335. res.Messages.AssertEqual(
  10336. );
  10337. xs.Subscriptions.AssertEqual(
  10338. Subscribe(200, 1000)
  10339. );
  10340. }
  10341. [Fact]
  10342. public void Sum_Nullable_Int64_Empty()
  10343. {
  10344. var scheduler = new TestScheduler();
  10345. var xs = scheduler.CreateHotObservable(
  10346. OnNext(150, (long?)1L),
  10347. OnCompleted<long?>(250)
  10348. );
  10349. var res = scheduler.Start(() =>
  10350. xs.Sum()
  10351. );
  10352. res.Messages.AssertEqual(
  10353. OnNext(250, (long?)0L),
  10354. OnCompleted<long?>(250)
  10355. );
  10356. xs.Subscriptions.AssertEqual(
  10357. Subscribe(200, 250)
  10358. );
  10359. }
  10360. [Fact]
  10361. public void Sum_Nullable_Int64_Return()
  10362. {
  10363. var scheduler = new TestScheduler();
  10364. var xs = scheduler.CreateHotObservable(
  10365. OnNext(150, (long?)1L),
  10366. OnNext(210, (long?)2L),
  10367. OnCompleted<long?>(250)
  10368. );
  10369. var res = scheduler.Start(() =>
  10370. xs.Sum()
  10371. );
  10372. res.Messages.AssertEqual(
  10373. OnNext(250, (long?)2L),
  10374. OnCompleted<long?>(250)
  10375. );
  10376. xs.Subscriptions.AssertEqual(
  10377. Subscribe(200, 250)
  10378. );
  10379. }
  10380. [Fact]
  10381. public void Sum_Nullable_Int64_Some()
  10382. {
  10383. var scheduler = new TestScheduler();
  10384. var xs = scheduler.CreateHotObservable(
  10385. OnNext(150, (long?)1L),
  10386. OnNext(210, (long?)2L),
  10387. OnNext(220, (long?)null),
  10388. OnNext(230, (long?)4L),
  10389. OnCompleted<long?>(250)
  10390. );
  10391. var res = scheduler.Start(() =>
  10392. xs.Sum()
  10393. );
  10394. res.Messages.AssertEqual(
  10395. OnNext(250, (long?)(2L + 4L)),
  10396. OnCompleted<long?>(250)
  10397. );
  10398. xs.Subscriptions.AssertEqual(
  10399. Subscribe(200, 250)
  10400. );
  10401. }
  10402. [Fact]
  10403. public void Sum_Nullable_Int64_Overflow()
  10404. {
  10405. var scheduler = new TestScheduler();
  10406. var xs = scheduler.CreateHotObservable(
  10407. OnNext(150, (long?)1L),
  10408. OnNext(210, (long?)long.MaxValue),
  10409. OnNext(220, (long?)1L),
  10410. OnCompleted<long?>(250)
  10411. );
  10412. var res = scheduler.Start(() =>
  10413. xs.Sum()
  10414. );
  10415. res.Messages.AssertEqual(
  10416. OnError<long?>(220, e => e is OverflowException)
  10417. );
  10418. xs.Subscriptions.AssertEqual(
  10419. Subscribe(200, 220)
  10420. );
  10421. }
  10422. [Fact]
  10423. public void Sum_Nullable_Int64_Throw()
  10424. {
  10425. var ex = new Exception();
  10426. var scheduler = new TestScheduler();
  10427. var xs = scheduler.CreateHotObservable(
  10428. OnNext(150, (long?)1L),
  10429. OnError<long?>(210, ex)
  10430. );
  10431. var res = scheduler.Start(() =>
  10432. xs.Sum()
  10433. );
  10434. res.Messages.AssertEqual(
  10435. OnError<long?>(210, ex)
  10436. );
  10437. xs.Subscriptions.AssertEqual(
  10438. Subscribe(200, 210)
  10439. );
  10440. }
  10441. [Fact]
  10442. public void Sum_Nullable_Int64_Never()
  10443. {
  10444. var ex = new Exception();
  10445. var scheduler = new TestScheduler();
  10446. var xs = scheduler.CreateHotObservable(
  10447. OnNext(150, (long?)1L)
  10448. );
  10449. var res = scheduler.Start(() =>
  10450. xs.Sum()
  10451. );
  10452. res.Messages.AssertEqual(
  10453. );
  10454. xs.Subscriptions.AssertEqual(
  10455. Subscribe(200, 1000)
  10456. );
  10457. }
  10458. [Fact]
  10459. public void Sum_Nullable_Float_Empty()
  10460. {
  10461. var scheduler = new TestScheduler();
  10462. var xs = scheduler.CreateHotObservable(
  10463. OnNext(150, (float?)1f),
  10464. OnCompleted<float?>(250)
  10465. );
  10466. var res = scheduler.Start(() =>
  10467. xs.Sum()
  10468. );
  10469. res.Messages.AssertEqual(
  10470. OnNext(250, (float?)0f),
  10471. OnCompleted<float?>(250)
  10472. );
  10473. xs.Subscriptions.AssertEqual(
  10474. Subscribe(200, 250)
  10475. );
  10476. }
  10477. [Fact]
  10478. public void Sum_Nullable_Float_Return()
  10479. {
  10480. var scheduler = new TestScheduler();
  10481. var xs = scheduler.CreateHotObservable(
  10482. OnNext(150, (float?)1f),
  10483. OnNext(210, (float?)2f),
  10484. OnCompleted<float?>(250)
  10485. );
  10486. var res = scheduler.Start(() =>
  10487. xs.Sum()
  10488. );
  10489. res.Messages.AssertEqual(
  10490. OnNext(250, (float?)2f),
  10491. OnCompleted<float?>(250)
  10492. );
  10493. xs.Subscriptions.AssertEqual(
  10494. Subscribe(200, 250)
  10495. );
  10496. }
  10497. [Fact]
  10498. public void Sum_Nullable_Float_Some()
  10499. {
  10500. var scheduler = new TestScheduler();
  10501. var xs = scheduler.CreateHotObservable(
  10502. OnNext(150, (float?)1f),
  10503. OnNext(210, (float?)2f),
  10504. OnNext(220, (float?)null),
  10505. OnNext(230, (float?)4f),
  10506. OnCompleted<float?>(250)
  10507. );
  10508. var res = scheduler.Start(() =>
  10509. xs.Sum()
  10510. );
  10511. res.Messages.AssertEqual(
  10512. OnNext(250, (float?)(2f + 4f)),
  10513. OnCompleted<float?>(250)
  10514. );
  10515. xs.Subscriptions.AssertEqual(
  10516. Subscribe(200, 250)
  10517. );
  10518. }
  10519. [Fact]
  10520. public void Sum_Nullable_Float_Throw()
  10521. {
  10522. var ex = new Exception();
  10523. var scheduler = new TestScheduler();
  10524. var xs = scheduler.CreateHotObservable(
  10525. OnNext(150, (float?)1f),
  10526. OnError<float?>(210, ex)
  10527. );
  10528. var res = scheduler.Start(() =>
  10529. xs.Sum()
  10530. );
  10531. res.Messages.AssertEqual(
  10532. OnError<float?>(210, ex)
  10533. );
  10534. xs.Subscriptions.AssertEqual(
  10535. Subscribe(200, 210)
  10536. );
  10537. }
  10538. [Fact]
  10539. public void Sum_Nullable_Float_Never()
  10540. {
  10541. var ex = new Exception();
  10542. var scheduler = new TestScheduler();
  10543. var xs = scheduler.CreateHotObservable(
  10544. OnNext(150, (float?)1f)
  10545. );
  10546. var res = scheduler.Start(() =>
  10547. xs.Sum()
  10548. );
  10549. res.Messages.AssertEqual(
  10550. );
  10551. xs.Subscriptions.AssertEqual(
  10552. Subscribe(200, 1000)
  10553. );
  10554. }
  10555. [Fact]
  10556. public void Sum_Nullable_Double_Empty()
  10557. {
  10558. var scheduler = new TestScheduler();
  10559. var xs = scheduler.CreateHotObservable(
  10560. OnNext(150, (double?)1.0),
  10561. OnCompleted<double?>(250)
  10562. );
  10563. var res = scheduler.Start(() =>
  10564. xs.Sum()
  10565. );
  10566. res.Messages.AssertEqual(
  10567. OnNext(250, (double?)0.0),
  10568. OnCompleted<double?>(250)
  10569. );
  10570. xs.Subscriptions.AssertEqual(
  10571. Subscribe(200, 250)
  10572. );
  10573. }
  10574. [Fact]
  10575. public void Sum_Nullable_Double_Return()
  10576. {
  10577. var scheduler = new TestScheduler();
  10578. var xs = scheduler.CreateHotObservable(
  10579. OnNext(150, (double?)1.0),
  10580. OnNext(210, (double?)2.0),
  10581. OnCompleted<double?>(250)
  10582. );
  10583. var res = scheduler.Start(() =>
  10584. xs.Sum()
  10585. );
  10586. res.Messages.AssertEqual(
  10587. OnNext(250, (double?)2.0),
  10588. OnCompleted<double?>(250)
  10589. );
  10590. xs.Subscriptions.AssertEqual(
  10591. Subscribe(200, 250)
  10592. );
  10593. }
  10594. [Fact]
  10595. public void Sum_Nullable_Double_Some()
  10596. {
  10597. var scheduler = new TestScheduler();
  10598. var xs = scheduler.CreateHotObservable(
  10599. OnNext(150, (double?)1.0),
  10600. OnNext(210, (double?)2.0),
  10601. OnNext(220, (double?)null),
  10602. OnNext(230, (double?)4.0),
  10603. OnCompleted<double?>(250)
  10604. );
  10605. var res = scheduler.Start(() =>
  10606. xs.Sum()
  10607. );
  10608. res.Messages.AssertEqual(
  10609. OnNext(250, (double?)(2.0 + 4.0)),
  10610. OnCompleted<double?>(250)
  10611. );
  10612. xs.Subscriptions.AssertEqual(
  10613. Subscribe(200, 250)
  10614. );
  10615. }
  10616. [Fact]
  10617. public void Sum_Nullable_Double_Throw()
  10618. {
  10619. var ex = new Exception();
  10620. var scheduler = new TestScheduler();
  10621. var xs = scheduler.CreateHotObservable(
  10622. OnNext(150, (double?)1.0),
  10623. OnError<double?>(210, ex)
  10624. );
  10625. var res = scheduler.Start(() =>
  10626. xs.Sum()
  10627. );
  10628. res.Messages.AssertEqual(
  10629. OnError<double?>(210, ex)
  10630. );
  10631. xs.Subscriptions.AssertEqual(
  10632. Subscribe(200, 210)
  10633. );
  10634. }
  10635. [Fact]
  10636. public void Sum_Nullable_Double_Never()
  10637. {
  10638. var ex = new Exception();
  10639. var scheduler = new TestScheduler();
  10640. var xs = scheduler.CreateHotObservable(
  10641. OnNext(150, (double?)1.0)
  10642. );
  10643. var res = scheduler.Start(() =>
  10644. xs.Sum()
  10645. );
  10646. res.Messages.AssertEqual(
  10647. );
  10648. xs.Subscriptions.AssertEqual(
  10649. Subscribe(200, 1000)
  10650. );
  10651. }
  10652. [Fact]
  10653. public void Sum_Nullable_Decimal_Empty()
  10654. {
  10655. var scheduler = new TestScheduler();
  10656. var xs = scheduler.CreateHotObservable(
  10657. OnNext(150, (decimal?)1m),
  10658. OnCompleted<decimal?>(250)
  10659. );
  10660. var res = scheduler.Start(() =>
  10661. xs.Sum()
  10662. );
  10663. res.Messages.AssertEqual(
  10664. OnNext(250, (decimal?)0m),
  10665. OnCompleted<decimal?>(250)
  10666. );
  10667. xs.Subscriptions.AssertEqual(
  10668. Subscribe(200, 250)
  10669. );
  10670. }
  10671. [Fact]
  10672. public void Sum_Nullable_Decimal_Return()
  10673. {
  10674. var scheduler = new TestScheduler();
  10675. var xs = scheduler.CreateHotObservable(
  10676. OnNext(150, (decimal?)1m),
  10677. OnNext(210, (decimal?)2m),
  10678. OnCompleted<decimal?>(250)
  10679. );
  10680. var res = scheduler.Start(() =>
  10681. xs.Sum()
  10682. );
  10683. res.Messages.AssertEqual(
  10684. OnNext(250, (decimal?)2m),
  10685. OnCompleted<decimal?>(250)
  10686. );
  10687. xs.Subscriptions.AssertEqual(
  10688. Subscribe(200, 250)
  10689. );
  10690. }
  10691. [Fact]
  10692. public void Sum_Nullable_Decimal_Some()
  10693. {
  10694. var scheduler = new TestScheduler();
  10695. var xs = scheduler.CreateHotObservable(
  10696. OnNext(150, (decimal?)1m),
  10697. OnNext(210, (decimal?)2m),
  10698. OnNext(220, (decimal?)null),
  10699. OnNext(230, (decimal?)4m),
  10700. OnCompleted<decimal?>(250)
  10701. );
  10702. var res = scheduler.Start(() =>
  10703. xs.Sum()
  10704. );
  10705. res.Messages.AssertEqual(
  10706. OnNext(250, (decimal?)(2m + 4m)),
  10707. OnCompleted<decimal?>(250)
  10708. );
  10709. xs.Subscriptions.AssertEqual(
  10710. Subscribe(200, 250)
  10711. );
  10712. }
  10713. [Fact]
  10714. public void Sum_Nullable_Decimal_Throw()
  10715. {
  10716. var ex = new Exception();
  10717. var scheduler = new TestScheduler();
  10718. var xs = scheduler.CreateHotObservable(
  10719. OnNext(150, (decimal?)1m),
  10720. OnError<decimal?>(210, ex)
  10721. );
  10722. var res = scheduler.Start(() =>
  10723. xs.Sum()
  10724. );
  10725. res.Messages.AssertEqual(
  10726. OnError<decimal?>(210, ex)
  10727. );
  10728. xs.Subscriptions.AssertEqual(
  10729. Subscribe(200, 210)
  10730. );
  10731. }
  10732. [Fact]
  10733. public void Sum_Nullable_Decimal_Never()
  10734. {
  10735. var ex = new Exception();
  10736. var scheduler = new TestScheduler();
  10737. var xs = scheduler.CreateHotObservable(
  10738. OnNext(150, (decimal?)1m)
  10739. );
  10740. var res = scheduler.Start(() =>
  10741. xs.Sum()
  10742. );
  10743. res.Messages.AssertEqual(
  10744. );
  10745. xs.Subscriptions.AssertEqual(
  10746. Subscribe(200, 1000)
  10747. );
  10748. }
  10749. [Fact]
  10750. public void Sum_Selector_Regular_Int32()
  10751. {
  10752. var scheduler = new TestScheduler();
  10753. var xs = scheduler.CreateHotObservable<string>(
  10754. OnNext(210, "fo"),
  10755. OnNext(220, "b"),
  10756. OnNext(230, "qux"),
  10757. OnCompleted<string>(240)
  10758. );
  10759. var res = scheduler.Start(() => xs.Sum(x => (int)x.Length));
  10760. res.Messages.AssertEqual(
  10761. OnNext(240, 6),
  10762. OnCompleted<int>(240)
  10763. );
  10764. xs.Subscriptions.AssertEqual(
  10765. Subscribe(200, 240)
  10766. );
  10767. }
  10768. [Fact]
  10769. public void Sum_Selector_Regular_Int64()
  10770. {
  10771. var scheduler = new TestScheduler();
  10772. var xs = scheduler.CreateHotObservable<string>(
  10773. OnNext(210, "fo"),
  10774. OnNext(220, "b"),
  10775. OnNext(230, "qux"),
  10776. OnCompleted<string>(240)
  10777. );
  10778. var res = scheduler.Start(() => xs.Sum(x => (long)x.Length));
  10779. res.Messages.AssertEqual(
  10780. OnNext(240, 6L),
  10781. OnCompleted<long>(240)
  10782. );
  10783. xs.Subscriptions.AssertEqual(
  10784. Subscribe(200, 240)
  10785. );
  10786. }
  10787. [Fact]
  10788. public void Sum_Selector_Regular_Single()
  10789. {
  10790. var scheduler = new TestScheduler();
  10791. var xs = scheduler.CreateHotObservable<string>(
  10792. OnNext(210, "fo"),
  10793. OnNext(220, "b"),
  10794. OnNext(230, "qux"),
  10795. OnCompleted<string>(240)
  10796. );
  10797. var res = scheduler.Start(() => xs.Sum(x => (float)x.Length));
  10798. res.Messages.AssertEqual(
  10799. OnNext(240, 6.0f),
  10800. OnCompleted<float>(240)
  10801. );
  10802. xs.Subscriptions.AssertEqual(
  10803. Subscribe(200, 240)
  10804. );
  10805. }
  10806. [Fact]
  10807. public void Sum_Selector_Regular_Double()
  10808. {
  10809. var scheduler = new TestScheduler();
  10810. var xs = scheduler.CreateHotObservable<string>(
  10811. OnNext(210, "fo"),
  10812. OnNext(220, "b"),
  10813. OnNext(230, "qux"),
  10814. OnCompleted<string>(240)
  10815. );
  10816. var res = scheduler.Start(() => xs.Sum(x => (double)x.Length));
  10817. res.Messages.AssertEqual(
  10818. OnNext(240, 6.0),
  10819. OnCompleted<double>(240)
  10820. );
  10821. xs.Subscriptions.AssertEqual(
  10822. Subscribe(200, 240)
  10823. );
  10824. }
  10825. [Fact]
  10826. public void Sum_Selector_Regular_Decimal()
  10827. {
  10828. var scheduler = new TestScheduler();
  10829. var xs = scheduler.CreateHotObservable<string>(
  10830. OnNext(210, "fo"),
  10831. OnNext(220, "b"),
  10832. OnNext(230, "qux"),
  10833. OnCompleted<string>(240)
  10834. );
  10835. var res = scheduler.Start(() => xs.Sum(x => (decimal)x.Length));
  10836. res.Messages.AssertEqual(
  10837. OnNext(240, 6.0m),
  10838. OnCompleted<decimal>(240)
  10839. );
  10840. xs.Subscriptions.AssertEqual(
  10841. Subscribe(200, 240)
  10842. );
  10843. }
  10844. [Fact]
  10845. public void Sum_Selector_Regular_Int32_Nullable()
  10846. {
  10847. var scheduler = new TestScheduler();
  10848. var xs = scheduler.CreateHotObservable<string>(
  10849. OnNext(210, "fo"),
  10850. OnNext(220, "b"),
  10851. OnNext(230, "qux"),
  10852. OnCompleted<string>(240)
  10853. );
  10854. var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(int?) : x.Length));
  10855. res.Messages.AssertEqual(
  10856. OnNext(240, (int?)4),
  10857. OnCompleted<int?>(240)
  10858. );
  10859. xs.Subscriptions.AssertEqual(
  10860. Subscribe(200, 240)
  10861. );
  10862. }
  10863. [Fact]
  10864. public void Sum_Selector_Regular_Int64_Nullable()
  10865. {
  10866. var scheduler = new TestScheduler();
  10867. var xs = scheduler.CreateHotObservable<string>(
  10868. OnNext(210, "fo"),
  10869. OnNext(220, "b"),
  10870. OnNext(230, "qux"),
  10871. OnCompleted<string>(240)
  10872. );
  10873. var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(long?) : x.Length));
  10874. res.Messages.AssertEqual(
  10875. OnNext(240, (long?)4.0),
  10876. OnCompleted<long?>(240)
  10877. );
  10878. xs.Subscriptions.AssertEqual(
  10879. Subscribe(200, 240)
  10880. );
  10881. }
  10882. [Fact]
  10883. public void Sum_Selector_Regular_Single_Nullable()
  10884. {
  10885. var scheduler = new TestScheduler();
  10886. var xs = scheduler.CreateHotObservable<string>(
  10887. OnNext(210, "fo"),
  10888. OnNext(220, "b"),
  10889. OnNext(230, "qux"),
  10890. OnCompleted<string>(240)
  10891. );
  10892. var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(float?) : x.Length));
  10893. res.Messages.AssertEqual(
  10894. OnNext(240, (float?)4.0),
  10895. OnCompleted<float?>(240)
  10896. );
  10897. xs.Subscriptions.AssertEqual(
  10898. Subscribe(200, 240)
  10899. );
  10900. }
  10901. [Fact]
  10902. public void Sum_Selector_Regular_Double_Nullable()
  10903. {
  10904. var scheduler = new TestScheduler();
  10905. var xs = scheduler.CreateHotObservable<string>(
  10906. OnNext(210, "fo"),
  10907. OnNext(220, "b"),
  10908. OnNext(230, "qux"),
  10909. OnCompleted<string>(240)
  10910. );
  10911. var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(double?) : x.Length));
  10912. res.Messages.AssertEqual(
  10913. OnNext(240, (double?)4.0),
  10914. OnCompleted<double?>(240)
  10915. );
  10916. xs.Subscriptions.AssertEqual(
  10917. Subscribe(200, 240)
  10918. );
  10919. }
  10920. [Fact]
  10921. public void Sum_Selector_Regular_Decimal_Nullable()
  10922. {
  10923. var scheduler = new TestScheduler();
  10924. var xs = scheduler.CreateHotObservable<string>(
  10925. OnNext(210, "fo"),
  10926. OnNext(220, "b"),
  10927. OnNext(230, "qux"),
  10928. OnCompleted<string>(240)
  10929. );
  10930. var res = scheduler.Start(() => xs.Sum(x => x == "fo" ? default(decimal?) : x.Length));
  10931. res.Messages.AssertEqual(
  10932. OnNext(240, (decimal?)4.0),
  10933. OnCompleted<decimal?>(240)
  10934. );
  10935. xs.Subscriptions.AssertEqual(
  10936. Subscribe(200, 240)
  10937. );
  10938. }
  10939. #endregion
  10940. #region + ToArray +
  10941. [Fact]
  10942. public void ToArray_ArgumentChecking()
  10943. {
  10944. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToArray<int>(null));
  10945. }
  10946. [Fact]
  10947. public void ToArray_Completed()
  10948. {
  10949. var scheduler = new TestScheduler();
  10950. var xs = scheduler.CreateHotObservable(
  10951. OnNext(110, 1),
  10952. OnNext(220, 2),
  10953. OnNext(330, 3),
  10954. OnNext(440, 4),
  10955. OnNext(550, 5),
  10956. OnCompleted<int>(660)
  10957. );
  10958. var res = scheduler.Start(() =>
  10959. xs.ToArray()
  10960. );
  10961. res.Messages.AssertEqual(
  10962. OnNext<int[]>(660, a => a.SequenceEqual(new[] { 2, 3, 4, 5 })),
  10963. OnCompleted<int[]>(660)
  10964. );
  10965. xs.Subscriptions.AssertEqual(
  10966. Subscribe(200, 660)
  10967. );
  10968. }
  10969. [Fact]
  10970. public void ToArray_Error()
  10971. {
  10972. var scheduler = new TestScheduler();
  10973. var ex = new Exception();
  10974. var xs = scheduler.CreateHotObservable(
  10975. OnNext(110, 1),
  10976. OnNext(220, 2),
  10977. OnNext(330, 3),
  10978. OnNext(440, 4),
  10979. OnNext(550, 5),
  10980. OnError<int>(660, ex)
  10981. );
  10982. var res = scheduler.Start(() =>
  10983. xs.ToArray()
  10984. );
  10985. res.Messages.AssertEqual(
  10986. OnError<int[]>(660, ex)
  10987. );
  10988. xs.Subscriptions.AssertEqual(
  10989. Subscribe(200, 660)
  10990. );
  10991. }
  10992. [Fact]
  10993. public void ToArray_Disposed()
  10994. {
  10995. var scheduler = new TestScheduler();
  10996. var xs = scheduler.CreateHotObservable(
  10997. OnNext(110, 1),
  10998. OnNext(220, 2),
  10999. OnNext(330, 3),
  11000. OnNext(440, 4),
  11001. OnNext(550, 5)
  11002. );
  11003. var res = scheduler.Start(() =>
  11004. xs.ToArray()
  11005. );
  11006. res.Messages.AssertEqual(
  11007. );
  11008. xs.Subscriptions.AssertEqual(
  11009. Subscribe(200, 1000)
  11010. );
  11011. }
  11012. #endregion
  11013. #region + ToDictionary +
  11014. [Fact]
  11015. public void ToDictionary_ArgumentChecking()
  11016. {
  11017. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int>(null, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
  11018. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int>(DummyObservable<int>.Instance, null, EqualityComparer<int>.Default));
  11019. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null));
  11020. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int>(null, DummyFunc<int, int>.Instance));
  11021. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int>(DummyObservable<int>.Instance, null));
  11022. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(null, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
  11023. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, null, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
  11024. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null, EqualityComparer<int>.Default));
  11025. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, null));
  11026. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(null, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance));
  11027. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, null, DummyFunc<int, int>.Instance));
  11028. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToDictionary<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null));
  11029. }
  11030. [Fact]
  11031. public void ToDictionary_Completed()
  11032. {
  11033. var scheduler = new TestScheduler();
  11034. var xs = scheduler.CreateHotObservable(
  11035. OnNext(110, 1),
  11036. OnNext(220, 2),
  11037. OnNext(330, 3),
  11038. OnNext(440, 4),
  11039. OnNext(550, 5),
  11040. OnCompleted<int>(660)
  11041. );
  11042. var res = scheduler.Start(() =>
  11043. xs.ToDictionary(x => x * 2, x => x * 4, EqualityComparer<int>.Default)
  11044. );
  11045. res.Messages.AssertEqual(
  11046. OnNext<IDictionary<int, int>>(660, d =>
  11047. {
  11048. return d.Count == 4
  11049. && d[4] == 8
  11050. && d[6] == 12
  11051. && d[8] == 16
  11052. && d[10] == 20;
  11053. }),
  11054. OnCompleted<IDictionary<int, int>>(660)
  11055. );
  11056. xs.Subscriptions.AssertEqual(
  11057. Subscribe(200, 660)
  11058. );
  11059. }
  11060. [Fact]
  11061. public void ToDictionary_Error()
  11062. {
  11063. var scheduler = new TestScheduler();
  11064. var ex = new Exception();
  11065. var xs = scheduler.CreateHotObservable(
  11066. OnNext(110, 1),
  11067. OnNext(220, 2),
  11068. OnNext(330, 3),
  11069. OnNext(440, 4),
  11070. OnNext(550, 5),
  11071. OnError<int>(660, ex)
  11072. );
  11073. var res = scheduler.Start(() =>
  11074. xs.ToDictionary(x => x * 2, x => x * 4, EqualityComparer<int>.Default)
  11075. );
  11076. res.Messages.AssertEqual(
  11077. OnError<IDictionary<int, int>>(660, ex)
  11078. );
  11079. xs.Subscriptions.AssertEqual(
  11080. Subscribe(200, 660)
  11081. );
  11082. }
  11083. [Fact]
  11084. public void ToDictionary_KeySelectorThrows()
  11085. {
  11086. var scheduler = new TestScheduler();
  11087. var ex = new Exception();
  11088. var xs = scheduler.CreateHotObservable(
  11089. OnNext(110, 1),
  11090. OnNext(220, 2),
  11091. OnNext(330, 3),
  11092. OnNext(440, 4),
  11093. OnNext(550, 5),
  11094. OnCompleted<int>(600)
  11095. );
  11096. var res = scheduler.Start(() =>
  11097. xs.ToDictionary(x => { if (x < 4) return x * 2; throw ex; }, x => x * 4, EqualityComparer<int>.Default)
  11098. );
  11099. res.Messages.AssertEqual(
  11100. OnError<IDictionary<int, int>>(440, ex)
  11101. );
  11102. xs.Subscriptions.AssertEqual(
  11103. Subscribe(200, 440)
  11104. );
  11105. }
  11106. [Fact]
  11107. public void ToDictionary_ElementSelectorThrows()
  11108. {
  11109. var scheduler = new TestScheduler();
  11110. var ex = new Exception();
  11111. var xs = scheduler.CreateHotObservable(
  11112. OnNext(110, 1),
  11113. OnNext(220, 2),
  11114. OnNext(330, 3),
  11115. OnNext(440, 4),
  11116. OnNext(550, 5),
  11117. OnCompleted<int>(600)
  11118. );
  11119. var res = scheduler.Start(() =>
  11120. xs.ToDictionary(x => x * 2, x => { if (x < 4) return x * 4; throw ex; }, EqualityComparer<int>.Default)
  11121. );
  11122. res.Messages.AssertEqual(
  11123. OnError<IDictionary<int, int>>(440, ex)
  11124. );
  11125. xs.Subscriptions.AssertEqual(
  11126. Subscribe(200, 440)
  11127. );
  11128. }
  11129. [Fact]
  11130. public void ToDictionary_Disposed()
  11131. {
  11132. var scheduler = new TestScheduler();
  11133. var xs = scheduler.CreateHotObservable(
  11134. OnNext(110, 1),
  11135. OnNext(220, 2),
  11136. OnNext(330, 3),
  11137. OnNext(440, 4),
  11138. OnNext(550, 5)
  11139. );
  11140. var res = scheduler.Start(() =>
  11141. xs.ToDictionary(x => x * 2, x => x * 4, EqualityComparer<int>.Default)
  11142. );
  11143. res.Messages.AssertEqual(
  11144. );
  11145. xs.Subscriptions.AssertEqual(
  11146. Subscribe(200, 1000)
  11147. );
  11148. }
  11149. [Fact]
  11150. public void ToDictionary_MultipleAdd()
  11151. {
  11152. var scheduler = new TestScheduler();
  11153. var xs = scheduler.CreateHotObservable(
  11154. OnNext(110, 1),
  11155. OnNext(220, 2),
  11156. OnNext(330, 3),
  11157. OnNext(440, 4),
  11158. OnNext(550, 5),
  11159. OnCompleted<int>(660)
  11160. );
  11161. var res = scheduler.Start(() =>
  11162. xs.ToDictionary(x => x % 2, x => x * 2, EqualityComparer<int>.Default)
  11163. );
  11164. res.Messages.AssertEqual(
  11165. OnError<IDictionary<int, int>>(440, e => true)
  11166. );
  11167. xs.Subscriptions.AssertEqual(
  11168. Subscribe(200, 440)
  11169. );
  11170. }
  11171. [Fact]
  11172. public void ToDictionary_Default()
  11173. {
  11174. var d1 = Observable.Range(1, 10).ToDictionary(x => x.ToString()).First();
  11175. Assert.Equal(7, d1["7"]);
  11176. var d2 = Observable.Range(1, 10).ToDictionary(x => x.ToString(), x => x * 2).First();
  11177. Assert.Equal(18, d2["9"]);
  11178. var d3 = Observable.Range(1, 10).ToDictionary(x => x.ToString(), EqualityComparer<string>.Default).First();
  11179. Assert.Equal(7, d3["7"]);
  11180. }
  11181. #endregion
  11182. #region + ToList +
  11183. [Fact]
  11184. public void ToList_ArgumentChecking()
  11185. {
  11186. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToList<int>(null));
  11187. }
  11188. [Fact]
  11189. public void ToList_Completed()
  11190. {
  11191. var scheduler = new TestScheduler();
  11192. var xs = scheduler.CreateHotObservable(
  11193. OnNext(110, 1),
  11194. OnNext(220, 2),
  11195. OnNext(330, 3),
  11196. OnNext(440, 4),
  11197. OnNext(550, 5),
  11198. OnCompleted<int>(660)
  11199. );
  11200. var res = scheduler.Start(() =>
  11201. xs.ToList()
  11202. );
  11203. res.Messages.AssertEqual(
  11204. OnNext<IList<int>>(660, l => l.SequenceEqual(new[] { 2, 3, 4, 5 })),
  11205. OnCompleted<IList<int>>(660)
  11206. );
  11207. xs.Subscriptions.AssertEqual(
  11208. Subscribe(200, 660)
  11209. );
  11210. }
  11211. [Fact]
  11212. public void ToList_Error()
  11213. {
  11214. var scheduler = new TestScheduler();
  11215. var ex = new Exception();
  11216. var xs = scheduler.CreateHotObservable(
  11217. OnNext(110, 1),
  11218. OnNext(220, 2),
  11219. OnNext(330, 3),
  11220. OnNext(440, 4),
  11221. OnNext(550, 5),
  11222. OnError<int>(660, ex)
  11223. );
  11224. var res = scheduler.Start(() =>
  11225. xs.ToList()
  11226. );
  11227. res.Messages.AssertEqual(
  11228. OnError<IList<int>>(660, ex)
  11229. );
  11230. xs.Subscriptions.AssertEqual(
  11231. Subscribe(200, 660)
  11232. );
  11233. }
  11234. [Fact]
  11235. public void ToList_Disposed()
  11236. {
  11237. var scheduler = new TestScheduler();
  11238. var xs = scheduler.CreateHotObservable(
  11239. OnNext(110, 1),
  11240. OnNext(220, 2),
  11241. OnNext(330, 3),
  11242. OnNext(440, 4),
  11243. OnNext(550, 5)
  11244. );
  11245. var res = scheduler.Start(() =>
  11246. xs.ToList()
  11247. );
  11248. res.Messages.AssertEqual(
  11249. );
  11250. xs.Subscriptions.AssertEqual(
  11251. Subscribe(200, 1000)
  11252. );
  11253. }
  11254. #endregion
  11255. #region + ToLookup +
  11256. [Fact]
  11257. public void ToLookup_ArgumentChecking()
  11258. {
  11259. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int>(null, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
  11260. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int>(DummyObservable<int>.Instance, null, EqualityComparer<int>.Default));
  11261. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null));
  11262. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int>(null, DummyFunc<int, int>.Instance));
  11263. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int>(DummyObservable<int>.Instance, null));
  11264. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(null, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
  11265. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, null, DummyFunc<int, int>.Instance, EqualityComparer<int>.Default));
  11266. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null, EqualityComparer<int>.Default));
  11267. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, null));
  11268. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(null, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance));
  11269. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, null, DummyFunc<int, int>.Instance));
  11270. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.ToLookup<int, int, int>(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, null));
  11271. }
  11272. [Fact]
  11273. public void ToLookup_Completed()
  11274. {
  11275. var scheduler = new TestScheduler();
  11276. var xs = scheduler.CreateHotObservable(
  11277. OnNext(110, 1),
  11278. OnNext(220, 2),
  11279. OnNext(330, 3),
  11280. OnNext(440, 4),
  11281. OnNext(550, 5),
  11282. OnCompleted<int>(660)
  11283. );
  11284. var res = scheduler.Start(() =>
  11285. xs.ToLookup(x => x % 2, x => x * 2, EqualityComparer<int>.Default)
  11286. );
  11287. res.Messages.AssertEqual(
  11288. OnNext<ILookup<int, int>>(660, d =>
  11289. {
  11290. return d.Count == 2
  11291. && d[0].SequenceEqual(new[] { 4, 8 })
  11292. && d[1].SequenceEqual(new[] { 6, 10 });
  11293. }),
  11294. OnCompleted<ILookup<int, int>>(660)
  11295. );
  11296. xs.Subscriptions.AssertEqual(
  11297. Subscribe(200, 660)
  11298. );
  11299. }
  11300. [Fact]
  11301. public void ToLookup_Error()
  11302. {
  11303. var scheduler = new TestScheduler();
  11304. var ex = new Exception();
  11305. var xs = scheduler.CreateHotObservable(
  11306. OnNext(110, 1),
  11307. OnNext(220, 2),
  11308. OnNext(330, 3),
  11309. OnNext(440, 4),
  11310. OnNext(550, 5),
  11311. OnError<int>(660, ex)
  11312. );
  11313. var res = scheduler.Start(() =>
  11314. xs.ToLookup(x => x % 2, x => x * 2, EqualityComparer<int>.Default)
  11315. );
  11316. res.Messages.AssertEqual(
  11317. OnError<ILookup<int, int>>(660, ex)
  11318. );
  11319. xs.Subscriptions.AssertEqual(
  11320. Subscribe(200, 660)
  11321. );
  11322. }
  11323. [Fact]
  11324. public void ToLookup_KeySelectorThrows()
  11325. {
  11326. var scheduler = new TestScheduler();
  11327. var ex = new Exception();
  11328. var xs = scheduler.CreateHotObservable(
  11329. OnNext(110, 1),
  11330. OnNext(220, 2),
  11331. OnNext(330, 3),
  11332. OnNext(440, 4),
  11333. OnNext(550, 5),
  11334. OnCompleted<int>(600)
  11335. );
  11336. var res = scheduler.Start(() =>
  11337. xs.ToLookup(x => { if (x < 4) return x * 2; throw ex; }, x => x * 4, EqualityComparer<int>.Default)
  11338. );
  11339. res.Messages.AssertEqual(
  11340. OnError<ILookup<int, int>>(440, ex)
  11341. );
  11342. xs.Subscriptions.AssertEqual(
  11343. Subscribe(200, 440)
  11344. );
  11345. }
  11346. [Fact]
  11347. public void ToLookup_ElementSelectorThrows()
  11348. {
  11349. var scheduler = new TestScheduler();
  11350. var ex = new Exception();
  11351. var xs = scheduler.CreateHotObservable(
  11352. OnNext(110, 1),
  11353. OnNext(220, 2),
  11354. OnNext(330, 3),
  11355. OnNext(440, 4),
  11356. OnNext(550, 5),
  11357. OnCompleted<int>(600)
  11358. );
  11359. var res = scheduler.Start(() =>
  11360. xs.ToLookup(x => x * 2, x => { if (x < 4) return x * 4; throw ex; }, EqualityComparer<int>.Default)
  11361. );
  11362. res.Messages.AssertEqual(
  11363. OnError<ILookup<int, int>>(440, ex)
  11364. );
  11365. xs.Subscriptions.AssertEqual(
  11366. Subscribe(200, 440)
  11367. );
  11368. }
  11369. [Fact]
  11370. public void ToLookup_Disposed()
  11371. {
  11372. var scheduler = new TestScheduler();
  11373. var xs = scheduler.CreateHotObservable(
  11374. OnNext(110, 1),
  11375. OnNext(220, 2),
  11376. OnNext(330, 3),
  11377. OnNext(440, 4),
  11378. OnNext(550, 5)
  11379. );
  11380. var res = scheduler.Start(() =>
  11381. xs.ToLookup(x => x % 2, x => x * 2, EqualityComparer<int>.Default)
  11382. );
  11383. res.Messages.AssertEqual(
  11384. );
  11385. xs.Subscriptions.AssertEqual(
  11386. Subscribe(200, 1000)
  11387. );
  11388. }
  11389. [Fact]
  11390. public void ToLookup_Default()
  11391. {
  11392. var d1 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString()).First();
  11393. d1["0"].AssertEqual(2, 4, 6, 8, 10);
  11394. var d2 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString(), x => x * 2).First();
  11395. d2["1"].AssertEqual(2, 6, 10, 14, 18);
  11396. var d3 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString(), EqualityComparer<string>.Default).First();
  11397. d3["0"].AssertEqual(2, 4, 6, 8, 10);
  11398. }
  11399. [Fact]
  11400. public void ToLookup_Contains()
  11401. {
  11402. var d1 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString()).First();
  11403. Assert.True(d1.Contains("1"));
  11404. Assert.False(d1.Contains("2"));
  11405. }
  11406. [Fact]
  11407. public void ToLookup_Groups()
  11408. {
  11409. var d1 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString()).First();
  11410. foreach (var g in d1)
  11411. {
  11412. if (g.Key == "0")
  11413. {
  11414. g.AssertEqual(2, 4, 6, 8, 10);
  11415. }
  11416. else if (g.Key == "1")
  11417. {
  11418. g.AssertEqual(1, 3, 5, 7, 9);
  11419. }
  11420. else
  11421. Assert.True(false, "Unknown group.");
  11422. }
  11423. }
  11424. [Fact]
  11425. public void ToLookup_Groups_2()
  11426. {
  11427. var d1 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString()).First();
  11428. foreach (IGrouping<string, int> g in ((System.Collections.IEnumerable)d1))
  11429. {
  11430. if (g.Key == "0")
  11431. {
  11432. var l = new List<int>();
  11433. foreach (int v in ((System.Collections.IEnumerable)g)) l.Add(v);
  11434. l.AssertEqual(2, 4, 6, 8, 10);
  11435. }
  11436. else if (g.Key == "1")
  11437. {
  11438. var l = new List<int>();
  11439. foreach (int v in ((System.Collections.IEnumerable)g)) l.Add(v);
  11440. l.AssertEqual(1, 3, 5, 7, 9);
  11441. }
  11442. else
  11443. Assert.True(false, "Unknown group.");
  11444. }
  11445. }
  11446. [Fact]
  11447. public void ToLookup_IndexerForInvalidKey()
  11448. {
  11449. var d1 = Observable.Range(1, 10).ToLookup(x => (x % 2).ToString()).First();
  11450. var values = d1["2"];
  11451. values.AssertEqual(Enumerable.Empty<int>());
  11452. }
  11453. #endregion
  11454. }
  11455. }