ObservableAggregateTest.cs 387 KB

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