ObservableAggregateTest.cs 386 KB

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