1
0

ObservableMultipleTest.cs 622 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816
  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.Diagnostics;
  5. using System.Linq;
  6. using System.Reactive;
  7. using System.Reactive.Concurrency;
  8. using System.Reactive.Linq;
  9. using System.Threading;
  10. using System.Reactive.Subjects;
  11. using Microsoft.Reactive.Testing;
  12. using Xunit;
  13. using ReactiveTests.Dummies;
  14. #if !NO_TPL
  15. using System.Threading.Tasks;
  16. #endif
  17. namespace ReactiveTests.Tests
  18. {
  19. public class ObservableMultipleTest : ReactiveTest
  20. {
  21. #region + Amb +
  22. [Fact]
  23. public void Amb_ArgumentChecking()
  24. {
  25. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Amb((IObservable<int>[])null));
  26. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Amb((IEnumerable<IObservable<int>>)null));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Amb(null, DummyObservable<int>.Instance));
  28. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Amb(DummyObservable<int>.Instance, null));
  29. }
  30. [Fact]
  31. public void Amb_Never2()
  32. {
  33. var scheduler = new TestScheduler();
  34. var l = scheduler.CreateHotObservable(
  35. OnNext(150, 1)
  36. );
  37. var r = scheduler.CreateHotObservable(
  38. OnNext(150, 1)
  39. );
  40. var res = scheduler.Start(() =>
  41. l.Amb(r)
  42. );
  43. res.Messages.AssertEqual(
  44. );
  45. l.Subscriptions.AssertEqual(
  46. Subscribe(200, 1000)
  47. );
  48. r.Subscriptions.AssertEqual(
  49. Subscribe(200, 1000)
  50. );
  51. }
  52. [Fact]
  53. public void Amb_Never3()
  54. {
  55. var scheduler = new TestScheduler();
  56. var n1 = scheduler.CreateHotObservable(
  57. OnNext(150, 1)
  58. );
  59. var n2 = scheduler.CreateHotObservable(
  60. OnNext(150, 1)
  61. );
  62. var n3 = scheduler.CreateHotObservable(
  63. OnNext(150, 1)
  64. );
  65. var res = scheduler.Start(() =>
  66. new[] { n1, n2, n3 }.Amb()
  67. );
  68. res.Messages.AssertEqual(
  69. );
  70. n1.Subscriptions.AssertEqual(
  71. Subscribe(200, 1000)
  72. );
  73. n2.Subscriptions.AssertEqual(
  74. Subscribe(200, 1000)
  75. );
  76. n3.Subscriptions.AssertEqual(
  77. Subscribe(200, 1000)
  78. );
  79. }
  80. [Fact]
  81. public void Amb_Never3_Params()
  82. {
  83. var scheduler = new TestScheduler();
  84. var n1 = scheduler.CreateHotObservable(
  85. OnNext(150, 1)
  86. );
  87. var n2 = scheduler.CreateHotObservable(
  88. OnNext(150, 1)
  89. );
  90. var n3 = scheduler.CreateHotObservable(
  91. OnNext(150, 1)
  92. );
  93. var res = scheduler.Start(() =>
  94. Observable.Amb(n1, n2, n3)
  95. );
  96. res.Messages.AssertEqual(
  97. );
  98. n1.Subscriptions.AssertEqual(
  99. Subscribe(200, 1000)
  100. );
  101. n2.Subscriptions.AssertEqual(
  102. Subscribe(200, 1000)
  103. );
  104. n3.Subscriptions.AssertEqual(
  105. Subscribe(200, 1000)
  106. );
  107. }
  108. [Fact]
  109. public void Amb_NeverEmpty()
  110. {
  111. var scheduler = new TestScheduler();
  112. var n = scheduler.CreateHotObservable(
  113. OnNext(150, 1)
  114. );
  115. var e = scheduler.CreateHotObservable(
  116. OnNext(150, 1),
  117. OnCompleted<int>(225)
  118. );
  119. var res = scheduler.Start(() =>
  120. n.Amb(e)
  121. );
  122. res.Messages.AssertEqual(
  123. OnCompleted<int>(225)
  124. );
  125. n.Subscriptions.AssertEqual(
  126. Subscribe(200, 225)
  127. );
  128. e.Subscriptions.AssertEqual(
  129. Subscribe(200, 225)
  130. );
  131. }
  132. [Fact]
  133. public void Amb_EmptyNever()
  134. {
  135. var scheduler = new TestScheduler();
  136. var n = scheduler.CreateHotObservable(
  137. OnNext(150, 1)
  138. );
  139. var e = scheduler.CreateHotObservable(
  140. OnNext(150, 1),
  141. OnCompleted<int>(225)
  142. );
  143. var res = scheduler.Start(() =>
  144. e.Amb(n)
  145. );
  146. res.Messages.AssertEqual(
  147. OnCompleted<int>(225)
  148. );
  149. n.Subscriptions.AssertEqual(
  150. Subscribe(200, 225)
  151. );
  152. e.Subscriptions.AssertEqual(
  153. Subscribe(200, 225)
  154. );
  155. }
  156. [Fact]
  157. public void Amb_RegularShouldDisposeLoser()
  158. {
  159. var scheduler = new TestScheduler();
  160. var o1 = scheduler.CreateHotObservable(
  161. OnNext(150, 1),
  162. OnNext(210, 2),
  163. OnCompleted<int>(240)
  164. );
  165. var o2 = scheduler.CreateHotObservable(
  166. OnNext(150, 1),
  167. OnNext(220, 3),
  168. OnCompleted<int>(250)
  169. );
  170. var res = scheduler.Start(() =>
  171. o1.Amb(o2)
  172. );
  173. res.Messages.AssertEqual(
  174. OnNext(210, 2),
  175. OnCompleted<int>(240)
  176. );
  177. o1.Subscriptions.AssertEqual(
  178. Subscribe(200, 240)
  179. );
  180. o2.Subscriptions.AssertEqual(
  181. Subscribe(200, 210)
  182. );
  183. }
  184. [Fact]
  185. public void Amb_WinnerThrows()
  186. {
  187. var scheduler = new TestScheduler();
  188. var ex = new Exception();
  189. var o1 = scheduler.CreateHotObservable(
  190. OnNext(150, 1),
  191. OnNext(210, 2),
  192. OnError<int>(220, ex)
  193. );
  194. var o2 = scheduler.CreateHotObservable(
  195. OnNext(150, 1),
  196. OnNext(220, 3),
  197. OnCompleted<int>(250)
  198. );
  199. var res = scheduler.Start(() =>
  200. o1.Amb(o2)
  201. );
  202. res.Messages.AssertEqual(
  203. OnNext(210, 2),
  204. OnError<int>(220, ex)
  205. );
  206. o1.Subscriptions.AssertEqual(
  207. Subscribe(200, 220)
  208. );
  209. o2.Subscriptions.AssertEqual(
  210. Subscribe(200, 210)
  211. );
  212. }
  213. [Fact]
  214. public void Amb_LoserThrows()
  215. {
  216. var scheduler = new TestScheduler();
  217. var ex = new Exception();
  218. var o1 = scheduler.CreateHotObservable(
  219. OnNext(150, 1),
  220. OnNext(220, 2),
  221. OnError<int>(230, ex)
  222. );
  223. var o2 = scheduler.CreateHotObservable(
  224. OnNext(150, 1),
  225. OnNext(210, 3),
  226. OnCompleted<int>(250)
  227. );
  228. var res = scheduler.Start(() =>
  229. o1.Amb(o2)
  230. );
  231. res.Messages.AssertEqual(
  232. OnNext(210, 3),
  233. OnCompleted<int>(250)
  234. );
  235. o1.Subscriptions.AssertEqual(
  236. Subscribe(200, 210)
  237. );
  238. o2.Subscriptions.AssertEqual(
  239. Subscribe(200, 250)
  240. );
  241. }
  242. [Fact]
  243. public void Amb_ThrowsBeforeElectionLeft()
  244. {
  245. var scheduler = new TestScheduler();
  246. var ex = new Exception();
  247. var o1 = scheduler.CreateHotObservable(
  248. OnNext(150, 1),
  249. OnError<int>(210, ex)
  250. );
  251. var o2 = scheduler.CreateHotObservable(
  252. OnNext(150, 1),
  253. OnNext(220, 3),
  254. OnCompleted<int>(250)
  255. );
  256. var res = scheduler.Start(() =>
  257. o1.Amb(o2)
  258. );
  259. res.Messages.AssertEqual(
  260. OnError<int>(210, ex)
  261. );
  262. o1.Subscriptions.AssertEqual(
  263. Subscribe(200, 210)
  264. );
  265. o2.Subscriptions.AssertEqual(
  266. Subscribe(200, 210)
  267. );
  268. }
  269. [Fact]
  270. public void Amb_ThrowsBeforeElectionRight()
  271. {
  272. var scheduler = new TestScheduler();
  273. var ex = new Exception();
  274. var o1 = scheduler.CreateHotObservable(
  275. OnNext(150, 1),
  276. OnNext(220, 3),
  277. OnCompleted<int>(250)
  278. );
  279. var o2 = scheduler.CreateHotObservable(
  280. OnNext(150, 1),
  281. OnError<int>(210, ex)
  282. );
  283. var res = scheduler.Start(() =>
  284. o1.Amb(o2)
  285. );
  286. res.Messages.AssertEqual(
  287. OnError<int>(210, ex)
  288. );
  289. o1.Subscriptions.AssertEqual(
  290. Subscribe(200, 210)
  291. );
  292. o2.Subscriptions.AssertEqual(
  293. Subscribe(200, 210)
  294. );
  295. }
  296. #endregion
  297. #region + Buffer +
  298. [Fact]
  299. public void Buffer_ArgumentChecking()
  300. {
  301. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Buffer(default(IObservable<int>), DummyFunc<IObservable<int>>.Instance));
  302. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Buffer(DummyObservable<int>.Instance, default(Func<IObservable<int>>)));
  303. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Buffer(default(IObservable<int>), DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance));
  304. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Buffer(DummyObservable<int>.Instance, default(IObservable<int>), DummyFunc<int, IObservable<int>>.Instance));
  305. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Buffer(DummyObservable<int>.Instance, DummyObservable<int>.Instance, default(Func<int, IObservable<int>>)));
  306. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Buffer(default(IObservable<int>), DummyObservable<int>.Instance));
  307. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Buffer(DummyObservable<int>.Instance, default(IObservable<int>)));
  308. }
  309. [Fact]
  310. public void Buffer_Closings_Basic()
  311. {
  312. var scheduler = new TestScheduler();
  313. var xs = scheduler.CreateHotObservable(
  314. OnNext(90, 1),
  315. OnNext(180, 2),
  316. OnNext(250, 3),
  317. OnNext(260, 4),
  318. OnNext(310, 5),
  319. OnNext(340, 6),
  320. OnNext(410, 7),
  321. OnNext(420, 8),
  322. OnNext(470, 9),
  323. OnNext(550, 10),
  324. OnCompleted<int>(590)
  325. );
  326. var window = 1;
  327. var res = scheduler.Start(() =>
  328. xs.Buffer(() => Observable.Timer(TimeSpan.FromTicks((window++) * 100), scheduler))
  329. );
  330. res.Messages.AssertEqual(
  331. OnNext<IList<int>>(300, b => b.SequenceEqual(new int[] { 3, 4 })),
  332. OnNext<IList<int>>(500, b => b.SequenceEqual(new int[] { 5, 6, 7, 8, 9 })),
  333. OnNext<IList<int>>(590, b => b.SequenceEqual(new int[] { 10 })),
  334. OnCompleted<IList<int>>(590)
  335. );
  336. xs.Subscriptions.AssertEqual(
  337. Subscribe(200, 590)
  338. );
  339. }
  340. [Fact]
  341. public void Buffer_Closings_InnerSubscriptions()
  342. {
  343. var scheduler = new TestScheduler();
  344. var xs = scheduler.CreateHotObservable(
  345. OnNext(90, 1),
  346. OnNext(180, 2),
  347. OnNext(250, 3),
  348. OnNext(260, 4),
  349. OnNext(310, 5),
  350. OnNext(340, 6),
  351. OnNext(410, 7),
  352. OnNext(420, 8),
  353. OnNext(470, 9),
  354. OnNext(550, 10),
  355. OnCompleted<int>(590)
  356. );
  357. var closings = new ITestableObservable<bool>[] {
  358. scheduler.CreateHotObservable(
  359. OnNext(300, true),
  360. OnNext(350, false),
  361. OnCompleted<bool>(380)
  362. ),
  363. scheduler.CreateHotObservable(
  364. OnNext(400, true),
  365. OnNext(510, false),
  366. OnNext(620, false)
  367. ),
  368. scheduler.CreateHotObservable(
  369. OnCompleted<bool>(500)
  370. ),
  371. scheduler.CreateHotObservable(
  372. OnNext(600, true)
  373. )
  374. };
  375. var window = 0;
  376. var res = scheduler.Start(() =>
  377. xs.Buffer(() => closings[window++])
  378. );
  379. res.Messages.AssertEqual(
  380. OnNext<IList<int>>(300, b => b.SequenceEqual(new int[] { 3, 4 })),
  381. OnNext<IList<int>>(400, b => b.SequenceEqual(new int[] { 5, 6 })),
  382. OnNext<IList<int>>(500, b => b.SequenceEqual(new int[] { 7, 8, 9 })),
  383. OnNext<IList<int>>(590, b => b.SequenceEqual(new int[] { 10 })),
  384. OnCompleted<IList<int>>(590)
  385. );
  386. xs.Subscriptions.AssertEqual(
  387. Subscribe(200, 590)
  388. );
  389. closings[0].Subscriptions.AssertEqual(
  390. Subscribe(200, 300)
  391. );
  392. closings[1].Subscriptions.AssertEqual(
  393. Subscribe(300, 400)
  394. );
  395. closings[2].Subscriptions.AssertEqual(
  396. Subscribe(400, 500)
  397. );
  398. closings[3].Subscriptions.AssertEqual(
  399. Subscribe(500, 590)
  400. );
  401. }
  402. [Fact]
  403. public void Buffer_Closings_Empty()
  404. {
  405. var scheduler = new TestScheduler();
  406. var xs = scheduler.CreateHotObservable(
  407. OnNext(90, 1),
  408. OnNext(180, 2),
  409. OnNext(250, 3),
  410. OnNext(260, 4),
  411. OnNext(310, 5),
  412. OnNext(340, 6),
  413. OnNext(410, 7),
  414. OnNext(420, 8),
  415. OnNext(470, 9),
  416. OnNext(550, 10),
  417. OnCompleted<int>(590)
  418. );
  419. var window = 1;
  420. var res = scheduler.Start(() =>
  421. xs.Buffer(() => Observable.Empty<int>().Delay(TimeSpan.FromTicks((window++) * 100), scheduler))
  422. );
  423. res.Messages.AssertEqual(
  424. OnNext<IList<int>>(300, l => l.SequenceEqual(new int[] { 3, 4 })),
  425. OnNext<IList<int>>(500, l => l.SequenceEqual(new int[] { 5, 6, 7, 8, 9 })),
  426. OnNext<IList<int>>(590, l => l.SequenceEqual(new int[] { 10 })),
  427. OnCompleted<IList<int>>(590)
  428. );
  429. xs.Subscriptions.AssertEqual(
  430. Subscribe(200, 590)
  431. );
  432. }
  433. [Fact]
  434. public void Buffer_Closings_Dispose()
  435. {
  436. var scheduler = new TestScheduler();
  437. var xs = scheduler.CreateHotObservable(
  438. OnNext(90, 1),
  439. OnNext(180, 2),
  440. OnNext(250, 3),
  441. OnNext(260, 4),
  442. OnNext(310, 5),
  443. OnNext(340, 6),
  444. OnNext(410, 7),
  445. OnNext(420, 8),
  446. OnNext(470, 9),
  447. OnNext(550, 10),
  448. OnCompleted<int>(590)
  449. );
  450. var window = 1;
  451. var res = scheduler.Start(() =>
  452. xs.Buffer(() => Observable.Timer(TimeSpan.FromTicks((window++) * 100), scheduler)),
  453. 400
  454. );
  455. res.Messages.AssertEqual(
  456. OnNext<IList<int>>(300, l => l.SequenceEqual(new int[] { 3, 4 }))
  457. );
  458. xs.Subscriptions.AssertEqual(
  459. Subscribe(200, 400)
  460. );
  461. }
  462. [Fact]
  463. public void Buffer_Closings_Error()
  464. {
  465. var scheduler = new TestScheduler();
  466. var ex = new Exception();
  467. var xs = scheduler.CreateHotObservable(
  468. OnNext(90, 1),
  469. OnNext(180, 2),
  470. OnNext(250, 3),
  471. OnNext(260, 4),
  472. OnNext(310, 5),
  473. OnNext(340, 6),
  474. OnNext(410, 7),
  475. OnNext(420, 8),
  476. OnNext(470, 9),
  477. OnNext(550, 10),
  478. OnError<int>(590, ex)
  479. );
  480. var window = 1;
  481. var res = scheduler.Start(() =>
  482. xs.Buffer(() => Observable.Timer(TimeSpan.FromTicks((window++) * 100), scheduler))
  483. );
  484. res.Messages.AssertEqual(
  485. OnNext<IList<int>>(300, l => l.SequenceEqual(new int[] { 3, 4 })),
  486. OnNext<IList<int>>(500, l => l.SequenceEqual(new int[] { 5, 6, 7, 8, 9 })),
  487. OnError<IList<int>>(590, ex)
  488. );
  489. xs.Subscriptions.AssertEqual(
  490. Subscribe(200, 590)
  491. );
  492. }
  493. [Fact]
  494. public void Buffer_Closings_Throw()
  495. {
  496. var scheduler = new TestScheduler();
  497. var ex = new Exception();
  498. var xs = scheduler.CreateHotObservable(
  499. OnNext(90, 1),
  500. OnNext(180, 2),
  501. OnNext(250, 3),
  502. OnNext(260, 4),
  503. OnNext(310, 5),
  504. OnNext(340, 6),
  505. OnNext(410, 7),
  506. OnNext(420, 8),
  507. OnNext(470, 9),
  508. OnNext(550, 10),
  509. OnError<int>(590, new Exception())
  510. );
  511. var res = scheduler.Start(() =>
  512. xs.Buffer<int, int>(() => { throw ex; })
  513. );
  514. res.Messages.AssertEqual(
  515. OnError<IList<int>>(200, ex)
  516. );
  517. xs.Subscriptions.AssertEqual(
  518. Subscribe(200, 200)
  519. );
  520. }
  521. [Fact]
  522. public void Buffer_Closings_WindowClose_Error()
  523. {
  524. var scheduler = new TestScheduler();
  525. var ex = new Exception();
  526. var xs = scheduler.CreateHotObservable(
  527. OnNext(90, 1),
  528. OnNext(180, 2),
  529. OnNext(250, 3),
  530. OnNext(260, 4),
  531. OnNext(310, 5),
  532. OnNext(340, 6),
  533. OnNext(410, 7),
  534. OnNext(420, 8),
  535. OnNext(470, 9),
  536. OnNext(550, 10),
  537. OnError<int>(590, new Exception())
  538. );
  539. var res = scheduler.Start(() =>
  540. xs.Buffer(() => Observable.Throw<int>(ex, scheduler))
  541. );
  542. res.Messages.AssertEqual(
  543. OnError<IList<int>>(201, ex)
  544. );
  545. xs.Subscriptions.AssertEqual(
  546. Subscribe(200, 201)
  547. );
  548. }
  549. [Fact]
  550. public void Buffer_OpeningClosings_Basic()
  551. {
  552. var scheduler = new TestScheduler();
  553. var xs = scheduler.CreateHotObservable(
  554. OnNext(90, 1),
  555. OnNext(180, 2),
  556. OnNext(250, 3),
  557. OnNext(260, 4),
  558. OnNext(310, 5),
  559. OnNext(340, 6),
  560. OnNext(410, 7),
  561. OnNext(420, 8),
  562. OnNext(470, 9),
  563. OnNext(550, 10),
  564. OnCompleted<int>(590)
  565. );
  566. var ys = scheduler.CreateHotObservable(
  567. OnNext(255, 50),
  568. OnNext(330, 100),
  569. OnNext(350, 50),
  570. OnNext(400, 90),
  571. OnCompleted<int>(900)
  572. );
  573. var res = scheduler.Start(() =>
  574. xs.Buffer(ys, x => Observable.Timer(TimeSpan.FromTicks(x), scheduler))
  575. );
  576. res.Messages.AssertEqual(
  577. OnNext<IList<int>>(305, b => b.SequenceEqual(new int[] { 4 })),
  578. OnNext<IList<int>>(400, b => b.SequenceEqual(new int[] { })),
  579. OnNext<IList<int>>(430, b => b.SequenceEqual(new int[] { 6, 7, 8 })),
  580. OnNext<IList<int>>(490, b => b.SequenceEqual(new int[] { 7, 8, 9 })),
  581. OnCompleted<IList<int>>(900)
  582. );
  583. #if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  584. xs.Subscriptions.AssertEqual(
  585. Subscribe(200, 590)
  586. );
  587. #else
  588. xs.Subscriptions.AssertEqual(
  589. Subscribe(200, 900)
  590. );
  591. #endif
  592. ys.Subscriptions.AssertEqual(
  593. Subscribe(200, 900)
  594. );
  595. }
  596. [Fact]
  597. public void Buffer_Boundaries_Simple()
  598. {
  599. var scheduler = new TestScheduler();
  600. var xs = scheduler.CreateHotObservable(
  601. OnNext(90, 1),
  602. OnNext(180, 2),
  603. OnNext(250, 3),
  604. OnNext(260, 4),
  605. OnNext(310, 5),
  606. OnNext(340, 6),
  607. OnNext(410, 7),
  608. OnNext(420, 8),
  609. OnNext(470, 9),
  610. OnNext(550, 10),
  611. OnCompleted<int>(590)
  612. );
  613. var ys = scheduler.CreateHotObservable(
  614. OnNext(255, true),
  615. OnNext(330, true),
  616. OnNext(350, true),
  617. OnNext(400, true),
  618. OnNext(500, true),
  619. OnCompleted<bool>(900)
  620. );
  621. var res = scheduler.Start(() =>
  622. xs.Buffer(ys)
  623. );
  624. res.Messages.AssertEqual(
  625. OnNext<IList<int>>(255, b => b.SequenceEqual(new int[] { 3 })),
  626. OnNext<IList<int>>(330, b => b.SequenceEqual(new int[] { 4, 5 })),
  627. OnNext<IList<int>>(350, b => b.SequenceEqual(new int[] { 6 })),
  628. OnNext<IList<int>>(400, b => b.SequenceEqual(new int[] { })),
  629. OnNext<IList<int>>(500, b => b.SequenceEqual(new int[] { 7, 8, 9 })),
  630. OnNext<IList<int>>(590, b => b.SequenceEqual(new int[] { 10 })),
  631. OnCompleted<IList<int>>(590)
  632. );
  633. xs.Subscriptions.AssertEqual(
  634. Subscribe(200, 590)
  635. );
  636. ys.Subscriptions.AssertEqual(
  637. Subscribe(200, 590)
  638. );
  639. }
  640. [Fact]
  641. public void Buffer_Boundaries_OnCompletedBoundaries()
  642. {
  643. var scheduler = new TestScheduler();
  644. var xs = scheduler.CreateHotObservable(
  645. OnNext(90, 1),
  646. OnNext(180, 2),
  647. OnNext(250, 3),
  648. OnNext(260, 4),
  649. OnNext(310, 5),
  650. OnNext(340, 6),
  651. OnNext(410, 7),
  652. OnNext(420, 8),
  653. OnNext(470, 9),
  654. OnNext(550, 10),
  655. OnCompleted<int>(590)
  656. );
  657. var ys = scheduler.CreateHotObservable(
  658. OnNext(255, true),
  659. OnNext(330, true),
  660. OnNext(350, true),
  661. OnCompleted<bool>(400)
  662. );
  663. var res = scheduler.Start(() =>
  664. xs.Buffer(ys)
  665. );
  666. res.Messages.AssertEqual(
  667. OnNext<IList<int>>(255, b => b.SequenceEqual(new int[] { 3 })),
  668. OnNext<IList<int>>(330, b => b.SequenceEqual(new int[] { 4, 5 })),
  669. OnNext<IList<int>>(350, b => b.SequenceEqual(new int[] { 6 })),
  670. OnNext<IList<int>>(400, b => b.SequenceEqual(new int[] { })),
  671. OnCompleted<IList<int>>(400)
  672. );
  673. xs.Subscriptions.AssertEqual(
  674. Subscribe(200, 400)
  675. );
  676. ys.Subscriptions.AssertEqual(
  677. Subscribe(200, 400)
  678. );
  679. }
  680. [Fact]
  681. public void Buffer_Boundaries_OnErrorSource()
  682. {
  683. var ex = new Exception();
  684. var scheduler = new TestScheduler();
  685. var xs = scheduler.CreateHotObservable(
  686. OnNext(90, 1),
  687. OnNext(180, 2),
  688. OnNext(250, 3),
  689. OnNext(260, 4),
  690. OnNext(310, 5),
  691. OnNext(340, 6),
  692. OnNext(380, 7),
  693. OnError<int>(400, ex)
  694. );
  695. var ys = scheduler.CreateHotObservable(
  696. OnNext(255, true),
  697. OnNext(330, true),
  698. OnNext(350, true),
  699. OnCompleted<bool>(500)
  700. );
  701. var res = scheduler.Start(() =>
  702. xs.Buffer(ys)
  703. );
  704. res.Messages.AssertEqual(
  705. OnNext<IList<int>>(255, b => b.SequenceEqual(new int[] { 3 })),
  706. OnNext<IList<int>>(330, b => b.SequenceEqual(new int[] { 4, 5 })),
  707. OnNext<IList<int>>(350, b => b.SequenceEqual(new int[] { 6 })),
  708. OnError<IList<int>>(400, ex)
  709. );
  710. xs.Subscriptions.AssertEqual(
  711. Subscribe(200, 400)
  712. );
  713. ys.Subscriptions.AssertEqual(
  714. Subscribe(200, 400)
  715. );
  716. }
  717. [Fact]
  718. public void Buffer_Boundaries_OnErrorBoundaries()
  719. {
  720. var ex = new Exception();
  721. var scheduler = new TestScheduler();
  722. var xs = scheduler.CreateHotObservable(
  723. OnNext(90, 1),
  724. OnNext(180, 2),
  725. OnNext(250, 3),
  726. OnNext(260, 4),
  727. OnNext(310, 5),
  728. OnNext(340, 6),
  729. OnNext(410, 7),
  730. OnNext(420, 8),
  731. OnNext(470, 9),
  732. OnNext(550, 10),
  733. OnCompleted<int>(590)
  734. );
  735. var ys = scheduler.CreateHotObservable(
  736. OnNext(255, true),
  737. OnNext(330, true),
  738. OnNext(350, true),
  739. OnError<bool>(400, ex)
  740. );
  741. var res = scheduler.Start(() =>
  742. xs.Buffer(ys)
  743. );
  744. res.Messages.AssertEqual(
  745. OnNext<IList<int>>(255, b => b.SequenceEqual(new int[] { 3 })),
  746. OnNext<IList<int>>(330, b => b.SequenceEqual(new int[] { 4, 5 })),
  747. OnNext<IList<int>>(350, b => b.SequenceEqual(new int[] { 6 })),
  748. OnError<IList<int>>(400, ex)
  749. );
  750. xs.Subscriptions.AssertEqual(
  751. Subscribe(200, 400)
  752. );
  753. ys.Subscriptions.AssertEqual(
  754. Subscribe(200, 400)
  755. );
  756. }
  757. #endregion
  758. #region + Catch +
  759. [Fact]
  760. public void Catch_ArgumentChecking()
  761. {
  762. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Catch<int>((IObservable<int>[])null));
  763. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Catch<int>((IEnumerable<IObservable<int>>)null));
  764. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Catch<int>(DummyObservable<int>.Instance, null));
  765. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Catch<int>((IObservable<int>)null, DummyObservable<int>.Instance));
  766. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Catch<int, Exception>(null, _ => DummyObservable<int>.Instance));
  767. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Catch<int, Exception>(DummyObservable<int>.Instance, null));
  768. }
  769. [Fact]
  770. public void Catch_IEofIO_GetEnumeratorThrows()
  771. {
  772. var ex = new Exception();
  773. var scheduler = new TestScheduler();
  774. var xss = new RogueEnumerable<IObservable<int>>(ex);
  775. var res = scheduler.Start(() =>
  776. Observable.Catch(xss)
  777. );
  778. res.Messages.AssertEqual(
  779. OnError<int>(200, ex)
  780. );
  781. }
  782. [Fact]
  783. public void Catch_IEofIO()
  784. {
  785. var scheduler = new TestScheduler();
  786. var xs1 = scheduler.CreateColdObservable<int>(
  787. OnNext(10, 1),
  788. OnNext(20, 2),
  789. OnNext(30, 3),
  790. OnError<int>(40, new Exception())
  791. );
  792. var xs2 = scheduler.CreateColdObservable<int>(
  793. OnNext(10, 4),
  794. OnNext(20, 5),
  795. OnError<int>(30, new Exception())
  796. );
  797. var xs3 = scheduler.CreateColdObservable<int>(
  798. OnNext(10, 6),
  799. OnNext(20, 7),
  800. OnNext(30, 8),
  801. OnNext(40, 9),
  802. OnCompleted<int>(50)
  803. );
  804. var res = scheduler.Start(() =>
  805. Observable.Catch(new[] { xs1, xs2, xs3 })
  806. );
  807. res.Messages.AssertEqual(
  808. OnNext(210, 1),
  809. OnNext(220, 2),
  810. OnNext(230, 3),
  811. OnNext(250, 4),
  812. OnNext(260, 5),
  813. OnNext(280, 6),
  814. OnNext(290, 7),
  815. OnNext(300, 8),
  816. OnNext(310, 9),
  817. OnCompleted<int>(320)
  818. );
  819. xs1.Subscriptions.AssertEqual(
  820. Subscribe(200, 240)
  821. );
  822. xs2.Subscriptions.AssertEqual(
  823. Subscribe(240, 270)
  824. );
  825. xs3.Subscriptions.AssertEqual(
  826. Subscribe(270, 320)
  827. );
  828. }
  829. [Fact]
  830. public void Catch_NoErrors()
  831. {
  832. var scheduler = new TestScheduler();
  833. var o1 = scheduler.CreateHotObservable(
  834. OnNext(150, 1),
  835. OnNext(210, 2),
  836. OnNext(220, 3),
  837. OnCompleted<int>(230)
  838. );
  839. var o2 = scheduler.CreateHotObservable(
  840. OnNext(240, 4),
  841. OnCompleted<int>(250)
  842. );
  843. var res = scheduler.Start(() =>
  844. o1.Catch(o2)
  845. );
  846. res.Messages.AssertEqual(
  847. OnNext(210, 2),
  848. OnNext(220, 3),
  849. OnCompleted<int>(230)
  850. );
  851. o1.Subscriptions.AssertEqual(
  852. Subscribe(200, 230)
  853. );
  854. o2.Subscriptions.AssertEqual(
  855. );
  856. }
  857. [Fact]
  858. public void Catch_Never()
  859. {
  860. var scheduler = new TestScheduler();
  861. var o1 = scheduler.CreateHotObservable(
  862. OnNext(150, 1)
  863. );
  864. var o2 = scheduler.CreateHotObservable(
  865. OnNext(240, 4),
  866. OnCompleted<int>(250)
  867. );
  868. var res = scheduler.Start(() =>
  869. o1.Catch(o2)
  870. );
  871. res.Messages.AssertEqual(
  872. );
  873. o1.Subscriptions.AssertEqual(
  874. Subscribe(200, 1000)
  875. );
  876. o2.Subscriptions.AssertEqual(
  877. );
  878. }
  879. [Fact]
  880. public void Catch_Empty()
  881. {
  882. var scheduler = new TestScheduler();
  883. var o1 = scheduler.CreateHotObservable(
  884. OnNext(150, 1),
  885. OnCompleted<int>(230)
  886. );
  887. var o2 = scheduler.CreateHotObservable(
  888. OnNext(240, 4),
  889. OnCompleted<int>(250)
  890. );
  891. var res = scheduler.Start(() =>
  892. o1.Catch(o2)
  893. );
  894. res.Messages.AssertEqual(
  895. OnCompleted<int>(230)
  896. );
  897. o1.Subscriptions.AssertEqual(
  898. Subscribe(200, 230)
  899. );
  900. o2.Subscriptions.AssertEqual(
  901. );
  902. }
  903. [Fact]
  904. public void Catch_Return()
  905. {
  906. var scheduler = new TestScheduler();
  907. var o1 = scheduler.CreateHotObservable(
  908. OnNext(150, 1),
  909. OnNext(210, 2),
  910. OnCompleted<int>(230)
  911. );
  912. var o2 = scheduler.CreateHotObservable(
  913. OnNext(240, 4),
  914. OnCompleted<int>(250)
  915. );
  916. var res = scheduler.Start(() =>
  917. o1.Catch(o2)
  918. );
  919. res.Messages.AssertEqual(
  920. OnNext(210, 2),
  921. OnCompleted<int>(230)
  922. );
  923. o1.Subscriptions.AssertEqual(
  924. Subscribe(200, 230)
  925. );
  926. o2.Subscriptions.AssertEqual(
  927. );
  928. }
  929. [Fact]
  930. public void Catch_Error()
  931. {
  932. var scheduler = new TestScheduler();
  933. var ex = new Exception();
  934. var o1 = scheduler.CreateHotObservable(
  935. OnNext(150, 1),
  936. OnNext(210, 2),
  937. OnNext(220, 3),
  938. OnError<int>(230, ex)
  939. );
  940. var o2 = scheduler.CreateHotObservable(
  941. OnNext(240, 4),
  942. OnCompleted<int>(250)
  943. );
  944. var res = scheduler.Start(() =>
  945. o1.Catch(o2)
  946. );
  947. res.Messages.AssertEqual(
  948. OnNext(210, 2),
  949. OnNext(220, 3),
  950. OnNext(240, 4),
  951. OnCompleted<int>(250)
  952. );
  953. o1.Subscriptions.AssertEqual(
  954. Subscribe(200, 230)
  955. );
  956. o2.Subscriptions.AssertEqual(
  957. Subscribe(230, 250)
  958. );
  959. }
  960. [Fact]
  961. public void Catch_Error_Never()
  962. {
  963. var scheduler = new TestScheduler();
  964. var ex = new Exception();
  965. var o1 = scheduler.CreateHotObservable(
  966. OnNext(150, 1),
  967. OnNext(210, 2),
  968. OnNext(220, 3),
  969. OnError<int>(230, ex)
  970. );
  971. var o2 = scheduler.CreateHotObservable(
  972. OnNext(150, 1)
  973. );
  974. var res = scheduler.Start(() =>
  975. o1.Catch(o2)
  976. );
  977. res.Messages.AssertEqual(
  978. OnNext(210, 2),
  979. OnNext(220, 3)
  980. );
  981. o1.Subscriptions.AssertEqual(
  982. Subscribe(200, 230)
  983. );
  984. o2.Subscriptions.AssertEqual(
  985. Subscribe(230, 1000)
  986. );
  987. }
  988. [Fact]
  989. public void Catch_Error_Error()
  990. {
  991. var scheduler = new TestScheduler();
  992. var ex = new Exception();
  993. var o1 = scheduler.CreateHotObservable(
  994. OnNext(150, 1),
  995. OnNext(210, 2),
  996. OnNext(220, 3),
  997. OnError<int>(230, new Exception())
  998. );
  999. var o2 = scheduler.CreateHotObservable(
  1000. OnNext(240, 4),
  1001. OnError<int>(250, ex)
  1002. );
  1003. var res = scheduler.Start(() =>
  1004. o1.Catch(o2)
  1005. );
  1006. res.Messages.AssertEqual(
  1007. OnNext(210, 2),
  1008. OnNext(220, 3),
  1009. OnNext(240, 4),
  1010. OnError<int>(250, ex)
  1011. );
  1012. o1.Subscriptions.AssertEqual(
  1013. Subscribe(200, 230)
  1014. );
  1015. o2.Subscriptions.AssertEqual(
  1016. Subscribe(230, 250)
  1017. );
  1018. }
  1019. [Fact]
  1020. public void Catch_Multiple()
  1021. {
  1022. var scheduler = new TestScheduler();
  1023. var ex = new Exception();
  1024. var o1 = scheduler.CreateHotObservable(
  1025. OnNext(150, 1),
  1026. OnNext(210, 2),
  1027. OnError<int>(215, ex)
  1028. );
  1029. var o2 = scheduler.CreateHotObservable(
  1030. OnNext(220, 3),
  1031. OnError<int>(225, ex)
  1032. );
  1033. var o3 = scheduler.CreateHotObservable(
  1034. OnNext(230, 4),
  1035. OnCompleted<int>(235)
  1036. );
  1037. var res = scheduler.Start(() =>
  1038. Observable.Catch(o1, o2, o3)
  1039. );
  1040. res.Messages.AssertEqual(
  1041. OnNext(210, 2),
  1042. OnNext(220, 3),
  1043. OnNext(230, 4),
  1044. OnCompleted<int>(235)
  1045. );
  1046. o1.Subscriptions.AssertEqual(
  1047. Subscribe(200, 215)
  1048. );
  1049. o2.Subscriptions.AssertEqual(
  1050. Subscribe(215, 225)
  1051. );
  1052. o3.Subscriptions.AssertEqual(
  1053. Subscribe(225, 235)
  1054. );
  1055. }
  1056. [Fact]
  1057. public void Catch_ErrorSpecific_Caught()
  1058. {
  1059. var scheduler = new TestScheduler();
  1060. var ex = new ArgumentException("x");
  1061. var o1 = scheduler.CreateHotObservable(
  1062. OnNext(150, 1),
  1063. OnNext(210, 2),
  1064. OnNext(220, 3),
  1065. OnError<int>(230, ex)
  1066. );
  1067. var o2 = scheduler.CreateHotObservable(
  1068. OnNext(240, 4),
  1069. OnCompleted<int>(250)
  1070. );
  1071. var handlerCalled = default(long?);
  1072. var res = scheduler.Start(() =>
  1073. o1.Catch((ArgumentException ex_) => { handlerCalled = scheduler.Clock; return o2; })
  1074. );
  1075. Assert.Equal(230, handlerCalled);
  1076. res.Messages.AssertEqual(
  1077. OnNext(210, 2),
  1078. OnNext(220, 3),
  1079. OnNext(240, 4),
  1080. OnCompleted<int>(250)
  1081. );
  1082. o1.Subscriptions.AssertEqual(
  1083. Subscribe(200, 230)
  1084. );
  1085. o2.Subscriptions.AssertEqual(
  1086. Subscribe(230, 250)
  1087. );
  1088. }
  1089. [Fact]
  1090. public void Catch_ErrorSpecific_Uncaught()
  1091. {
  1092. var scheduler = new TestScheduler();
  1093. var ex = new InvalidOperationException("x");
  1094. var o1 = scheduler.CreateHotObservable(
  1095. OnNext(150, 1),
  1096. OnNext(210, 2),
  1097. OnNext(220, 3),
  1098. OnError<int>(230, ex)
  1099. );
  1100. var o2 = scheduler.CreateHotObservable(
  1101. OnNext(240, 4),
  1102. OnCompleted<int>(250)
  1103. );
  1104. var handlerCalled = default(long?);
  1105. var res = scheduler.Start(() =>
  1106. o1.Catch((ArgumentException ex_) => { handlerCalled = scheduler.Clock; return o2; })
  1107. );
  1108. Assert.Equal(null, handlerCalled);
  1109. res.Messages.AssertEqual(
  1110. OnNext(210, 2),
  1111. OnNext(220, 3),
  1112. OnError<int>(230, ex)
  1113. );
  1114. o1.Subscriptions.AssertEqual(
  1115. Subscribe(200, 230)
  1116. );
  1117. o2.Subscriptions.AssertEqual(
  1118. );
  1119. }
  1120. [Fact]
  1121. public void Catch_HandlerThrows()
  1122. {
  1123. var scheduler = new TestScheduler();
  1124. var ex1 = new ArgumentException("x");
  1125. var ex2 = new Exception();
  1126. var o1 = scheduler.CreateHotObservable(
  1127. OnNext(150, 1),
  1128. OnNext(210, 2),
  1129. OnNext(220, 3),
  1130. OnError<int>(230, ex1)
  1131. );
  1132. var handlerCalled = default(long?);
  1133. var res = scheduler.Start(() =>
  1134. o1.Catch((ArgumentException ex_) => { handlerCalled = scheduler.Clock; throw ex2; })
  1135. );
  1136. Assert.Equal(230, handlerCalled);
  1137. res.Messages.AssertEqual(
  1138. OnNext(210, 2),
  1139. OnNext(220, 3),
  1140. OnError<int>(230, ex2)
  1141. );
  1142. o1.Subscriptions.AssertEqual(
  1143. Subscribe(200, 230)
  1144. );
  1145. }
  1146. [Fact]
  1147. public void Catch_Nested_OuterCatches()
  1148. {
  1149. var scheduler = new TestScheduler();
  1150. var ex = new ArgumentException("x");
  1151. var o1 = scheduler.CreateHotObservable(
  1152. OnNext(150, 1),
  1153. OnNext(210, 2),
  1154. OnError<int>(215, ex)
  1155. );
  1156. var o2 = scheduler.CreateHotObservable(
  1157. OnNext(220, 3),
  1158. OnCompleted<int>(225)
  1159. );
  1160. var o3 = scheduler.CreateHotObservable(
  1161. OnNext(220, 4), //!
  1162. OnCompleted<int>(225)
  1163. );
  1164. var firstHandlerCalled = default(long?);
  1165. var secondHandlerCalled = default(long?);
  1166. var res = scheduler.Start(() =>
  1167. o1
  1168. .Catch((InvalidOperationException ex_) => { firstHandlerCalled = scheduler.Clock; return o2; })
  1169. .Catch((ArgumentException ex_) => { secondHandlerCalled = scheduler.Clock; return o3; })
  1170. );
  1171. Assert.Equal(null, firstHandlerCalled);
  1172. Assert.Equal(215, secondHandlerCalled);
  1173. res.Messages.AssertEqual(
  1174. OnNext(210, 2),
  1175. OnNext(220, 4),
  1176. OnCompleted<int>(225)
  1177. );
  1178. o1.Subscriptions.AssertEqual(
  1179. Subscribe(200, 215)
  1180. );
  1181. o2.Subscriptions.AssertEqual(
  1182. );
  1183. o3.Subscriptions.AssertEqual(
  1184. Subscribe(215, 225)
  1185. );
  1186. }
  1187. [Fact]
  1188. public void Catch_Nested_InnerCatches()
  1189. {
  1190. var scheduler = new TestScheduler();
  1191. var ex = new ArgumentException("x");
  1192. var o1 = scheduler.CreateHotObservable(
  1193. OnNext(150, 1),
  1194. OnNext(210, 2),
  1195. OnError<int>(215, ex)
  1196. );
  1197. var o2 = scheduler.CreateHotObservable(
  1198. OnNext(220, 3), //!
  1199. OnCompleted<int>(225)
  1200. );
  1201. var o3 = scheduler.CreateHotObservable(
  1202. OnNext(220, 4),
  1203. OnCompleted<int>(225)
  1204. );
  1205. var firstHandlerCalled = default(long?);
  1206. var secondHandlerCalled = default(long?);
  1207. var res = scheduler.Start(() =>
  1208. o1
  1209. .Catch((ArgumentException ex_) => { firstHandlerCalled = scheduler.Clock; return o2; })
  1210. .Catch((InvalidOperationException ex_) => { secondHandlerCalled = scheduler.Clock; return o3; })
  1211. );
  1212. Assert.Equal(215, firstHandlerCalled);
  1213. Assert.Equal(null, secondHandlerCalled);
  1214. res.Messages.AssertEqual(
  1215. OnNext(210, 2),
  1216. OnNext(220, 3),
  1217. OnCompleted<int>(225)
  1218. );
  1219. o1.Subscriptions.AssertEqual(
  1220. Subscribe(200, 215)
  1221. );
  1222. o2.Subscriptions.AssertEqual(
  1223. Subscribe(215, 225)
  1224. );
  1225. o3.Subscriptions.AssertEqual(
  1226. );
  1227. }
  1228. [Fact]
  1229. public void Catch_ThrowFromNestedCatch()
  1230. {
  1231. var scheduler = new TestScheduler();
  1232. var ex1 = new ArgumentException("x1");
  1233. var ex2 = new ArgumentException("x2");
  1234. var o1 = scheduler.CreateHotObservable(
  1235. OnNext(150, 1),
  1236. OnNext(210, 2),
  1237. OnError<int>(215, ex1)
  1238. );
  1239. var o2 = scheduler.CreateHotObservable(
  1240. OnNext(220, 3), //!
  1241. OnError<int>(225, ex2)
  1242. );
  1243. var o3 = scheduler.CreateHotObservable(
  1244. OnNext(230, 4),
  1245. OnCompleted<int>(235)
  1246. );
  1247. var firstHandlerCalled = default(long?);
  1248. var secondHandlerCalled = default(long?);
  1249. var res = scheduler.Start(() =>
  1250. o1
  1251. .Catch((ArgumentException ex_) => { firstHandlerCalled = scheduler.Clock; Assert.True(ex1 == ex_, "Expected ex1"); return o2; })
  1252. .Catch((ArgumentException ex_) => { secondHandlerCalled = scheduler.Clock; Assert.True(ex2 == ex_, "Expected ex2"); return o3; })
  1253. );
  1254. Assert.Equal(215, firstHandlerCalled);
  1255. Assert.Equal(225, secondHandlerCalled);
  1256. res.Messages.AssertEqual(
  1257. OnNext(210, 2),
  1258. OnNext(220, 3),
  1259. OnNext(230, 4),
  1260. OnCompleted<int>(235)
  1261. );
  1262. o1.Subscriptions.AssertEqual(
  1263. Subscribe(200, 215)
  1264. );
  1265. o2.Subscriptions.AssertEqual(
  1266. Subscribe(215, 225)
  1267. );
  1268. o3.Subscriptions.AssertEqual(
  1269. Subscribe(225, 235)
  1270. );
  1271. }
  1272. [Fact]
  1273. public void Catch_DefaultScheduler_Binary()
  1274. {
  1275. var evt = new ManualResetEvent(false);
  1276. int res = 0;
  1277. Observable.Return(1).Catch(Observable.Return(2)).Subscribe(x =>
  1278. {
  1279. res = x;
  1280. evt.Set();
  1281. });
  1282. evt.WaitOne();
  1283. Assert.Equal(1, res);
  1284. }
  1285. [Fact]
  1286. public void Catch_DefaultScheduler_Nary()
  1287. {
  1288. var evt = new ManualResetEvent(false);
  1289. int res = 0;
  1290. Observable.Catch(Observable.Return(1), Observable.Return(2), Observable.Return(3)).Subscribe(x =>
  1291. {
  1292. res = x;
  1293. evt.Set();
  1294. });
  1295. evt.WaitOne();
  1296. Assert.Equal(1, res);
  1297. }
  1298. [Fact]
  1299. public void Catch_DefaultScheduler_NaryEnumerable()
  1300. {
  1301. var evt = new ManualResetEvent(false);
  1302. IEnumerable<IObservable<int>> sources = new[] { Observable.Return(1), Observable.Return(2), Observable.Return(3) };
  1303. int res = 0;
  1304. Observable.Catch(sources).Subscribe(x =>
  1305. {
  1306. res = x;
  1307. evt.Set();
  1308. });
  1309. evt.WaitOne();
  1310. Assert.Equal(1, res);
  1311. }
  1312. [Fact]
  1313. public void Catch_EmptyIterator()
  1314. {
  1315. var scheduler = new TestScheduler();
  1316. var res = scheduler.Start(() =>
  1317. Observable.Catch<int>((IEnumerable<IObservable<int>>)new IObservable<int>[0])
  1318. );
  1319. res.Messages.AssertEqual(
  1320. OnCompleted<int>(200)
  1321. );
  1322. }
  1323. [Fact]
  1324. public void Catch_IteratorThrows()
  1325. {
  1326. var scheduler = new TestScheduler();
  1327. var ex = new Exception();
  1328. var res = scheduler.Start(() =>
  1329. Observable.Catch<int>(Catch_IteratorThrows_Source(ex, true))
  1330. );
  1331. res.Messages.AssertEqual(
  1332. OnError<int>(200, ex)
  1333. );
  1334. }
  1335. private IEnumerable<IObservable<int>> Catch_IteratorThrows_Source(Exception ex, bool b)
  1336. {
  1337. if (b)
  1338. throw ex;
  1339. else
  1340. yield break;
  1341. }
  1342. [Fact]
  1343. public void Catch_EnumerableThrows()
  1344. {
  1345. var scheduler = new TestScheduler();
  1346. var o = scheduler.CreateHotObservable(
  1347. OnNext(150, 1),
  1348. OnNext(210, 2),
  1349. OnNext(220, 3),
  1350. OnCompleted<int>(225)
  1351. );
  1352. var ex = new Exception();
  1353. var xss = new MockEnumerable<IObservable<int>>(scheduler, GetObservablesForCatchThrow(o, ex));
  1354. var res = scheduler.Start(() =>
  1355. xss.Catch()
  1356. );
  1357. res.Messages.AssertEqual(
  1358. OnNext(210, 2),
  1359. OnNext(220, 3),
  1360. OnCompleted<int>(225)
  1361. );
  1362. o.Subscriptions.AssertEqual(
  1363. Subscribe(200, 225)
  1364. );
  1365. xss.Subscriptions.AssertEqual(
  1366. Subscribe(200, 225)
  1367. );
  1368. }
  1369. private IEnumerable<IObservable<int>> GetObservablesForCatchThrow(IObservable<int> first, Exception ex)
  1370. {
  1371. yield return first;
  1372. throw ex;
  1373. }
  1374. [Fact]
  1375. public void Catch_EnumerableTiming()
  1376. {
  1377. var scheduler = new TestScheduler();
  1378. var o1 = scheduler.CreateHotObservable(
  1379. OnNext(150, 1),
  1380. OnNext(210, 2), // !
  1381. OnNext(220, 3), // !
  1382. OnError<int>(230, new Exception())
  1383. );
  1384. var o2 = scheduler.CreateColdObservable(
  1385. OnNext(50, 4), // !
  1386. OnNext(60, 5), // !
  1387. OnNext(70, 6), // !
  1388. OnError<int>(80, new Exception())
  1389. );
  1390. var o3 = scheduler.CreateHotObservable(
  1391. OnNext(150, 1),
  1392. OnNext(200, 2),
  1393. OnNext(210, 3),
  1394. OnNext(220, 4),
  1395. OnNext(230, 5),
  1396. OnNext(270, 6),
  1397. OnNext(320, 7), // !
  1398. OnNext(330, 8), // !
  1399. OnCompleted<int>(340)
  1400. );
  1401. var xss = new MockEnumerable<ITestableObservable<int>>(scheduler, new[] { o1, o2, o3, o2 });
  1402. var res = scheduler.Start(() =>
  1403. xss.Select(xs => (IObservable<int>)xs).Catch()
  1404. );
  1405. res.Messages.AssertEqual(
  1406. OnNext(210, 2),
  1407. OnNext(220, 3),
  1408. OnNext(280, 4),
  1409. OnNext(290, 5),
  1410. OnNext(300, 6),
  1411. OnNext(320, 7),
  1412. OnNext(330, 8),
  1413. OnCompleted<int>(340)
  1414. );
  1415. o1.Subscriptions.AssertEqual(
  1416. Subscribe(200, 230)
  1417. );
  1418. o2.Subscriptions.AssertEqual(
  1419. Subscribe(230, 310)
  1420. );
  1421. o3.Subscriptions.AssertEqual(
  1422. Subscribe(310, 340)
  1423. );
  1424. xss.Subscriptions.AssertEqual(
  1425. Subscribe(200, 340)
  1426. );
  1427. }
  1428. [Fact]
  1429. public void Catch_Enumerable_Dispose()
  1430. {
  1431. var scheduler = new TestScheduler();
  1432. var o1 = scheduler.CreateHotObservable(
  1433. OnNext(150, 1),
  1434. OnNext(210, 2),
  1435. OnNext(220, 3),
  1436. OnError<int>(230, new Exception())
  1437. );
  1438. var o2 = scheduler.CreateHotObservable(
  1439. OnNext(150, 1),
  1440. OnNext(200, 2),
  1441. OnNext(210, 3),
  1442. OnNext(240, 4),
  1443. OnNext(270, 5),
  1444. OnNext(320, 6),
  1445. OnNext(330, 7),
  1446. OnCompleted<int>(340)
  1447. );
  1448. var xss = new MockEnumerable<ITestableObservable<int>>(scheduler, new[] { o1, o2 });
  1449. var res = scheduler.Start(() =>
  1450. xss.Select(xs => (IObservable<int>)xs).Catch(),
  1451. 300
  1452. );
  1453. res.Messages.AssertEqual(
  1454. OnNext(210, 2),
  1455. OnNext(220, 3),
  1456. OnNext(240, 4),
  1457. OnNext(270, 5)
  1458. );
  1459. o1.Subscriptions.AssertEqual(
  1460. Subscribe(200, 230)
  1461. );
  1462. o2.Subscriptions.AssertEqual(
  1463. Subscribe(230, 300)
  1464. );
  1465. xss.Subscriptions.AssertEqual(
  1466. Subscribe(200, 300)
  1467. );
  1468. }
  1469. #if !NO_PERF
  1470. [Fact]
  1471. public void Catch_TailRecursive1()
  1472. {
  1473. var create = 0L;
  1474. var start = 200L;
  1475. var end = 1000L;
  1476. var scheduler = new TestScheduler();
  1477. var o = scheduler.CreateColdObservable<int>(
  1478. OnNext(10, 1),
  1479. OnNext(20, 2),
  1480. OnNext(30, 3),
  1481. OnError<int>(40, new Exception())
  1482. );
  1483. var f = default(Func<IObservable<int>>);
  1484. f = () => Observable.Defer(() => o.Catch(f()));
  1485. var res = scheduler.Start(() => f(), create, start, end);
  1486. var expected = new List<Recorded<Notification<int>>>();
  1487. var t = start;
  1488. while (t <= end)
  1489. {
  1490. var n = (t - start) / 10;
  1491. if (n % 4 != 0)
  1492. {
  1493. expected.Add(OnNext(t, (int)(n % 4)));
  1494. }
  1495. t += 10;
  1496. }
  1497. res.Messages.AssertEqual(expected);
  1498. }
  1499. #if HAS_STACKTRACE && !NO_THREAD
  1500. [Fact]
  1501. public void Catch_TailRecursive2()
  1502. {
  1503. var f = default(Func<int, IObservable<int>>);
  1504. f = x => Observable.Defer(() => Observable.Throw<int>(new Exception(), ThreadPoolScheduler.Instance).StartWith(x).Catch(f(x + 1)));
  1505. var lst = new List<int>();
  1506. f(0).Select(x => new StackTrace().FrameCount).Take(10).ForEach(lst.Add);
  1507. Assert.True(lst.Last() - lst.First() < 10);
  1508. }
  1509. #endif
  1510. [Fact]
  1511. public void Catch_TailRecursive3()
  1512. {
  1513. var ex = new Exception();
  1514. var res =
  1515. Observable.Catch(
  1516. Observable.Defer(() =>
  1517. {
  1518. if (ex != null)
  1519. {
  1520. throw ex;
  1521. }
  1522. return Observable.Return(-2);
  1523. }),
  1524. Observable.Defer(() =>
  1525. {
  1526. if (ex != null)
  1527. {
  1528. throw ex;
  1529. }
  1530. return Observable.Return(-1);
  1531. }),
  1532. Observable.Return(42)
  1533. );
  1534. Assert.Equal(42, res.Wait());
  1535. }
  1536. #endif
  1537. #endregion
  1538. #region + CombineLatest +
  1539. #region ArgumentChecking
  1540. [Fact]
  1541. public void CombineLatest_ArgumentChecking()
  1542. {
  1543. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest<int, int, int>(DummyObservable<int>.Instance, DummyObservable<int>.Instance, null));
  1544. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest<int, int, int>(null, DummyObservable<int>.Instance, (_, __) => 0));
  1545. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest<int, int, int>(DummyObservable<int>.Instance, null, (_, __) => 0));
  1546. }
  1547. [Fact]
  1548. public void CombineLatest_ArgumentCheckingHighArity()
  1549. {
  1550. var xs = DummyObservable<int>.Instance;
  1551. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, (_0, _1) => _0 + _1));
  1552. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), (_0, _1) => _0 + _1));
  1553. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(Func<int, int, int>)));
  1554. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, (_0, _1, _2) => _0 + _1 + _2));
  1555. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, (_0, _1, _2) => _0 + _1 + _2));
  1556. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), (_0, _1, _2) => _0 + _1 + _2));
  1557. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(Func<int, int, int, int>)));
  1558. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3) => _0 + _1 + _2 + _3));
  1559. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3) => _0 + _1 + _2 + _3));
  1560. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3) => _0 + _1 + _2 + _3));
  1561. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3) => _0 + _1 + _2 + _3));
  1562. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(Func<int, int, int, int, int>)));
  1563. #if !NO_LARGEARITY
  1564. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  1565. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  1566. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  1567. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  1568. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  1569. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int>)));
  1570. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  1571. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  1572. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  1573. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  1574. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  1575. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  1576. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int>)));
  1577. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  1578. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  1579. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  1580. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  1581. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  1582. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  1583. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  1584. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int>)));
  1585. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  1586. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  1587. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  1588. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  1589. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  1590. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  1591. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  1592. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  1593. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int>)));
  1594. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  1595. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  1596. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  1597. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  1598. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  1599. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  1600. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  1601. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  1602. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  1603. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int>)));
  1604. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1605. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1606. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1607. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1608. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1609. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1610. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1611. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1612. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1613. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  1614. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int>)));
  1615. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1616. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1617. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1618. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1619. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1620. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1621. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1622. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1623. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1624. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1625. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  1626. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int>)));
  1627. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1628. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1629. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1630. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1631. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1632. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1633. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1634. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1635. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1636. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1637. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1638. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  1639. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  1640. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1641. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1642. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1643. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1644. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1645. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1646. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1647. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1648. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1649. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1650. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1651. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1652. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  1653. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  1654. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1655. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1656. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1657. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1658. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1659. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1660. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1661. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1662. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1663. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1664. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1665. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1666. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1667. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  1668. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  1669. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1670. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1671. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1672. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1673. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1674. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1675. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1676. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1677. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1678. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1679. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1680. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1681. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1682. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1683. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  1684. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  1685. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1686. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1687. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1688. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1689. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1690. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1691. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1692. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1693. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1694. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1695. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1696. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1697. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1698. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1699. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1700. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  1701. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  1702. #endif
  1703. }
  1704. #endregion
  1705. #region Never
  1706. [Fact]
  1707. public void CombineLatest_NeverN()
  1708. {
  1709. var scheduler = new TestScheduler();
  1710. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1711. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1712. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1713. var res = scheduler.Start(() =>
  1714. Observable.CombineLatest(new[] { e0, e1, e2 }, xs => xs.Sum())
  1715. );
  1716. res.Messages.AssertEqual(
  1717. );
  1718. foreach (var e in new[] { e0, e1, e2 })
  1719. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1720. }
  1721. [Fact]
  1722. public void CombineLatest_Never2()
  1723. {
  1724. var scheduler = new TestScheduler();
  1725. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1726. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1727. var res = scheduler.Start(() =>
  1728. Observable.CombineLatest(e0, e1, (_0, _1) => 42)
  1729. );
  1730. res.Messages.AssertEqual(
  1731. );
  1732. foreach (var e in new[] { e0, e1 })
  1733. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1734. }
  1735. [Fact]
  1736. public void CombineLatest_Never3()
  1737. {
  1738. var scheduler = new TestScheduler();
  1739. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1740. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1741. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1742. var res = scheduler.Start(() =>
  1743. Observable.CombineLatest(e0, e1, e2, (_0, _1, _2) => 42)
  1744. );
  1745. res.Messages.AssertEqual(
  1746. );
  1747. foreach (var e in new[] { e0, e1, e2 })
  1748. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1749. }
  1750. [Fact]
  1751. public void CombineLatest_Never4()
  1752. {
  1753. var scheduler = new TestScheduler();
  1754. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1755. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1756. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1757. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1758. var res = scheduler.Start(() =>
  1759. Observable.CombineLatest(e0, e1, e2, e3, (_0, _1, _2, _3) => 42)
  1760. );
  1761. res.Messages.AssertEqual(
  1762. );
  1763. foreach (var e in new[] { e0, e1, e2, e3 })
  1764. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1765. }
  1766. #if !NO_LARGEARITY
  1767. [Fact]
  1768. public void CombineLatest_Never5()
  1769. {
  1770. var scheduler = new TestScheduler();
  1771. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1772. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1773. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1774. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1775. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1776. var res = scheduler.Start(() =>
  1777. Observable.CombineLatest(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => 42)
  1778. );
  1779. res.Messages.AssertEqual(
  1780. );
  1781. foreach (var e in new[] { e0, e1, e2, e3, e4 })
  1782. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1783. }
  1784. [Fact]
  1785. public void CombineLatest_Never6()
  1786. {
  1787. var scheduler = new TestScheduler();
  1788. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1789. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1790. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1791. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1792. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1793. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1794. var res = scheduler.Start(() =>
  1795. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => 42)
  1796. );
  1797. res.Messages.AssertEqual(
  1798. );
  1799. foreach (var e in new[] { e0, e1, e2, e3, e4, e5 })
  1800. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1801. }
  1802. [Fact]
  1803. public void CombineLatest_Never7()
  1804. {
  1805. var scheduler = new TestScheduler();
  1806. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1807. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1808. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1809. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1810. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1811. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1812. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1813. var res = scheduler.Start(() =>
  1814. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => 42)
  1815. );
  1816. res.Messages.AssertEqual(
  1817. );
  1818. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6 })
  1819. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1820. }
  1821. [Fact]
  1822. public void CombineLatest_Never8()
  1823. {
  1824. var scheduler = new TestScheduler();
  1825. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1826. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1827. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1828. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1829. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1830. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1831. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1832. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1833. var res = scheduler.Start(() =>
  1834. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => 42)
  1835. );
  1836. res.Messages.AssertEqual(
  1837. );
  1838. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7 })
  1839. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1840. }
  1841. [Fact]
  1842. public void CombineLatest_Never9()
  1843. {
  1844. var scheduler = new TestScheduler();
  1845. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1846. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1847. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1848. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1849. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1850. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1851. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1852. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1853. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1854. var res = scheduler.Start(() =>
  1855. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => 42)
  1856. );
  1857. res.Messages.AssertEqual(
  1858. );
  1859. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 })
  1860. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1861. }
  1862. [Fact]
  1863. public void CombineLatest_Never10()
  1864. {
  1865. var scheduler = new TestScheduler();
  1866. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1867. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1868. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1869. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1870. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1871. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1872. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1873. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1874. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1875. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1876. var res = scheduler.Start(() =>
  1877. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => 42)
  1878. );
  1879. res.Messages.AssertEqual(
  1880. );
  1881. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 })
  1882. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1883. }
  1884. [Fact]
  1885. public void CombineLatest_Never11()
  1886. {
  1887. var scheduler = new TestScheduler();
  1888. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1889. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1890. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1891. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1892. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1893. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1894. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1895. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1896. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1897. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1898. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1899. var res = scheduler.Start(() =>
  1900. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => 42)
  1901. );
  1902. res.Messages.AssertEqual(
  1903. );
  1904. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 })
  1905. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1906. }
  1907. [Fact]
  1908. public void CombineLatest_Never12()
  1909. {
  1910. var scheduler = new TestScheduler();
  1911. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1912. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1913. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1914. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1915. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1916. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1917. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1918. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1919. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1920. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1921. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1922. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1923. var res = scheduler.Start(() =>
  1924. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => 42)
  1925. );
  1926. res.Messages.AssertEqual(
  1927. );
  1928. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 })
  1929. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1930. }
  1931. [Fact]
  1932. public void CombineLatest_Never13()
  1933. {
  1934. var scheduler = new TestScheduler();
  1935. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1936. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1937. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1938. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1939. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1940. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1941. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1942. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1943. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1944. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1945. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1946. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1947. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1948. var res = scheduler.Start(() =>
  1949. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => 42)
  1950. );
  1951. res.Messages.AssertEqual(
  1952. );
  1953. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 })
  1954. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1955. }
  1956. [Fact]
  1957. public void CombineLatest_Never14()
  1958. {
  1959. var scheduler = new TestScheduler();
  1960. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1961. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1962. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1963. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1964. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1965. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1966. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1967. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1968. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1969. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1970. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1971. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1972. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1973. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1974. var res = scheduler.Start(() =>
  1975. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => 42)
  1976. );
  1977. res.Messages.AssertEqual(
  1978. );
  1979. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 })
  1980. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  1981. }
  1982. [Fact]
  1983. public void CombineLatest_Never15()
  1984. {
  1985. var scheduler = new TestScheduler();
  1986. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1987. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1988. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1989. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1990. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1991. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1992. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1993. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1994. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1995. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1996. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1997. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1998. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  1999. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2000. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2001. var res = scheduler.Start(() =>
  2002. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => 42)
  2003. );
  2004. res.Messages.AssertEqual(
  2005. );
  2006. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 })
  2007. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  2008. }
  2009. [Fact]
  2010. public void CombineLatest_Never16()
  2011. {
  2012. var scheduler = new TestScheduler();
  2013. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2014. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2015. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2016. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2017. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2018. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2019. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2020. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2021. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2022. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2023. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2024. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2025. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2026. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2027. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2028. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  2029. var res = scheduler.Start(() =>
  2030. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => 42)
  2031. );
  2032. res.Messages.AssertEqual(
  2033. );
  2034. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 })
  2035. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  2036. }
  2037. #endif
  2038. #endregion
  2039. #region Never/Empty
  2040. [Fact]
  2041. public void CombineLatest_NeverEmpty()
  2042. {
  2043. var scheduler = new TestScheduler();
  2044. var n = scheduler.CreateHotObservable(
  2045. OnNext(150, 1)
  2046. );
  2047. var e = scheduler.CreateHotObservable(
  2048. OnNext(150, 1),
  2049. OnCompleted<int>(210)
  2050. );
  2051. var res = scheduler.Start(() =>
  2052. n.CombineLatest(e, (x, y) => x + y)
  2053. );
  2054. res.Messages.AssertEqual(
  2055. );
  2056. n.Subscriptions.AssertEqual(
  2057. Subscribe(200, 1000)
  2058. );
  2059. e.Subscriptions.AssertEqual(
  2060. Subscribe(200, 210)
  2061. );
  2062. }
  2063. [Fact]
  2064. public void CombineLatest_EmptyNever()
  2065. {
  2066. var scheduler = new TestScheduler();
  2067. var e = scheduler.CreateHotObservable(
  2068. OnNext(150, 1),
  2069. OnCompleted<int>(210)
  2070. );
  2071. var n = scheduler.CreateHotObservable(
  2072. OnNext(150, 1)
  2073. );
  2074. var res = scheduler.Start(() =>
  2075. e.CombineLatest(n, (x, y) => x + y)
  2076. );
  2077. res.Messages.AssertEqual(
  2078. );
  2079. n.Subscriptions.AssertEqual(
  2080. Subscribe(200, 1000)
  2081. );
  2082. e.Subscriptions.AssertEqual(
  2083. Subscribe(200, 210)
  2084. );
  2085. }
  2086. #endregion
  2087. #region Empty
  2088. [Fact]
  2089. public void CombineLatest_EmptyN()
  2090. {
  2091. var scheduler = new TestScheduler();
  2092. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2093. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2094. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2095. var res = scheduler.Start(() =>
  2096. Observable.CombineLatest(new[] { e0, e1, e2 }, xs => xs.Sum())
  2097. );
  2098. res.Messages.AssertEqual(
  2099. OnCompleted<int>(230)
  2100. );
  2101. var i = 0;
  2102. foreach (var e in new[] { e0, e1, e2 })
  2103. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2104. }
  2105. [Fact]
  2106. public void CombineLatest_Empty2()
  2107. {
  2108. var scheduler = new TestScheduler();
  2109. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2110. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2111. var res = scheduler.Start(() =>
  2112. Observable.CombineLatest(e0, e1, (_0, _1) => 42)
  2113. );
  2114. res.Messages.AssertEqual(
  2115. OnCompleted<int>(220)
  2116. );
  2117. var i = 0;
  2118. foreach (var e in new[] { e0, e1 })
  2119. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2120. }
  2121. [Fact]
  2122. public void CombineLatest_Empty3()
  2123. {
  2124. var scheduler = new TestScheduler();
  2125. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2126. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2127. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2128. var res = scheduler.Start(() =>
  2129. Observable.CombineLatest(e0, e1, e2, (_0, _1, _2) => 42)
  2130. );
  2131. res.Messages.AssertEqual(
  2132. OnCompleted<int>(230)
  2133. );
  2134. var i = 0;
  2135. foreach (var e in new[] { e0, e1, e2 })
  2136. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2137. }
  2138. [Fact]
  2139. public void CombineLatest_Empty4()
  2140. {
  2141. var scheduler = new TestScheduler();
  2142. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2143. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2144. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2145. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2146. var res = scheduler.Start(() =>
  2147. Observable.CombineLatest(e0, e1, e2, e3, (_0, _1, _2, _3) => 42)
  2148. );
  2149. res.Messages.AssertEqual(
  2150. OnCompleted<int>(240)
  2151. );
  2152. var i = 0;
  2153. foreach (var e in new[] { e0, e1, e2, e3 })
  2154. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2155. }
  2156. #if !NO_LARGEARITY
  2157. [Fact]
  2158. public void CombineLatest_Empty5()
  2159. {
  2160. var scheduler = new TestScheduler();
  2161. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2162. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2163. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2164. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2165. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2166. var res = scheduler.Start(() =>
  2167. Observable.CombineLatest(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => 42)
  2168. );
  2169. res.Messages.AssertEqual(
  2170. OnCompleted<int>(250)
  2171. );
  2172. var i = 0;
  2173. foreach (var e in new[] { e0, e1, e2, e3, e4 })
  2174. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2175. }
  2176. [Fact]
  2177. public void CombineLatest_Empty6()
  2178. {
  2179. var scheduler = new TestScheduler();
  2180. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2181. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2182. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2183. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2184. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2185. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2186. var res = scheduler.Start(() =>
  2187. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => 42)
  2188. );
  2189. res.Messages.AssertEqual(
  2190. OnCompleted<int>(260)
  2191. );
  2192. var i = 0;
  2193. foreach (var e in new[] { e0, e1, e2, e3, e4, e5 })
  2194. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2195. }
  2196. [Fact]
  2197. public void CombineLatest_Empty7()
  2198. {
  2199. var scheduler = new TestScheduler();
  2200. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2201. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2202. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2203. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2204. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2205. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2206. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2207. var res = scheduler.Start(() =>
  2208. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => 42)
  2209. );
  2210. res.Messages.AssertEqual(
  2211. OnCompleted<int>(270)
  2212. );
  2213. var i = 0;
  2214. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6 })
  2215. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2216. }
  2217. [Fact]
  2218. public void CombineLatest_Empty8()
  2219. {
  2220. var scheduler = new TestScheduler();
  2221. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2222. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2223. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2224. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2225. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2226. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2227. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2228. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  2229. var res = scheduler.Start(() =>
  2230. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => 42)
  2231. );
  2232. res.Messages.AssertEqual(
  2233. OnCompleted<int>(280)
  2234. );
  2235. var i = 0;
  2236. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7 })
  2237. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2238. }
  2239. [Fact]
  2240. public void CombineLatest_Empty9()
  2241. {
  2242. var scheduler = new TestScheduler();
  2243. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2244. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2245. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2246. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2247. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2248. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2249. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2250. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  2251. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  2252. var res = scheduler.Start(() =>
  2253. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => 42)
  2254. );
  2255. res.Messages.AssertEqual(
  2256. OnCompleted<int>(290)
  2257. );
  2258. var i = 0;
  2259. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 })
  2260. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2261. }
  2262. [Fact]
  2263. public void CombineLatest_Empty10()
  2264. {
  2265. var scheduler = new TestScheduler();
  2266. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2267. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2268. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2269. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2270. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2271. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2272. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2273. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  2274. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  2275. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  2276. var res = scheduler.Start(() =>
  2277. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => 42)
  2278. );
  2279. res.Messages.AssertEqual(
  2280. OnCompleted<int>(300)
  2281. );
  2282. var i = 0;
  2283. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 })
  2284. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2285. }
  2286. [Fact]
  2287. public void CombineLatest_Empty11()
  2288. {
  2289. var scheduler = new TestScheduler();
  2290. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2291. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2292. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2293. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2294. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2295. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2296. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2297. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  2298. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  2299. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  2300. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  2301. var res = scheduler.Start(() =>
  2302. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => 42)
  2303. );
  2304. res.Messages.AssertEqual(
  2305. OnCompleted<int>(310)
  2306. );
  2307. var i = 0;
  2308. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 })
  2309. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2310. }
  2311. [Fact]
  2312. public void CombineLatest_Empty12()
  2313. {
  2314. var scheduler = new TestScheduler();
  2315. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2316. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2317. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2318. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2319. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2320. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2321. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2322. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  2323. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  2324. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  2325. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  2326. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  2327. var res = scheduler.Start(() =>
  2328. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => 42)
  2329. );
  2330. res.Messages.AssertEqual(
  2331. OnCompleted<int>(320)
  2332. );
  2333. var i = 0;
  2334. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 })
  2335. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2336. }
  2337. [Fact]
  2338. public void CombineLatest_Empty13()
  2339. {
  2340. var scheduler = new TestScheduler();
  2341. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2342. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2343. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2344. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2345. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2346. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2347. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2348. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  2349. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  2350. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  2351. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  2352. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  2353. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  2354. var res = scheduler.Start(() =>
  2355. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => 42)
  2356. );
  2357. res.Messages.AssertEqual(
  2358. OnCompleted<int>(330)
  2359. );
  2360. var i = 0;
  2361. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 })
  2362. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2363. }
  2364. [Fact]
  2365. public void CombineLatest_Empty14()
  2366. {
  2367. var scheduler = new TestScheduler();
  2368. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2369. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2370. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2371. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2372. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2373. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2374. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2375. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  2376. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  2377. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  2378. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  2379. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  2380. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  2381. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  2382. var res = scheduler.Start(() =>
  2383. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => 42)
  2384. );
  2385. res.Messages.AssertEqual(
  2386. OnCompleted<int>(340)
  2387. );
  2388. var i = 0;
  2389. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 })
  2390. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2391. }
  2392. [Fact]
  2393. public void CombineLatest_Empty15()
  2394. {
  2395. var scheduler = new TestScheduler();
  2396. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2397. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2398. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2399. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2400. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2401. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2402. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2403. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  2404. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  2405. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  2406. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  2407. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  2408. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  2409. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  2410. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(350) });
  2411. var res = scheduler.Start(() =>
  2412. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => 42)
  2413. );
  2414. res.Messages.AssertEqual(
  2415. OnCompleted<int>(350)
  2416. );
  2417. var i = 0;
  2418. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 })
  2419. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2420. }
  2421. [Fact]
  2422. public void CombineLatest_Empty16()
  2423. {
  2424. var scheduler = new TestScheduler();
  2425. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  2426. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  2427. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  2428. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  2429. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  2430. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  2431. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  2432. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  2433. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  2434. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  2435. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  2436. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  2437. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  2438. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  2439. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(350) });
  2440. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(360) });
  2441. var res = scheduler.Start(() =>
  2442. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => 42)
  2443. );
  2444. res.Messages.AssertEqual(
  2445. OnCompleted<int>(360)
  2446. );
  2447. var i = 0;
  2448. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 })
  2449. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  2450. }
  2451. #endif
  2452. #endregion
  2453. #region Empty/Return
  2454. [Fact]
  2455. public void CombineLatest_EmptyReturn()
  2456. {
  2457. var scheduler = new TestScheduler();
  2458. var e = scheduler.CreateHotObservable(
  2459. OnNext(150, 1),
  2460. OnCompleted<int>(210)
  2461. );
  2462. var o = scheduler.CreateHotObservable(
  2463. OnNext(150, 1),
  2464. OnNext(215, 2),
  2465. OnCompleted<int>(220)
  2466. );
  2467. var res = scheduler.Start(() =>
  2468. e.CombineLatest(o, (x, y) => x + y)
  2469. );
  2470. res.Messages.AssertEqual(
  2471. OnCompleted<int>(215)
  2472. );
  2473. e.Subscriptions.AssertEqual(
  2474. Subscribe(200, 210)
  2475. );
  2476. o.Subscriptions.AssertEqual(
  2477. Subscribe(200, 215)
  2478. );
  2479. }
  2480. [Fact]
  2481. public void CombineLatest_ReturnEmpty()
  2482. {
  2483. var scheduler = new TestScheduler();
  2484. var e = scheduler.CreateHotObservable(
  2485. OnNext(150, 1),
  2486. OnCompleted<int>(210)
  2487. );
  2488. var o = scheduler.CreateHotObservable(
  2489. OnNext(150, 1),
  2490. OnNext(215, 2),
  2491. OnCompleted<int>(220)
  2492. );
  2493. var res = scheduler.Start(() =>
  2494. o.CombineLatest(e, (x, y) => x + y)
  2495. );
  2496. res.Messages.AssertEqual(
  2497. OnCompleted<int>(215)
  2498. );
  2499. e.Subscriptions.AssertEqual(
  2500. Subscribe(200, 210)
  2501. );
  2502. o.Subscriptions.AssertEqual(
  2503. Subscribe(200, 215)
  2504. );
  2505. }
  2506. #endregion
  2507. #region Never/Return
  2508. [Fact]
  2509. public void CombineLatest_NeverReturn()
  2510. {
  2511. var scheduler = new TestScheduler();
  2512. var o = scheduler.CreateHotObservable(
  2513. OnNext(150, 1),
  2514. OnNext(215, 2),
  2515. OnCompleted<int>(220)
  2516. );
  2517. var n = scheduler.CreateHotObservable(
  2518. OnNext(150, 1)
  2519. );
  2520. var res = scheduler.Start(() =>
  2521. n.CombineLatest(o, (x, y) => x + y)
  2522. );
  2523. res.Messages.AssertEqual(
  2524. );
  2525. o.Subscriptions.AssertEqual(
  2526. Subscribe(200, 220)
  2527. );
  2528. n.Subscriptions.AssertEqual(
  2529. Subscribe(200, 1000)
  2530. );
  2531. }
  2532. [Fact]
  2533. public void CombineLatest_ReturnNever()
  2534. {
  2535. var scheduler = new TestScheduler();
  2536. var o = scheduler.CreateHotObservable(
  2537. OnNext(150, 1),
  2538. OnNext(215, 2),
  2539. OnCompleted<int>(220)
  2540. );
  2541. var n = scheduler.CreateHotObservable(
  2542. OnNext(150, 1)
  2543. );
  2544. var res = scheduler.Start(() =>
  2545. o.CombineLatest(n, (x, y) => x + y)
  2546. );
  2547. res.Messages.AssertEqual(
  2548. );
  2549. o.Subscriptions.AssertEqual(
  2550. Subscribe(200, 220)
  2551. );
  2552. n.Subscriptions.AssertEqual(
  2553. Subscribe(200, 1000)
  2554. );
  2555. }
  2556. #endregion
  2557. #region Return/Return
  2558. [Fact]
  2559. public void CombineLatest_ReturnReturn()
  2560. {
  2561. var scheduler = new TestScheduler();
  2562. var o1 = scheduler.CreateHotObservable(
  2563. OnNext(150, 1),
  2564. OnNext(215, 2),
  2565. OnCompleted<int>(230)
  2566. );
  2567. var o2 = scheduler.CreateHotObservable(
  2568. OnNext(150, 1),
  2569. OnNext(220, 3),
  2570. OnCompleted<int>(240)
  2571. );
  2572. var res = scheduler.Start(() =>
  2573. o1.CombineLatest(o2, (x, y) => x + y)
  2574. );
  2575. res.Messages.AssertEqual(
  2576. OnNext(220, 2 + 3),
  2577. OnCompleted<int>(240)
  2578. );
  2579. o1.Subscriptions.AssertEqual(
  2580. Subscribe(200, 230)
  2581. );
  2582. o2.Subscriptions.AssertEqual(
  2583. Subscribe(200, 240)
  2584. );
  2585. }
  2586. #endregion
  2587. #region Empty/Error
  2588. [Fact]
  2589. public void CombineLatest_EmptyError()
  2590. {
  2591. var scheduler = new TestScheduler();
  2592. var ex = new Exception();
  2593. var o1 = scheduler.CreateHotObservable(
  2594. OnNext(150, 1),
  2595. OnCompleted<int>(230)
  2596. );
  2597. var o2 = scheduler.CreateHotObservable(
  2598. OnNext(150, 1),
  2599. OnError<int>(220, ex)
  2600. );
  2601. var res = scheduler.Start(() =>
  2602. o1.CombineLatest(o2, (x, y) => x + y)
  2603. );
  2604. res.Messages.AssertEqual(
  2605. OnError<int>(220, ex)
  2606. );
  2607. o1.Subscriptions.AssertEqual(
  2608. Subscribe(200, 220)
  2609. );
  2610. o2.Subscriptions.AssertEqual(
  2611. Subscribe(200, 220)
  2612. );
  2613. }
  2614. [Fact]
  2615. public void CombineLatest_ErrorEmpty()
  2616. {
  2617. var scheduler = new TestScheduler();
  2618. var ex = new Exception();
  2619. var e = scheduler.CreateHotObservable(
  2620. OnNext(150, 1),
  2621. OnCompleted<int>(230)
  2622. );
  2623. var f = scheduler.CreateHotObservable(
  2624. OnNext(150, 1),
  2625. OnError<int>(220, ex)
  2626. );
  2627. var res = scheduler.Start(() =>
  2628. f.CombineLatest(e, (x, y) => x + y)
  2629. );
  2630. res.Messages.AssertEqual(
  2631. OnError<int>(220, ex)
  2632. );
  2633. e.Subscriptions.AssertEqual(
  2634. Subscribe(200, 220)
  2635. );
  2636. f.Subscriptions.AssertEqual(
  2637. Subscribe(200, 220)
  2638. );
  2639. }
  2640. #endregion
  2641. #region Return/Throw
  2642. [Fact]
  2643. public void CombineLatest_ReturnThrow()
  2644. {
  2645. var scheduler = new TestScheduler();
  2646. var ex = new Exception();
  2647. var o1 = scheduler.CreateHotObservable(
  2648. OnNext(150, 1),
  2649. OnNext(210, 2),
  2650. OnCompleted<int>(230)
  2651. );
  2652. var o2 = scheduler.CreateHotObservable(
  2653. OnNext(150, 1),
  2654. OnError<int>(220, ex)
  2655. );
  2656. var res = scheduler.Start(() =>
  2657. o1.CombineLatest(o2, (x, y) => x + y)
  2658. );
  2659. res.Messages.AssertEqual(
  2660. OnError<int>(220, ex)
  2661. );
  2662. o1.Subscriptions.AssertEqual(
  2663. Subscribe(200, 220)
  2664. );
  2665. o2.Subscriptions.AssertEqual(
  2666. Subscribe(200, 220)
  2667. );
  2668. }
  2669. [Fact]
  2670. public void CombineLatest_ThrowReturn()
  2671. {
  2672. var scheduler = new TestScheduler();
  2673. var ex = new Exception();
  2674. var o1 = scheduler.CreateHotObservable(
  2675. OnNext(150, 1),
  2676. OnNext(210, 2),
  2677. OnCompleted<int>(230)
  2678. );
  2679. var o2 = scheduler.CreateHotObservable(
  2680. OnNext(150, 1),
  2681. OnError<int>(220, ex)
  2682. );
  2683. var res = scheduler.Start(() =>
  2684. o2.CombineLatest(o1, (x, y) => x + y)
  2685. );
  2686. res.Messages.AssertEqual(
  2687. OnError<int>(220, ex)
  2688. );
  2689. o1.Subscriptions.AssertEqual(
  2690. Subscribe(200, 220)
  2691. );
  2692. o2.Subscriptions.AssertEqual(
  2693. Subscribe(200, 220)
  2694. );
  2695. }
  2696. #endregion
  2697. #region Throw/Throw
  2698. [Fact]
  2699. public void CombineLatest_ThrowThrow()
  2700. {
  2701. var scheduler = new TestScheduler();
  2702. var ex1 = new Exception();
  2703. var ex2 = new Exception();
  2704. var o1 = scheduler.CreateHotObservable(
  2705. OnNext(150, 1),
  2706. OnError<int>(220, ex1)
  2707. );
  2708. var o2 = scheduler.CreateHotObservable(
  2709. OnNext(150, 1),
  2710. OnError<int>(230, ex2)
  2711. );
  2712. var res = scheduler.Start(() =>
  2713. o2.CombineLatest(o1, (x, y) => x + y)
  2714. );
  2715. res.Messages.AssertEqual(
  2716. OnError<int>(220, ex1)
  2717. );
  2718. o1.Subscriptions.AssertEqual(
  2719. Subscribe(200, 220)
  2720. );
  2721. o2.Subscriptions.AssertEqual(
  2722. Subscribe(200, 220)
  2723. );
  2724. }
  2725. [Fact]
  2726. public void CombineLatest_ErrorThrow()
  2727. {
  2728. var scheduler = new TestScheduler();
  2729. var ex1 = new Exception();
  2730. var ex2 = new Exception();
  2731. var o1 = scheduler.CreateHotObservable(
  2732. OnNext(150, 1),
  2733. OnNext(210, 2),
  2734. OnError<int>(220, ex1)
  2735. );
  2736. var o2 = scheduler.CreateHotObservable(
  2737. OnNext(150, 1),
  2738. OnError<int>(230, ex2)
  2739. );
  2740. var res = scheduler.Start(() =>
  2741. o2.CombineLatest(o1, (x, y) => x + y)
  2742. );
  2743. res.Messages.AssertEqual(
  2744. OnError<int>(220, ex1)
  2745. );
  2746. o1.Subscriptions.AssertEqual(
  2747. Subscribe(200, 220)
  2748. );
  2749. o2.Subscriptions.AssertEqual(
  2750. Subscribe(200, 220)
  2751. );
  2752. }
  2753. [Fact]
  2754. public void CombineLatest_ThrowError()
  2755. {
  2756. var scheduler = new TestScheduler();
  2757. var ex1 = new Exception();
  2758. var ex2 = new Exception();
  2759. var o1 = scheduler.CreateHotObservable(
  2760. OnNext(150, 1),
  2761. OnNext(210, 2),
  2762. OnError<int>(220, ex1)
  2763. );
  2764. var o2 = scheduler.CreateHotObservable(
  2765. OnNext(150, 1),
  2766. OnError<int>(230, ex2)
  2767. );
  2768. var res = scheduler.Start(() =>
  2769. o1.CombineLatest(o2, (x, y) => x + y)
  2770. );
  2771. res.Messages.AssertEqual(
  2772. OnError<int>(220, ex1)
  2773. );
  2774. o1.Subscriptions.AssertEqual(
  2775. Subscribe(200, 220)
  2776. );
  2777. o2.Subscriptions.AssertEqual(
  2778. Subscribe(200, 220)
  2779. );
  2780. }
  2781. #endregion
  2782. #region Never/Throw
  2783. [Fact]
  2784. public void CombineLatest_NeverThrow()
  2785. {
  2786. var scheduler = new TestScheduler();
  2787. var ex = new Exception();
  2788. var o1 = scheduler.CreateHotObservable(
  2789. OnNext(150, 1)
  2790. );
  2791. var o2 = scheduler.CreateHotObservable(
  2792. OnNext(150, 1),
  2793. OnError<int>(220, ex)
  2794. );
  2795. var res = scheduler.Start(() =>
  2796. o1.CombineLatest(o2, (x, y) => x + y)
  2797. );
  2798. res.Messages.AssertEqual(
  2799. OnError<int>(220, ex)
  2800. );
  2801. o1.Subscriptions.AssertEqual(
  2802. Subscribe(200, 220)
  2803. );
  2804. o2.Subscriptions.AssertEqual(
  2805. Subscribe(200, 220)
  2806. );
  2807. }
  2808. [Fact]
  2809. public void CombineLatest_ThrowNever()
  2810. {
  2811. var scheduler = new TestScheduler();
  2812. var ex = new Exception();
  2813. var o1 = scheduler.CreateHotObservable(
  2814. OnNext(150, 1)
  2815. );
  2816. var o2 = scheduler.CreateHotObservable(
  2817. OnNext(150, 1),
  2818. OnError<int>(220, ex)
  2819. );
  2820. var res = scheduler.Start(() =>
  2821. o2.CombineLatest(o1, (x, y) => x + y)
  2822. );
  2823. res.Messages.AssertEqual(
  2824. OnError<int>(220, ex)
  2825. );
  2826. o1.Subscriptions.AssertEqual(
  2827. Subscribe(200, 220)
  2828. );
  2829. o2.Subscriptions.AssertEqual(
  2830. Subscribe(200, 220)
  2831. );
  2832. }
  2833. #endregion
  2834. #region Some/Throw
  2835. [Fact]
  2836. public void CombineLatest_SomeThrow()
  2837. {
  2838. var scheduler = new TestScheduler();
  2839. var ex = new Exception();
  2840. var o1 = scheduler.CreateHotObservable(
  2841. OnNext(150, 1),
  2842. OnNext(215, 2),
  2843. OnCompleted<int>(230)
  2844. );
  2845. var o2 = scheduler.CreateHotObservable(
  2846. OnNext(150, 1),
  2847. OnError<int>(220, ex)
  2848. );
  2849. var res = scheduler.Start(() =>
  2850. o1.CombineLatest(o2, (x, y) => x + y)
  2851. );
  2852. res.Messages.AssertEqual(
  2853. OnError<int>(220, ex)
  2854. );
  2855. o1.Subscriptions.AssertEqual(
  2856. Subscribe(200, 220)
  2857. );
  2858. o2.Subscriptions.AssertEqual(
  2859. Subscribe(200, 220)
  2860. );
  2861. }
  2862. [Fact]
  2863. public void CombineLatest_ThrowSome()
  2864. {
  2865. var scheduler = new TestScheduler();
  2866. var ex = new Exception();
  2867. var o1 = scheduler.CreateHotObservable(
  2868. OnNext(150, 1),
  2869. OnNext(215, 2),
  2870. OnCompleted<int>(230)
  2871. );
  2872. var o2 = scheduler.CreateHotObservable(
  2873. OnNext(150, 1),
  2874. OnError<int>(220, ex)
  2875. );
  2876. var res = scheduler.Start(() =>
  2877. o2.CombineLatest(o1, (x, y) => x + y)
  2878. );
  2879. res.Messages.AssertEqual(
  2880. OnError<int>(220, ex)
  2881. );
  2882. o1.Subscriptions.AssertEqual(
  2883. Subscribe(200, 220)
  2884. );
  2885. o2.Subscriptions.AssertEqual(
  2886. Subscribe(200, 220)
  2887. );
  2888. }
  2889. #endregion
  2890. #region ThrowAfterCompleted
  2891. [Fact]
  2892. public void CombineLatest_ThrowAfterCompleteLeft()
  2893. {
  2894. var scheduler = new TestScheduler();
  2895. var ex = new Exception();
  2896. var o1 = scheduler.CreateHotObservable(
  2897. OnNext(150, 1),
  2898. OnNext(215, 2),
  2899. OnCompleted<int>(220)
  2900. );
  2901. var o2 = scheduler.CreateHotObservable(
  2902. OnNext(150, 1),
  2903. OnError<int>(230, ex)
  2904. );
  2905. var res = scheduler.Start(() =>
  2906. o2.CombineLatest(o1, (x, y) => x + y)
  2907. );
  2908. res.Messages.AssertEqual(
  2909. OnError<int>(230, ex)
  2910. );
  2911. o1.Subscriptions.AssertEqual(
  2912. Subscribe(200, 220)
  2913. );
  2914. o2.Subscriptions.AssertEqual(
  2915. Subscribe(200, 230)
  2916. );
  2917. }
  2918. [Fact]
  2919. public void CombineLatest_ThrowAfterCompleteRight()
  2920. {
  2921. var scheduler = new TestScheduler();
  2922. var ex = new Exception();
  2923. var o1 = scheduler.CreateHotObservable(
  2924. OnNext(150, 1),
  2925. OnNext(215, 2),
  2926. OnCompleted<int>(220)
  2927. );
  2928. var o2 = scheduler.CreateHotObservable(
  2929. OnNext(150, 1),
  2930. OnError<int>(230, ex)
  2931. );
  2932. var res = scheduler.Start(() =>
  2933. o1.CombineLatest(o2, (x, y) => x + y)
  2934. );
  2935. res.Messages.AssertEqual(
  2936. OnError<int>(230, ex)
  2937. );
  2938. o1.Subscriptions.AssertEqual(
  2939. Subscribe(200, 220)
  2940. );
  2941. o2.Subscriptions.AssertEqual(
  2942. Subscribe(200, 230)
  2943. );
  2944. }
  2945. #endregion
  2946. #region Basics
  2947. [Fact]
  2948. public void CombineLatest_InterleavedWithTail()
  2949. {
  2950. var scheduler = new TestScheduler();
  2951. var o1 = scheduler.CreateHotObservable(
  2952. OnNext(150, 1),
  2953. OnNext(215, 2),
  2954. OnNext(225, 4),
  2955. OnCompleted<int>(230)
  2956. );
  2957. var o2 = scheduler.CreateHotObservable(
  2958. OnNext(150, 1),
  2959. OnNext(220, 3),
  2960. OnNext(230, 5),
  2961. OnNext(235, 6),
  2962. OnNext(240, 7),
  2963. OnCompleted<int>(250)
  2964. );
  2965. var res = scheduler.Start(() =>
  2966. o2.CombineLatest(o1, (x, y) => x + y)
  2967. );
  2968. res.Messages.AssertEqual(
  2969. OnNext(220, 2 + 3),
  2970. OnNext(225, 3 + 4),
  2971. OnNext(230, 4 + 5),
  2972. OnNext(235, 4 + 6),
  2973. OnNext(240, 4 + 7),
  2974. OnCompleted<int>(250)
  2975. );
  2976. o1.Subscriptions.AssertEqual(
  2977. Subscribe(200, 230)
  2978. );
  2979. o2.Subscriptions.AssertEqual(
  2980. Subscribe(200, 250)
  2981. );
  2982. }
  2983. [Fact]
  2984. public void CombineLatest_Consecutive()
  2985. {
  2986. var scheduler = new TestScheduler();
  2987. var o1 = scheduler.CreateHotObservable(
  2988. OnNext(150, 1),
  2989. OnNext(215, 2),
  2990. OnNext(225, 4),
  2991. OnCompleted<int>(230)
  2992. );
  2993. var o2 = scheduler.CreateHotObservable(
  2994. OnNext(150, 1),
  2995. OnNext(235, 6),
  2996. OnNext(240, 7),
  2997. OnCompleted<int>(250)
  2998. );
  2999. var res = scheduler.Start(() =>
  3000. o2.CombineLatest(o1, (x, y) => x + y)
  3001. );
  3002. res.Messages.AssertEqual(
  3003. OnNext(235, 4 + 6),
  3004. OnNext(240, 4 + 7),
  3005. OnCompleted<int>(250)
  3006. );
  3007. o1.Subscriptions.AssertEqual(
  3008. Subscribe(200, 230)
  3009. );
  3010. o2.Subscriptions.AssertEqual(
  3011. Subscribe(200, 250)
  3012. );
  3013. }
  3014. [Fact]
  3015. public void CombineLatest_ConsecutiveEndWithErrorLeft()
  3016. {
  3017. var scheduler = new TestScheduler();
  3018. var ex = new Exception();
  3019. var o1 = scheduler.CreateHotObservable(
  3020. OnNext(150, 1),
  3021. OnNext(215, 2),
  3022. OnNext(225, 4),
  3023. OnError<int>(230, ex)
  3024. );
  3025. var o2 = scheduler.CreateHotObservable(
  3026. OnNext(150, 1),
  3027. OnNext(235, 6),
  3028. OnNext(240, 7),
  3029. OnCompleted<int>(250)
  3030. );
  3031. var res = scheduler.Start(() =>
  3032. o2.CombineLatest(o1, (x, y) => x + y)
  3033. );
  3034. res.Messages.AssertEqual(
  3035. OnError<int>(230, ex)
  3036. );
  3037. o1.Subscriptions.AssertEqual(
  3038. Subscribe(200, 230)
  3039. );
  3040. o2.Subscriptions.AssertEqual(
  3041. Subscribe(200, 230)
  3042. );
  3043. }
  3044. [Fact]
  3045. public void CombineLatest_ConsecutiveEndWithErrorRight()
  3046. {
  3047. var scheduler = new TestScheduler();
  3048. var ex = new Exception();
  3049. var o1 = scheduler.CreateHotObservable(
  3050. OnNext(150, 1),
  3051. OnNext(215, 2),
  3052. OnNext(225, 4),
  3053. OnCompleted<int>(250)
  3054. );
  3055. var o2 = scheduler.CreateHotObservable(
  3056. OnNext(150, 1),
  3057. OnNext(235, 6),
  3058. OnNext(240, 7),
  3059. OnError<int>(245, ex)
  3060. );
  3061. var res = scheduler.Start(() =>
  3062. o2.CombineLatest(o1, (x, y) => x + y)
  3063. );
  3064. res.Messages.AssertEqual(
  3065. OnNext(235, 4 + 6),
  3066. OnNext(240, 4 + 7),
  3067. OnError<int>(245, ex)
  3068. );
  3069. o1.Subscriptions.AssertEqual(
  3070. Subscribe(200, 245)
  3071. );
  3072. o2.Subscriptions.AssertEqual(
  3073. Subscribe(200, 245)
  3074. );
  3075. }
  3076. #endregion
  3077. #region SelectorThrows
  3078. [Fact]
  3079. public void CombineLatest_SelectorThrows()
  3080. {
  3081. var scheduler = new TestScheduler();
  3082. var o1 = scheduler.CreateHotObservable(
  3083. OnNext(150, 1),
  3084. OnNext(215, 2),
  3085. OnCompleted<int>(230)
  3086. );
  3087. var o2 = scheduler.CreateHotObservable(
  3088. OnNext(150, 1),
  3089. OnNext(220, 3),
  3090. OnCompleted<int>(240)
  3091. );
  3092. var ex = new Exception();
  3093. var res = scheduler.Start(() =>
  3094. o2.CombineLatest<int, int, int>(o1, (x, y) => { throw ex; })
  3095. );
  3096. res.Messages.AssertEqual(
  3097. OnError<int>(220, ex)
  3098. );
  3099. o1.Subscriptions.AssertEqual(
  3100. Subscribe(200, 220)
  3101. );
  3102. o2.Subscriptions.AssertEqual(
  3103. Subscribe(200, 220)
  3104. );
  3105. }
  3106. [Fact]
  3107. public void CombineLatest_SelectorThrowsN()
  3108. {
  3109. var scheduler = new TestScheduler();
  3110. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3111. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3112. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3113. var ex = new Exception();
  3114. Func<IList<int>, int> f = xs => { throw ex; };
  3115. var res = scheduler.Start(() =>
  3116. Observable.CombineLatest(new[] { e0, e1, e2 }, f)
  3117. );
  3118. res.Messages.AssertEqual(
  3119. OnError<int>(230, ex)
  3120. );
  3121. var es = new[] { e0, e1, e2 };
  3122. foreach (var e in es)
  3123. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3124. }
  3125. [Fact]
  3126. public void CombineLatest_SelectorThrows2()
  3127. {
  3128. var scheduler = new TestScheduler();
  3129. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3130. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3131. var ex = new Exception();
  3132. Func<int> f = () => { throw ex; };
  3133. var res = scheduler.Start(() =>
  3134. Observable.CombineLatest(e0, e1, (_0, _1) => f())
  3135. );
  3136. res.Messages.AssertEqual(
  3137. OnError<int>(220, ex)
  3138. );
  3139. var es = new[] { e0, e1 };
  3140. foreach (var e in es)
  3141. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3142. }
  3143. [Fact]
  3144. public void CombineLatest_SelectorThrows3()
  3145. {
  3146. var scheduler = new TestScheduler();
  3147. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3148. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3149. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3150. var ex = new Exception();
  3151. Func<int> f = () => { throw ex; };
  3152. var res = scheduler.Start(() =>
  3153. Observable.CombineLatest(e0, e1, e2, (_0, _1, _2) => f())
  3154. );
  3155. res.Messages.AssertEqual(
  3156. OnError<int>(230, ex)
  3157. );
  3158. var es = new[] { e0, e1, e2 };
  3159. foreach (var e in es)
  3160. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3161. }
  3162. [Fact]
  3163. public void CombineLatest_SelectorThrows4()
  3164. {
  3165. var scheduler = new TestScheduler();
  3166. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3167. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3168. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3169. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3170. var ex = new Exception();
  3171. Func<int> f = () => { throw ex; };
  3172. var res = scheduler.Start(() =>
  3173. Observable.CombineLatest(e0, e1, e2, e3, (_0, _1, _2, _3) => f())
  3174. );
  3175. res.Messages.AssertEqual(
  3176. OnError<int>(240, ex)
  3177. );
  3178. var es = new[] { e0, e1, e2, e3 };
  3179. foreach (var e in es)
  3180. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3181. }
  3182. #if !NO_LARGEARITY
  3183. [Fact]
  3184. public void CombineLatest_SelectorThrows5()
  3185. {
  3186. var scheduler = new TestScheduler();
  3187. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3188. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3189. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3190. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3191. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3192. var ex = new Exception();
  3193. Func<int> f = () => { throw ex; };
  3194. var res = scheduler.Start(() =>
  3195. Observable.CombineLatest(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => f())
  3196. );
  3197. res.Messages.AssertEqual(
  3198. OnError<int>(250, ex)
  3199. );
  3200. var es = new[] { e0, e1, e2, e3, e4 };
  3201. foreach (var e in es)
  3202. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3203. }
  3204. [Fact]
  3205. public void CombineLatest_SelectorThrows6()
  3206. {
  3207. var scheduler = new TestScheduler();
  3208. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3209. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3210. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3211. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3212. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3213. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3214. var ex = new Exception();
  3215. Func<int> f = () => { throw ex; };
  3216. var res = scheduler.Start(() =>
  3217. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => f())
  3218. );
  3219. res.Messages.AssertEqual(
  3220. OnError<int>(260, ex)
  3221. );
  3222. var es = new[] { e0, e1, e2, e3, e4, e5 };
  3223. foreach (var e in es)
  3224. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3225. }
  3226. [Fact]
  3227. public void CombineLatest_SelectorThrows7()
  3228. {
  3229. var scheduler = new TestScheduler();
  3230. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3231. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3232. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3233. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3234. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3235. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3236. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3237. var ex = new Exception();
  3238. Func<int> f = () => { throw ex; };
  3239. var res = scheduler.Start(() =>
  3240. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => f())
  3241. );
  3242. res.Messages.AssertEqual(
  3243. OnError<int>(270, ex)
  3244. );
  3245. var es = new[] { e0, e1, e2, e3, e4, e5, e6 };
  3246. foreach (var e in es)
  3247. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3248. }
  3249. [Fact]
  3250. public void CombineLatest_SelectorThrows8()
  3251. {
  3252. var scheduler = new TestScheduler();
  3253. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3254. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3255. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3256. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3257. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3258. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3259. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3260. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  3261. var ex = new Exception();
  3262. Func<int> f = () => { throw ex; };
  3263. var res = scheduler.Start(() =>
  3264. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => f())
  3265. );
  3266. res.Messages.AssertEqual(
  3267. OnError<int>(280, ex)
  3268. );
  3269. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7 };
  3270. foreach (var e in es)
  3271. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3272. }
  3273. [Fact]
  3274. public void CombineLatest_SelectorThrows9()
  3275. {
  3276. var scheduler = new TestScheduler();
  3277. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3278. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3279. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3280. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3281. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3282. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3283. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3284. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  3285. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  3286. var ex = new Exception();
  3287. Func<int> f = () => { throw ex; };
  3288. var res = scheduler.Start(() =>
  3289. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => f())
  3290. );
  3291. res.Messages.AssertEqual(
  3292. OnError<int>(290, ex)
  3293. );
  3294. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 };
  3295. foreach (var e in es)
  3296. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3297. }
  3298. [Fact]
  3299. public void CombineLatest_SelectorThrows10()
  3300. {
  3301. var scheduler = new TestScheduler();
  3302. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3303. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3304. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3305. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3306. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3307. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3308. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3309. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  3310. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  3311. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  3312. var ex = new Exception();
  3313. Func<int> f = () => { throw ex; };
  3314. var res = scheduler.Start(() =>
  3315. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => f())
  3316. );
  3317. res.Messages.AssertEqual(
  3318. OnError<int>(300, ex)
  3319. );
  3320. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 };
  3321. foreach (var e in es)
  3322. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3323. }
  3324. [Fact]
  3325. public void CombineLatest_SelectorThrows11()
  3326. {
  3327. var scheduler = new TestScheduler();
  3328. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3329. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3330. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3331. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3332. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3333. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3334. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3335. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  3336. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  3337. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  3338. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  3339. var ex = new Exception();
  3340. Func<int> f = () => { throw ex; };
  3341. var res = scheduler.Start(() =>
  3342. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => f())
  3343. );
  3344. res.Messages.AssertEqual(
  3345. OnError<int>(310, ex)
  3346. );
  3347. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 };
  3348. foreach (var e in es)
  3349. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3350. }
  3351. [Fact]
  3352. public void CombineLatest_SelectorThrows12()
  3353. {
  3354. var scheduler = new TestScheduler();
  3355. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3356. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3357. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3358. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3359. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3360. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3361. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3362. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  3363. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  3364. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  3365. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  3366. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  3367. var ex = new Exception();
  3368. Func<int> f = () => { throw ex; };
  3369. var res = scheduler.Start(() =>
  3370. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => f())
  3371. );
  3372. res.Messages.AssertEqual(
  3373. OnError<int>(320, ex)
  3374. );
  3375. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 };
  3376. foreach (var e in es)
  3377. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3378. }
  3379. [Fact]
  3380. public void CombineLatest_SelectorThrows13()
  3381. {
  3382. var scheduler = new TestScheduler();
  3383. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3384. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3385. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3386. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3387. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3388. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3389. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3390. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  3391. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  3392. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  3393. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  3394. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  3395. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  3396. var ex = new Exception();
  3397. Func<int> f = () => { throw ex; };
  3398. var res = scheduler.Start(() =>
  3399. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => f())
  3400. );
  3401. res.Messages.AssertEqual(
  3402. OnError<int>(330, ex)
  3403. );
  3404. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 };
  3405. foreach (var e in es)
  3406. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3407. }
  3408. [Fact]
  3409. public void CombineLatest_SelectorThrows14()
  3410. {
  3411. var scheduler = new TestScheduler();
  3412. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3413. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3414. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3415. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3416. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3417. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3418. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3419. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  3420. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  3421. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  3422. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  3423. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  3424. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  3425. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnCompleted<int>(400) });
  3426. var ex = new Exception();
  3427. Func<int> f = () => { throw ex; };
  3428. var res = scheduler.Start(() =>
  3429. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => f())
  3430. );
  3431. res.Messages.AssertEqual(
  3432. OnError<int>(340, ex)
  3433. );
  3434. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 };
  3435. foreach (var e in es)
  3436. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3437. }
  3438. [Fact]
  3439. public void CombineLatest_SelectorThrows15()
  3440. {
  3441. var scheduler = new TestScheduler();
  3442. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3443. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3444. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3445. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3446. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3447. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3448. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3449. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  3450. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  3451. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  3452. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  3453. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  3454. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  3455. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnCompleted<int>(400) });
  3456. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(350, 15), OnCompleted<int>(400) });
  3457. var ex = new Exception();
  3458. Func<int> f = () => { throw ex; };
  3459. var res = scheduler.Start(() =>
  3460. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => f())
  3461. );
  3462. res.Messages.AssertEqual(
  3463. OnError<int>(350, ex)
  3464. );
  3465. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 };
  3466. foreach (var e in es)
  3467. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3468. }
  3469. [Fact]
  3470. public void CombineLatest_SelectorThrows16()
  3471. {
  3472. var scheduler = new TestScheduler();
  3473. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  3474. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  3475. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  3476. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  3477. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  3478. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  3479. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  3480. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  3481. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  3482. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  3483. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  3484. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  3485. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  3486. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnCompleted<int>(400) });
  3487. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(350, 15), OnCompleted<int>(400) });
  3488. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(360, 16), OnCompleted<int>(400) });
  3489. var ex = new Exception();
  3490. Func<int> f = () => { throw ex; };
  3491. var res = scheduler.Start(() =>
  3492. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => f())
  3493. );
  3494. res.Messages.AssertEqual(
  3495. OnError<int>(360, ex)
  3496. );
  3497. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 };
  3498. foreach (var e in es)
  3499. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 10 * es.Length));
  3500. }
  3501. #endif
  3502. #endregion
  3503. #region AllEmptyButOne
  3504. [Fact]
  3505. public void CombineLatest_WillNeverBeAbleToCombineN()
  3506. {
  3507. var scheduler = new TestScheduler();
  3508. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3509. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3510. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3511. var res = scheduler.Start(() =>
  3512. Observable.CombineLatest(new[] { e0, e1, e2 }, xs => 42)
  3513. );
  3514. res.Messages.AssertEqual(
  3515. OnCompleted<int>(500)
  3516. );
  3517. var i = 0;
  3518. var es = new[] { e0, e1, e2 };
  3519. foreach (var e in es.Take(es.Length - 1))
  3520. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3521. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3522. }
  3523. [Fact]
  3524. public void CombineLatest_WillNeverBeAbleToCombine2()
  3525. {
  3526. var scheduler = new TestScheduler();
  3527. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3528. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3529. var res = scheduler.Start(() =>
  3530. Observable.CombineLatest(e0, e1, (_0, _1) => 42)
  3531. );
  3532. res.Messages.AssertEqual(
  3533. OnCompleted<int>(500)
  3534. );
  3535. var i = 0;
  3536. var es = new[] { e0, e1 };
  3537. foreach (var e in es.Take(es.Length - 1))
  3538. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3539. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3540. }
  3541. [Fact]
  3542. public void CombineLatest_WillNeverBeAbleToCombine3()
  3543. {
  3544. var scheduler = new TestScheduler();
  3545. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3546. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3547. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3548. var res = scheduler.Start(() =>
  3549. Observable.CombineLatest(e0, e1, e2, (_0, _1, _2) => 42)
  3550. );
  3551. res.Messages.AssertEqual(
  3552. OnCompleted<int>(500)
  3553. );
  3554. var i = 0;
  3555. var es = new[] { e0, e1, e2 };
  3556. foreach (var e in es.Take(es.Length - 1))
  3557. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3558. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3559. }
  3560. [Fact]
  3561. public void CombineLatest_WillNeverBeAbleToCombine4()
  3562. {
  3563. var scheduler = new TestScheduler();
  3564. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3565. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3566. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3567. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3568. var res = scheduler.Start(() =>
  3569. Observable.CombineLatest(e0, e1, e2, e3, (_0, _1, _2, _3) => 42)
  3570. );
  3571. res.Messages.AssertEqual(
  3572. OnCompleted<int>(500)
  3573. );
  3574. var i = 0;
  3575. var es = new[] { e0, e1, e2, e3 };
  3576. foreach (var e in es.Take(es.Length - 1))
  3577. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3578. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3579. }
  3580. #if !NO_LARGEARITY
  3581. [Fact]
  3582. public void CombineLatest_WillNeverBeAbleToCombine5()
  3583. {
  3584. var scheduler = new TestScheduler();
  3585. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3586. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3587. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3588. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3589. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3590. var res = scheduler.Start(() =>
  3591. Observable.CombineLatest(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => 42)
  3592. );
  3593. res.Messages.AssertEqual(
  3594. OnCompleted<int>(500)
  3595. );
  3596. var i = 0;
  3597. var es = new[] { e0, e1, e2, e3, e4 };
  3598. foreach (var e in es.Take(es.Length - 1))
  3599. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3600. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3601. }
  3602. [Fact]
  3603. public void CombineLatest_WillNeverBeAbleToCombine6()
  3604. {
  3605. var scheduler = new TestScheduler();
  3606. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3607. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3608. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3609. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3610. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3611. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3612. var res = scheduler.Start(() =>
  3613. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => 42)
  3614. );
  3615. res.Messages.AssertEqual(
  3616. OnCompleted<int>(500)
  3617. );
  3618. var i = 0;
  3619. var es = new[] { e0, e1, e2, e3, e4, e5 };
  3620. foreach (var e in es.Take(es.Length - 1))
  3621. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3622. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3623. }
  3624. [Fact]
  3625. public void CombineLatest_WillNeverBeAbleToCombine7()
  3626. {
  3627. var scheduler = new TestScheduler();
  3628. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3629. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3630. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3631. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3632. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3633. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3634. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3635. var res = scheduler.Start(() =>
  3636. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => 42)
  3637. );
  3638. res.Messages.AssertEqual(
  3639. OnCompleted<int>(500)
  3640. );
  3641. var i = 0;
  3642. var es = new[] { e0, e1, e2, e3, e4, e5, e6 };
  3643. foreach (var e in es.Take(es.Length - 1))
  3644. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3645. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3646. }
  3647. [Fact]
  3648. public void CombineLatest_WillNeverBeAbleToCombine8()
  3649. {
  3650. var scheduler = new TestScheduler();
  3651. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3652. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3653. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3654. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3655. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3656. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3657. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  3658. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3659. var res = scheduler.Start(() =>
  3660. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => 42)
  3661. );
  3662. res.Messages.AssertEqual(
  3663. OnCompleted<int>(500)
  3664. );
  3665. var i = 0;
  3666. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7 };
  3667. foreach (var e in es.Take(es.Length - 1))
  3668. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3669. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3670. }
  3671. [Fact]
  3672. public void CombineLatest_WillNeverBeAbleToCombine9()
  3673. {
  3674. var scheduler = new TestScheduler();
  3675. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3676. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3677. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3678. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3679. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3680. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3681. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  3682. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  3683. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3684. var res = scheduler.Start(() =>
  3685. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => 42)
  3686. );
  3687. res.Messages.AssertEqual(
  3688. OnCompleted<int>(500)
  3689. );
  3690. var i = 0;
  3691. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 };
  3692. foreach (var e in es.Take(es.Length - 1))
  3693. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3694. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3695. }
  3696. [Fact]
  3697. public void CombineLatest_WillNeverBeAbleToCombine10()
  3698. {
  3699. var scheduler = new TestScheduler();
  3700. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3701. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3702. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3703. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3704. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3705. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3706. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  3707. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  3708. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  3709. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3710. var res = scheduler.Start(() =>
  3711. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => 42)
  3712. );
  3713. res.Messages.AssertEqual(
  3714. OnCompleted<int>(500)
  3715. );
  3716. var i = 0;
  3717. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 };
  3718. foreach (var e in es.Take(es.Length - 1))
  3719. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3720. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3721. }
  3722. [Fact]
  3723. public void CombineLatest_WillNeverBeAbleToCombine11()
  3724. {
  3725. var scheduler = new TestScheduler();
  3726. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3727. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3728. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3729. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3730. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3731. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3732. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  3733. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  3734. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  3735. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  3736. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3737. var res = scheduler.Start(() =>
  3738. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => 42)
  3739. );
  3740. res.Messages.AssertEqual(
  3741. OnCompleted<int>(500)
  3742. );
  3743. var i = 0;
  3744. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 };
  3745. foreach (var e in es.Take(es.Length - 1))
  3746. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3747. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3748. }
  3749. [Fact]
  3750. public void CombineLatest_WillNeverBeAbleToCombine12()
  3751. {
  3752. var scheduler = new TestScheduler();
  3753. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3754. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3755. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3756. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3757. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3758. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3759. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  3760. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  3761. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  3762. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  3763. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(350) });
  3764. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3765. var res = scheduler.Start(() =>
  3766. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => 42)
  3767. );
  3768. res.Messages.AssertEqual(
  3769. OnCompleted<int>(500)
  3770. );
  3771. var i = 0;
  3772. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 };
  3773. foreach (var e in es.Take(es.Length - 1))
  3774. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3775. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3776. }
  3777. [Fact]
  3778. public void CombineLatest_WillNeverBeAbleToCombine13()
  3779. {
  3780. var scheduler = new TestScheduler();
  3781. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3782. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3783. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3784. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3785. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3786. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3787. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  3788. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  3789. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  3790. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  3791. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(350) });
  3792. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(360) });
  3793. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3794. var res = scheduler.Start(() =>
  3795. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => 42)
  3796. );
  3797. res.Messages.AssertEqual(
  3798. OnCompleted<int>(500)
  3799. );
  3800. var i = 0;
  3801. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 };
  3802. foreach (var e in es.Take(es.Length - 1))
  3803. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3804. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3805. }
  3806. [Fact]
  3807. public void CombineLatest_WillNeverBeAbleToCombine14()
  3808. {
  3809. var scheduler = new TestScheduler();
  3810. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3811. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3812. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3813. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3814. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3815. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3816. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  3817. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  3818. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  3819. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  3820. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(350) });
  3821. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(360) });
  3822. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(370) });
  3823. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3824. var res = scheduler.Start(() =>
  3825. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => 42)
  3826. );
  3827. res.Messages.AssertEqual(
  3828. OnCompleted<int>(500)
  3829. );
  3830. var i = 0;
  3831. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 };
  3832. foreach (var e in es.Take(es.Length - 1))
  3833. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3834. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3835. }
  3836. [Fact]
  3837. public void CombineLatest_WillNeverBeAbleToCombine15()
  3838. {
  3839. var scheduler = new TestScheduler();
  3840. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3841. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3842. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3843. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3844. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3845. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3846. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  3847. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  3848. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  3849. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  3850. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(350) });
  3851. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(360) });
  3852. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(370) });
  3853. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(380) });
  3854. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3855. var res = scheduler.Start(() =>
  3856. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => 42)
  3857. );
  3858. res.Messages.AssertEqual(
  3859. OnCompleted<int>(500)
  3860. );
  3861. var i = 0;
  3862. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 };
  3863. foreach (var e in es.Take(es.Length - 1))
  3864. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3865. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3866. }
  3867. [Fact]
  3868. public void CombineLatest_WillNeverBeAbleToCombine16()
  3869. {
  3870. var scheduler = new TestScheduler();
  3871. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  3872. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  3873. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  3874. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  3875. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  3876. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  3877. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  3878. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  3879. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  3880. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  3881. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(350) });
  3882. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(360) });
  3883. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(370) });
  3884. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(380) });
  3885. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(390) });
  3886. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(500, 2), OnCompleted<int>(800) });
  3887. var res = scheduler.Start(() =>
  3888. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => 42)
  3889. );
  3890. res.Messages.AssertEqual(
  3891. OnCompleted<int>(500)
  3892. );
  3893. var i = 0;
  3894. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 };
  3895. foreach (var e in es.Take(es.Length - 1))
  3896. e.Subscriptions.AssertEqual(Subscribe(200, 200 + 50 + (i++ * 10)));
  3897. es.Last().Subscriptions.AssertEqual(Subscribe(200, 500));
  3898. }
  3899. #endif
  3900. #endregion
  3901. #region Typical
  3902. [Fact]
  3903. public void CombineLatest_TypicalN()
  3904. {
  3905. var scheduler = new TestScheduler();
  3906. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 4), OnCompleted<int>(800) });
  3907. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 5), OnCompleted<int>(800) });
  3908. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 6), OnCompleted<int>(800) });
  3909. var res = scheduler.Start(() =>
  3910. Observable.CombineLatest(new[] { e0, e1, e2 }, xs => xs.Sum())
  3911. );
  3912. res.Messages.AssertEqual(
  3913. OnNext(230, 6),
  3914. OnNext(410, 9),
  3915. OnNext(420, 12),
  3916. OnNext(430, 15),
  3917. OnCompleted<int>(800)
  3918. );
  3919. foreach (var e in new[] { e0, e1, e2 })
  3920. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  3921. }
  3922. [Fact]
  3923. public void CombineLatest_Typical2()
  3924. {
  3925. var scheduler = new TestScheduler();
  3926. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 3), OnCompleted<int>(800) });
  3927. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 4), OnCompleted<int>(800) });
  3928. var res = scheduler.Start(() =>
  3929. Observable.CombineLatest(e0, e1, (_0, _1) => _0 + _1)
  3930. );
  3931. res.Messages.AssertEqual(
  3932. OnNext(220, 3),
  3933. OnNext(410, 5),
  3934. OnNext(420, 7),
  3935. OnCompleted<int>(800)
  3936. );
  3937. foreach (var e in new[] { e0, e1 })
  3938. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  3939. }
  3940. [Fact]
  3941. public void CombineLatest_Typical3()
  3942. {
  3943. var scheduler = new TestScheduler();
  3944. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 4), OnCompleted<int>(800) });
  3945. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 5), OnCompleted<int>(800) });
  3946. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 6), OnCompleted<int>(800) });
  3947. var res = scheduler.Start(() =>
  3948. Observable.CombineLatest(e0, e1, e2, (_0, _1, _2) => _0 + _1 + _2)
  3949. );
  3950. res.Messages.AssertEqual(
  3951. OnNext(230, 6),
  3952. OnNext(410, 9),
  3953. OnNext(420, 12),
  3954. OnNext(430, 15),
  3955. OnCompleted<int>(800)
  3956. );
  3957. foreach (var e in new[] { e0, e1, e2 })
  3958. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  3959. }
  3960. [Fact]
  3961. public void CombineLatest_Typical4()
  3962. {
  3963. var scheduler = new TestScheduler();
  3964. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 5), OnCompleted<int>(800) });
  3965. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 6), OnCompleted<int>(800) });
  3966. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 7), OnCompleted<int>(800) });
  3967. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 8), OnCompleted<int>(800) });
  3968. var res = scheduler.Start(() =>
  3969. Observable.CombineLatest(e0, e1, e2, e3, (_0, _1, _2, _3) => _0 + _1 + _2 + _3)
  3970. );
  3971. res.Messages.AssertEqual(
  3972. OnNext(240, 10),
  3973. OnNext(410, 14),
  3974. OnNext(420, 18),
  3975. OnNext(430, 22),
  3976. OnNext(440, 26),
  3977. OnCompleted<int>(800)
  3978. );
  3979. foreach (var e in new[] { e0, e1, e2, e3 })
  3980. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  3981. }
  3982. #if !NO_LARGEARITY
  3983. [Fact]
  3984. public void CombineLatest_Typical5()
  3985. {
  3986. var scheduler = new TestScheduler();
  3987. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 6), OnCompleted<int>(800) });
  3988. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 7), OnCompleted<int>(800) });
  3989. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 8), OnCompleted<int>(800) });
  3990. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 9), OnCompleted<int>(800) });
  3991. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 10), OnCompleted<int>(800) });
  3992. var res = scheduler.Start(() =>
  3993. Observable.CombineLatest(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4)
  3994. );
  3995. res.Messages.AssertEqual(
  3996. OnNext(250, 15),
  3997. OnNext(410, 20),
  3998. OnNext(420, 25),
  3999. OnNext(430, 30),
  4000. OnNext(440, 35),
  4001. OnNext(450, 40),
  4002. OnCompleted<int>(800)
  4003. );
  4004. foreach (var e in new[] { e0, e1, e2, e3, e4 })
  4005. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4006. }
  4007. [Fact]
  4008. public void CombineLatest_Typical6()
  4009. {
  4010. var scheduler = new TestScheduler();
  4011. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 7), OnCompleted<int>(800) });
  4012. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 8), OnCompleted<int>(800) });
  4013. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 9), OnCompleted<int>(800) });
  4014. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 10), OnCompleted<int>(800) });
  4015. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 11), OnCompleted<int>(800) });
  4016. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 12), OnCompleted<int>(800) });
  4017. var res = scheduler.Start(() =>
  4018. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5)
  4019. );
  4020. res.Messages.AssertEqual(
  4021. OnNext(260, 21),
  4022. OnNext(410, 27),
  4023. OnNext(420, 33),
  4024. OnNext(430, 39),
  4025. OnNext(440, 45),
  4026. OnNext(450, 51),
  4027. OnNext(460, 57),
  4028. OnCompleted<int>(800)
  4029. );
  4030. foreach (var e in new[] { e0, e1, e2, e3, e4, e5 })
  4031. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4032. }
  4033. [Fact]
  4034. public void CombineLatest_Typical7()
  4035. {
  4036. var scheduler = new TestScheduler();
  4037. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 8), OnCompleted<int>(800) });
  4038. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 9), OnCompleted<int>(800) });
  4039. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 10), OnCompleted<int>(800) });
  4040. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 11), OnCompleted<int>(800) });
  4041. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 12), OnCompleted<int>(800) });
  4042. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 13), OnCompleted<int>(800) });
  4043. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 14), OnCompleted<int>(800) });
  4044. var res = scheduler.Start(() =>
  4045. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6)
  4046. );
  4047. res.Messages.AssertEqual(
  4048. OnNext(270, 28),
  4049. OnNext(410, 35),
  4050. OnNext(420, 42),
  4051. OnNext(430, 49),
  4052. OnNext(440, 56),
  4053. OnNext(450, 63),
  4054. OnNext(460, 70),
  4055. OnNext(470, 77),
  4056. OnCompleted<int>(800)
  4057. );
  4058. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6 })
  4059. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4060. }
  4061. [Fact]
  4062. public void CombineLatest_Typical8()
  4063. {
  4064. var scheduler = new TestScheduler();
  4065. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 9), OnCompleted<int>(800) });
  4066. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 10), OnCompleted<int>(800) });
  4067. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 11), OnCompleted<int>(800) });
  4068. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 12), OnCompleted<int>(800) });
  4069. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 13), OnCompleted<int>(800) });
  4070. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 14), OnCompleted<int>(800) });
  4071. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 15), OnCompleted<int>(800) });
  4072. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnNext(480, 16), OnCompleted<int>(800) });
  4073. var res = scheduler.Start(() =>
  4074. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7)
  4075. );
  4076. res.Messages.AssertEqual(
  4077. OnNext(280, 36),
  4078. OnNext(410, 44),
  4079. OnNext(420, 52),
  4080. OnNext(430, 60),
  4081. OnNext(440, 68),
  4082. OnNext(450, 76),
  4083. OnNext(460, 84),
  4084. OnNext(470, 92),
  4085. OnNext(480, 100),
  4086. OnCompleted<int>(800)
  4087. );
  4088. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7 })
  4089. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4090. }
  4091. [Fact]
  4092. public void CombineLatest_Typical9()
  4093. {
  4094. var scheduler = new TestScheduler();
  4095. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 10), OnCompleted<int>(800) });
  4096. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 11), OnCompleted<int>(800) });
  4097. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 12), OnCompleted<int>(800) });
  4098. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 13), OnCompleted<int>(800) });
  4099. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 14), OnCompleted<int>(800) });
  4100. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 15), OnCompleted<int>(800) });
  4101. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 16), OnCompleted<int>(800) });
  4102. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnNext(480, 17), OnCompleted<int>(800) });
  4103. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnNext(490, 18), OnCompleted<int>(800) });
  4104. var res = scheduler.Start(() =>
  4105. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8)
  4106. );
  4107. res.Messages.AssertEqual(
  4108. OnNext(290, 45),
  4109. OnNext(410, 54),
  4110. OnNext(420, 63),
  4111. OnNext(430, 72),
  4112. OnNext(440, 81),
  4113. OnNext(450, 90),
  4114. OnNext(460, 99),
  4115. OnNext(470, 108),
  4116. OnNext(480, 117),
  4117. OnNext(490, 126),
  4118. OnCompleted<int>(800)
  4119. );
  4120. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 })
  4121. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4122. }
  4123. [Fact]
  4124. public void CombineLatest_Typical10()
  4125. {
  4126. var scheduler = new TestScheduler();
  4127. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 11), OnCompleted<int>(800) });
  4128. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 12), OnCompleted<int>(800) });
  4129. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 13), OnCompleted<int>(800) });
  4130. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 14), OnCompleted<int>(800) });
  4131. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 15), OnCompleted<int>(800) });
  4132. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 16), OnCompleted<int>(800) });
  4133. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 17), OnCompleted<int>(800) });
  4134. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnNext(480, 18), OnCompleted<int>(800) });
  4135. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnNext(490, 19), OnCompleted<int>(800) });
  4136. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnNext(500, 20), OnCompleted<int>(800) });
  4137. var res = scheduler.Start(() =>
  4138. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9)
  4139. );
  4140. res.Messages.AssertEqual(
  4141. OnNext(300, 55),
  4142. OnNext(410, 65),
  4143. OnNext(420, 75),
  4144. OnNext(430, 85),
  4145. OnNext(440, 95),
  4146. OnNext(450, 105),
  4147. OnNext(460, 115),
  4148. OnNext(470, 125),
  4149. OnNext(480, 135),
  4150. OnNext(490, 145),
  4151. OnNext(500, 155),
  4152. OnCompleted<int>(800)
  4153. );
  4154. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 })
  4155. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4156. }
  4157. [Fact]
  4158. public void CombineLatest_Typical11()
  4159. {
  4160. var scheduler = new TestScheduler();
  4161. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 12), OnCompleted<int>(800) });
  4162. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 13), OnCompleted<int>(800) });
  4163. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 14), OnCompleted<int>(800) });
  4164. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 15), OnCompleted<int>(800) });
  4165. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 16), OnCompleted<int>(800) });
  4166. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 17), OnCompleted<int>(800) });
  4167. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 18), OnCompleted<int>(800) });
  4168. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnNext(480, 19), OnCompleted<int>(800) });
  4169. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnNext(490, 20), OnCompleted<int>(800) });
  4170. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnNext(500, 21), OnCompleted<int>(800) });
  4171. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnNext(510, 22), OnCompleted<int>(800) });
  4172. var res = scheduler.Start(() =>
  4173. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10)
  4174. );
  4175. res.Messages.AssertEqual(
  4176. OnNext(310, 66),
  4177. OnNext(410, 77),
  4178. OnNext(420, 88),
  4179. OnNext(430, 99),
  4180. OnNext(440, 110),
  4181. OnNext(450, 121),
  4182. OnNext(460, 132),
  4183. OnNext(470, 143),
  4184. OnNext(480, 154),
  4185. OnNext(490, 165),
  4186. OnNext(500, 176),
  4187. OnNext(510, 187),
  4188. OnCompleted<int>(800)
  4189. );
  4190. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 })
  4191. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4192. }
  4193. [Fact]
  4194. public void CombineLatest_Typical12()
  4195. {
  4196. var scheduler = new TestScheduler();
  4197. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 13), OnCompleted<int>(800) });
  4198. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 14), OnCompleted<int>(800) });
  4199. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 15), OnCompleted<int>(800) });
  4200. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 16), OnCompleted<int>(800) });
  4201. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 17), OnCompleted<int>(800) });
  4202. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 18), OnCompleted<int>(800) });
  4203. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 19), OnCompleted<int>(800) });
  4204. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnNext(480, 20), OnCompleted<int>(800) });
  4205. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnNext(490, 21), OnCompleted<int>(800) });
  4206. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnNext(500, 22), OnCompleted<int>(800) });
  4207. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnNext(510, 23), OnCompleted<int>(800) });
  4208. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnNext(520, 24), OnCompleted<int>(800) });
  4209. var res = scheduler.Start(() =>
  4210. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11)
  4211. );
  4212. res.Messages.AssertEqual(
  4213. OnNext(320, 78),
  4214. OnNext(410, 90),
  4215. OnNext(420, 102),
  4216. OnNext(430, 114),
  4217. OnNext(440, 126),
  4218. OnNext(450, 138),
  4219. OnNext(460, 150),
  4220. OnNext(470, 162),
  4221. OnNext(480, 174),
  4222. OnNext(490, 186),
  4223. OnNext(500, 198),
  4224. OnNext(510, 210),
  4225. OnNext(520, 222),
  4226. OnCompleted<int>(800)
  4227. );
  4228. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 })
  4229. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4230. }
  4231. [Fact]
  4232. public void CombineLatest_Typical13()
  4233. {
  4234. var scheduler = new TestScheduler();
  4235. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 14), OnCompleted<int>(800) });
  4236. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 15), OnCompleted<int>(800) });
  4237. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 16), OnCompleted<int>(800) });
  4238. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 17), OnCompleted<int>(800) });
  4239. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 18), OnCompleted<int>(800) });
  4240. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 19), OnCompleted<int>(800) });
  4241. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 20), OnCompleted<int>(800) });
  4242. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnNext(480, 21), OnCompleted<int>(800) });
  4243. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnNext(490, 22), OnCompleted<int>(800) });
  4244. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnNext(500, 23), OnCompleted<int>(800) });
  4245. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnNext(510, 24), OnCompleted<int>(800) });
  4246. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnNext(520, 25), OnCompleted<int>(800) });
  4247. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnNext(530, 26), OnCompleted<int>(800) });
  4248. var res = scheduler.Start(() =>
  4249. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12)
  4250. );
  4251. res.Messages.AssertEqual(
  4252. OnNext(330, 91),
  4253. OnNext(410, 104),
  4254. OnNext(420, 117),
  4255. OnNext(430, 130),
  4256. OnNext(440, 143),
  4257. OnNext(450, 156),
  4258. OnNext(460, 169),
  4259. OnNext(470, 182),
  4260. OnNext(480, 195),
  4261. OnNext(490, 208),
  4262. OnNext(500, 221),
  4263. OnNext(510, 234),
  4264. OnNext(520, 247),
  4265. OnNext(530, 260),
  4266. OnCompleted<int>(800)
  4267. );
  4268. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 })
  4269. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4270. }
  4271. [Fact]
  4272. public void CombineLatest_Typical14()
  4273. {
  4274. var scheduler = new TestScheduler();
  4275. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 15), OnCompleted<int>(800) });
  4276. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 16), OnCompleted<int>(800) });
  4277. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 17), OnCompleted<int>(800) });
  4278. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 18), OnCompleted<int>(800) });
  4279. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 19), OnCompleted<int>(800) });
  4280. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 20), OnCompleted<int>(800) });
  4281. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 21), OnCompleted<int>(800) });
  4282. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnNext(480, 22), OnCompleted<int>(800) });
  4283. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnNext(490, 23), OnCompleted<int>(800) });
  4284. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnNext(500, 24), OnCompleted<int>(800) });
  4285. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnNext(510, 25), OnCompleted<int>(800) });
  4286. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnNext(520, 26), OnCompleted<int>(800) });
  4287. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnNext(530, 27), OnCompleted<int>(800) });
  4288. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnNext(540, 28), OnCompleted<int>(800) });
  4289. var res = scheduler.Start(() =>
  4290. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13)
  4291. );
  4292. res.Messages.AssertEqual(
  4293. OnNext(340, 105),
  4294. OnNext(410, 119),
  4295. OnNext(420, 133),
  4296. OnNext(430, 147),
  4297. OnNext(440, 161),
  4298. OnNext(450, 175),
  4299. OnNext(460, 189),
  4300. OnNext(470, 203),
  4301. OnNext(480, 217),
  4302. OnNext(490, 231),
  4303. OnNext(500, 245),
  4304. OnNext(510, 259),
  4305. OnNext(520, 273),
  4306. OnNext(530, 287),
  4307. OnNext(540, 301),
  4308. OnCompleted<int>(800)
  4309. );
  4310. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 })
  4311. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4312. }
  4313. [Fact]
  4314. public void CombineLatest_Typical15()
  4315. {
  4316. var scheduler = new TestScheduler();
  4317. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 16), OnCompleted<int>(800) });
  4318. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 17), OnCompleted<int>(800) });
  4319. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 18), OnCompleted<int>(800) });
  4320. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 19), OnCompleted<int>(800) });
  4321. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 20), OnCompleted<int>(800) });
  4322. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 21), OnCompleted<int>(800) });
  4323. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 22), OnCompleted<int>(800) });
  4324. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnNext(480, 23), OnCompleted<int>(800) });
  4325. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnNext(490, 24), OnCompleted<int>(800) });
  4326. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnNext(500, 25), OnCompleted<int>(800) });
  4327. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnNext(510, 26), OnCompleted<int>(800) });
  4328. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnNext(520, 27), OnCompleted<int>(800) });
  4329. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnNext(530, 28), OnCompleted<int>(800) });
  4330. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnNext(540, 29), OnCompleted<int>(800) });
  4331. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(350, 15), OnNext(550, 30), OnCompleted<int>(800) });
  4332. var res = scheduler.Start(() =>
  4333. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14)
  4334. );
  4335. res.Messages.AssertEqual(
  4336. OnNext(350, 120),
  4337. OnNext(410, 135),
  4338. OnNext(420, 150),
  4339. OnNext(430, 165),
  4340. OnNext(440, 180),
  4341. OnNext(450, 195),
  4342. OnNext(460, 210),
  4343. OnNext(470, 225),
  4344. OnNext(480, 240),
  4345. OnNext(490, 255),
  4346. OnNext(500, 270),
  4347. OnNext(510, 285),
  4348. OnNext(520, 300),
  4349. OnNext(530, 315),
  4350. OnNext(540, 330),
  4351. OnNext(550, 345),
  4352. OnCompleted<int>(800)
  4353. );
  4354. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 })
  4355. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4356. }
  4357. [Fact]
  4358. public void CombineLatest_Typical16()
  4359. {
  4360. var scheduler = new TestScheduler();
  4361. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(410, 17), OnCompleted<int>(800) });
  4362. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(420, 18), OnCompleted<int>(800) });
  4363. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(430, 19), OnCompleted<int>(800) });
  4364. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnNext(440, 20), OnCompleted<int>(800) });
  4365. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnNext(450, 21), OnCompleted<int>(800) });
  4366. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnNext(460, 22), OnCompleted<int>(800) });
  4367. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnNext(470, 23), OnCompleted<int>(800) });
  4368. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnNext(480, 24), OnCompleted<int>(800) });
  4369. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnNext(490, 25), OnCompleted<int>(800) });
  4370. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnNext(500, 26), OnCompleted<int>(800) });
  4371. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnNext(510, 27), OnCompleted<int>(800) });
  4372. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnNext(520, 28), OnCompleted<int>(800) });
  4373. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnNext(530, 29), OnCompleted<int>(800) });
  4374. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnNext(540, 30), OnCompleted<int>(800) });
  4375. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(350, 15), OnNext(550, 31), OnCompleted<int>(800) });
  4376. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(360, 16), OnNext(560, 32), OnCompleted<int>(800) });
  4377. var res = scheduler.Start(() =>
  4378. Observable.CombineLatest(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15)
  4379. );
  4380. res.Messages.AssertEqual(
  4381. OnNext(360, 136),
  4382. OnNext(410, 152),
  4383. OnNext(420, 168),
  4384. OnNext(430, 184),
  4385. OnNext(440, 200),
  4386. OnNext(450, 216),
  4387. OnNext(460, 232),
  4388. OnNext(470, 248),
  4389. OnNext(480, 264),
  4390. OnNext(490, 280),
  4391. OnNext(500, 296),
  4392. OnNext(510, 312),
  4393. OnNext(520, 328),
  4394. OnNext(530, 344),
  4395. OnNext(540, 360),
  4396. OnNext(550, 376),
  4397. OnNext(560, 392),
  4398. OnCompleted<int>(800)
  4399. );
  4400. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 })
  4401. e.Subscriptions.AssertEqual(Subscribe(200, 800));
  4402. }
  4403. #endif
  4404. #endregion
  4405. #region NAry
  4406. [Fact]
  4407. public void CombineLatest_List_Regular()
  4408. {
  4409. var scheduler = new TestScheduler();
  4410. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(240, 4), OnCompleted<int>(270) });
  4411. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(250, 5), OnCompleted<int>(280) });
  4412. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(290) });
  4413. var res = scheduler.Start(() =>
  4414. Observable.CombineLatest<int>(new IObservable<int>[] { e0, e1, e2 }.AsEnumerable())
  4415. );
  4416. res.Messages.AssertEqual(
  4417. OnNext<IList<int>>(230, l => l.SequenceEqual(new[] { 1, 2, 3 })),
  4418. OnNext<IList<int>>(240, l => l.SequenceEqual(new[] { 4, 2, 3 })),
  4419. OnNext<IList<int>>(250, l => l.SequenceEqual(new[] { 4, 5, 3 })),
  4420. OnNext<IList<int>>(260, l => l.SequenceEqual(new[] { 4, 5, 6 })),
  4421. OnCompleted<IList<int>>(290)
  4422. );
  4423. }
  4424. [Fact]
  4425. public void CombineLatest_NAry_ArgumentChecking()
  4426. {
  4427. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IEnumerable<IObservable<int>>)));
  4428. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IEnumerable<IObservable<int>>), _ => 42));
  4429. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(new[] { Observable.Return(42) }, default(Func<IList<int>, string>)));
  4430. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.CombineLatest(default(IObservable<int>[])));
  4431. }
  4432. [Fact]
  4433. public void CombineLatest_NAry_Symmetric()
  4434. {
  4435. var scheduler = new TestScheduler();
  4436. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(250, 4), OnCompleted<int>(420) });
  4437. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnCompleted<int>(410) });
  4438. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(400) });
  4439. var res = scheduler.Start(() =>
  4440. Observable.CombineLatest(e0, e1, e2)
  4441. );
  4442. res.Messages.AssertEqual(
  4443. OnNext<IList<int>>(230, l => l.SequenceEqual(new[] { 1, 2, 3 })),
  4444. OnNext<IList<int>>(240, l => l.SequenceEqual(new[] { 1, 5, 3 })),
  4445. OnNext<IList<int>>(250, l => l.SequenceEqual(new[] { 4, 5, 3 })),
  4446. OnNext<IList<int>>(260, l => l.SequenceEqual(new[] { 4, 5, 6 })),
  4447. OnCompleted<IList<int>>(420)
  4448. );
  4449. e0.Subscriptions.AssertEqual(
  4450. Subscribe(200, 420)
  4451. );
  4452. e1.Subscriptions.AssertEqual(
  4453. Subscribe(200, 410)
  4454. );
  4455. e2.Subscriptions.AssertEqual(
  4456. Subscribe(200, 400)
  4457. );
  4458. }
  4459. [Fact]
  4460. public void CombineLatest_NAry_Symmetric_Selector()
  4461. {
  4462. var scheduler = new TestScheduler();
  4463. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(250, 4), OnCompleted<int>(420) });
  4464. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnCompleted<int>(410) });
  4465. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(400) });
  4466. var res = scheduler.Start(() =>
  4467. Observable.CombineLatest(new[] { e0, e1, e2 }, xs => xs.Sum())
  4468. );
  4469. res.Messages.AssertEqual(
  4470. OnNext<int>(230, new[] { 1, 2, 3 }.Sum()),
  4471. OnNext<int>(240, new[] { 1, 5, 3 }.Sum()),
  4472. OnNext<int>(250, new[] { 4, 5, 3 }.Sum()),
  4473. OnNext<int>(260, new[] { 4, 5, 6 }.Sum()),
  4474. OnCompleted<int>(420)
  4475. );
  4476. e0.Subscriptions.AssertEqual(
  4477. Subscribe(200, 420)
  4478. );
  4479. e1.Subscriptions.AssertEqual(
  4480. Subscribe(200, 410)
  4481. );
  4482. e2.Subscriptions.AssertEqual(
  4483. Subscribe(200, 400)
  4484. );
  4485. }
  4486. [Fact]
  4487. public void CombineLatest_NAry_Asymmetric()
  4488. {
  4489. var scheduler = new TestScheduler();
  4490. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(250, 4), OnCompleted<int>(270) });
  4491. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnNext(290, 7), OnNext(310, 9), OnCompleted<int>(410) });
  4492. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnNext(280, 8), OnCompleted<int>(300) });
  4493. var res = scheduler.Start(() =>
  4494. Observable.CombineLatest(e0, e1, e2)
  4495. );
  4496. res.Messages.AssertEqual(
  4497. OnNext<IList<int>>(230, l => l.SequenceEqual(new[] { 1, 2, 3 })),
  4498. OnNext<IList<int>>(240, l => l.SequenceEqual(new[] { 1, 5, 3 })),
  4499. OnNext<IList<int>>(250, l => l.SequenceEqual(new[] { 4, 5, 3 })),
  4500. OnNext<IList<int>>(260, l => l.SequenceEqual(new[] { 4, 5, 6 })),
  4501. OnNext<IList<int>>(280, l => l.SequenceEqual(new[] { 4, 5, 8 })),
  4502. OnNext<IList<int>>(290, l => l.SequenceEqual(new[] { 4, 7, 8 })),
  4503. OnNext<IList<int>>(310, l => l.SequenceEqual(new[] { 4, 9, 8 })),
  4504. OnCompleted<IList<int>>(410)
  4505. );
  4506. e0.Subscriptions.AssertEqual(
  4507. Subscribe(200, 270)
  4508. );
  4509. e1.Subscriptions.AssertEqual(
  4510. Subscribe(200, 410)
  4511. );
  4512. e2.Subscriptions.AssertEqual(
  4513. Subscribe(200, 300)
  4514. );
  4515. }
  4516. [Fact]
  4517. public void CombineLatest_NAry_Asymmetric_Selector()
  4518. {
  4519. var scheduler = new TestScheduler();
  4520. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(250, 4), OnCompleted<int>(270) });
  4521. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnNext(290, 7), OnNext(310, 9), OnCompleted<int>(410) });
  4522. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnNext(280, 8), OnCompleted<int>(300) });
  4523. var res = scheduler.Start(() =>
  4524. Observable.CombineLatest(new[] { e0, e1, e2 }, xs => xs.Sum())
  4525. );
  4526. res.Messages.AssertEqual(
  4527. OnNext<int>(230, new[] { 1, 2, 3 }.Sum()),
  4528. OnNext<int>(240, new[] { 1, 5, 3 }.Sum()),
  4529. OnNext<int>(250, new[] { 4, 5, 3 }.Sum()),
  4530. OnNext<int>(260, new[] { 4, 5, 6 }.Sum()),
  4531. OnNext<int>(280, new[] { 4, 5, 8 }.Sum()),
  4532. OnNext<int>(290, new[] { 4, 7, 8 }.Sum()),
  4533. OnNext<int>(310, new[] { 4, 9, 8 }.Sum()),
  4534. OnCompleted<int>(410)
  4535. );
  4536. e0.Subscriptions.AssertEqual(
  4537. Subscribe(200, 270)
  4538. );
  4539. e1.Subscriptions.AssertEqual(
  4540. Subscribe(200, 410)
  4541. );
  4542. e2.Subscriptions.AssertEqual(
  4543. Subscribe(200, 300)
  4544. );
  4545. }
  4546. [Fact]
  4547. public void CombineLatest_NAry_Error()
  4548. {
  4549. var ex = new Exception();
  4550. var scheduler = new TestScheduler();
  4551. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnError<int>(250, ex) });
  4552. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnCompleted<int>(410) });
  4553. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(400) });
  4554. var res = scheduler.Start(() =>
  4555. Observable.CombineLatest(e0, e1, e2)
  4556. );
  4557. res.Messages.AssertEqual(
  4558. OnNext<IList<int>>(230, l => l.SequenceEqual(new[] { 1, 2, 3 })),
  4559. OnNext<IList<int>>(240, l => l.SequenceEqual(new[] { 1, 5, 3 })),
  4560. OnError<IList<int>>(250, ex)
  4561. );
  4562. e0.Subscriptions.AssertEqual(
  4563. Subscribe(200, 250)
  4564. );
  4565. e1.Subscriptions.AssertEqual(
  4566. Subscribe(200, 250)
  4567. );
  4568. e2.Subscriptions.AssertEqual(
  4569. Subscribe(200, 250)
  4570. );
  4571. }
  4572. [Fact]
  4573. public void CombineLatest_NAry_Error_Selector()
  4574. {
  4575. var ex = new Exception();
  4576. var scheduler = new TestScheduler();
  4577. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnError<int>(250, ex) });
  4578. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnCompleted<int>(410) });
  4579. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(400) });
  4580. var res = scheduler.Start(() =>
  4581. Observable.CombineLatest(new[] { e0, e1, e2 }, xs => xs.Sum())
  4582. );
  4583. res.Messages.AssertEqual(
  4584. OnNext<int>(230, new[] { 1, 2, 3 }.Sum()),
  4585. OnNext<int>(240, new[] { 1, 5, 3 }.Sum()),
  4586. OnError<int>(250, ex)
  4587. );
  4588. e0.Subscriptions.AssertEqual(
  4589. Subscribe(200, 250)
  4590. );
  4591. e1.Subscriptions.AssertEqual(
  4592. Subscribe(200, 250)
  4593. );
  4594. e2.Subscriptions.AssertEqual(
  4595. Subscribe(200, 250)
  4596. );
  4597. }
  4598. #endregion
  4599. #region AtLeastOneThrows
  4600. [Fact]
  4601. public void CombineLatest_AtLeastOneThrows4()
  4602. {
  4603. var ex = new Exception();
  4604. var scheduler = new TestScheduler();
  4605. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  4606. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  4607. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnError<int>(230, ex) });
  4608. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  4609. var res = scheduler.Start(() =>
  4610. Observable.CombineLatest(e0, e1, e2, e3, (_0, _1, _2, _3) => 42)
  4611. );
  4612. res.Messages.AssertEqual(
  4613. OnError<int>(230, ex)
  4614. );
  4615. e0.Subscriptions.AssertEqual(Subscribe(200, 230));
  4616. e1.Subscriptions.AssertEqual(Subscribe(200, 230));
  4617. e2.Subscriptions.AssertEqual(Subscribe(200, 230));
  4618. e3.Subscriptions.AssertEqual(Subscribe(200, 230));
  4619. }
  4620. #endregion
  4621. #endregion
  4622. #region + Concat +
  4623. [Fact]
  4624. public void Concat_ArgumentChecking()
  4625. {
  4626. var xs = DummyObservable<int>.Instance;
  4627. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat(xs, (IObservable<int>)null));
  4628. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat((IObservable<int>)null, xs));
  4629. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat((IObservable<int>[])null));
  4630. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat((IEnumerable<IObservable<int>>)null));
  4631. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat((IObservable<int>[])null));
  4632. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat((IEnumerable<IObservable<int>>)null));
  4633. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat(xs, null));
  4634. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat(null, xs));
  4635. }
  4636. [Fact]
  4637. public void Concat_DefaultScheduler()
  4638. {
  4639. var evt = new ManualResetEvent(false);
  4640. int sum = 0;
  4641. Observable.Concat(Observable.Return(1), Observable.Return(2), Observable.Return(3)).Subscribe(n =>
  4642. {
  4643. sum += n;
  4644. }, () => evt.Set());
  4645. evt.WaitOne();
  4646. Assert.Equal(6, sum);
  4647. }
  4648. [Fact]
  4649. public void Concat_IEofIO_DefaultScheduler()
  4650. {
  4651. var evt = new ManualResetEvent(false);
  4652. IEnumerable<IObservable<int>> sources = new[] { Observable.Return(1), Observable.Return(2), Observable.Return(3) };
  4653. int sum = 0;
  4654. Observable.Concat(sources).Subscribe(n =>
  4655. {
  4656. sum += n;
  4657. }, () => evt.Set());
  4658. evt.WaitOne();
  4659. Assert.Equal(6, sum);
  4660. }
  4661. [Fact]
  4662. public void Concat_IEofIO_GetEnumeratorThrows()
  4663. {
  4664. var ex = new Exception();
  4665. var scheduler = new TestScheduler();
  4666. var xss = new RogueEnumerable<IObservable<int>>(ex);
  4667. var res = scheduler.Start(() =>
  4668. Observable.Concat(xss)
  4669. );
  4670. res.Messages.AssertEqual(
  4671. OnError<int>(200, ex)
  4672. );
  4673. }
  4674. [Fact]
  4675. public void Concat_IEofIO()
  4676. {
  4677. var scheduler = new TestScheduler();
  4678. var xs1 = scheduler.CreateColdObservable<int>(
  4679. OnNext(10, 1),
  4680. OnNext(20, 2),
  4681. OnNext(30, 3),
  4682. OnCompleted<int>(40)
  4683. );
  4684. var xs2 = scheduler.CreateColdObservable<int>(
  4685. OnNext(10, 4),
  4686. OnNext(20, 5),
  4687. OnCompleted<int>(30)
  4688. );
  4689. var xs3 = scheduler.CreateColdObservable<int>(
  4690. OnNext(10, 6),
  4691. OnNext(20, 7),
  4692. OnNext(30, 8),
  4693. OnNext(40, 9),
  4694. OnCompleted<int>(50)
  4695. );
  4696. var res = scheduler.Start(() =>
  4697. Observable.Concat(new[] { xs1, xs2, xs3 })
  4698. );
  4699. res.Messages.AssertEqual(
  4700. OnNext(210, 1),
  4701. OnNext(220, 2),
  4702. OnNext(230, 3),
  4703. OnNext(250, 4),
  4704. OnNext(260, 5),
  4705. OnNext(280, 6),
  4706. OnNext(290, 7),
  4707. OnNext(300, 8),
  4708. OnNext(310, 9),
  4709. OnCompleted<int>(320)
  4710. );
  4711. xs1.Subscriptions.AssertEqual(
  4712. Subscribe(200, 240)
  4713. );
  4714. xs2.Subscriptions.AssertEqual(
  4715. Subscribe(240, 270)
  4716. );
  4717. xs3.Subscriptions.AssertEqual(
  4718. Subscribe(270, 320)
  4719. );
  4720. }
  4721. [Fact]
  4722. public void Concat_EmptyEmpty()
  4723. {
  4724. var scheduler = new TestScheduler();
  4725. var o1 = scheduler.CreateHotObservable(
  4726. OnNext(150, 1),
  4727. OnCompleted<int>(230)
  4728. );
  4729. var o2 = scheduler.CreateHotObservable(
  4730. OnNext(150, 1),
  4731. OnCompleted<int>(250)
  4732. );
  4733. var res = scheduler.Start(() =>
  4734. o1.Concat(o2)
  4735. );
  4736. res.Messages.AssertEqual(
  4737. OnCompleted<int>(250)
  4738. );
  4739. o1.Subscriptions.AssertEqual(
  4740. Subscribe(200, 230)
  4741. );
  4742. o2.Subscriptions.AssertEqual(
  4743. Subscribe(230, 250)
  4744. );
  4745. }
  4746. [Fact]
  4747. public void Concat_EmptyNever()
  4748. {
  4749. var scheduler = new TestScheduler();
  4750. var o1 = scheduler.CreateHotObservable(
  4751. OnNext(150, 1),
  4752. OnCompleted<int>(230)
  4753. );
  4754. var o2 = scheduler.CreateHotObservable(
  4755. OnNext(150, 1)
  4756. );
  4757. var res = scheduler.Start(() =>
  4758. o1.Concat(o2)
  4759. );
  4760. res.Messages.AssertEqual(
  4761. );
  4762. o1.Subscriptions.AssertEqual(
  4763. Subscribe(200, 230)
  4764. );
  4765. o2.Subscriptions.AssertEqual(
  4766. Subscribe(230, 1000)
  4767. );
  4768. }
  4769. [Fact]
  4770. public void Concat_NeverEmpty()
  4771. {
  4772. var scheduler = new TestScheduler();
  4773. var o1 = scheduler.CreateHotObservable(
  4774. OnNext(150, 1)
  4775. );
  4776. var o2 = scheduler.CreateHotObservable(
  4777. OnNext(150, 1),
  4778. OnCompleted<int>(230)
  4779. );
  4780. var res = scheduler.Start(() =>
  4781. o1.Concat(o2)
  4782. );
  4783. res.Messages.AssertEqual(
  4784. );
  4785. o1.Subscriptions.AssertEqual(
  4786. Subscribe(200, 1000)
  4787. );
  4788. o2.Subscriptions.AssertEqual(
  4789. );
  4790. }
  4791. [Fact]
  4792. public void Concat_NeverNever()
  4793. {
  4794. var scheduler = new TestScheduler();
  4795. var o1 = scheduler.CreateHotObservable(
  4796. OnNext(150, 1)
  4797. );
  4798. var o2 = scheduler.CreateHotObservable(
  4799. OnNext(150, 1)
  4800. );
  4801. var res = scheduler.Start(() =>
  4802. o1.Concat(o2)
  4803. );
  4804. res.Messages.AssertEqual(
  4805. );
  4806. o1.Subscriptions.AssertEqual(
  4807. Subscribe(200, 1000)
  4808. );
  4809. o2.Subscriptions.AssertEqual(
  4810. );
  4811. }
  4812. [Fact]
  4813. public void Concat_EmptyThrow()
  4814. {
  4815. var scheduler = new TestScheduler();
  4816. var ex = new Exception();
  4817. var o1 = scheduler.CreateHotObservable(
  4818. OnNext(150, 1),
  4819. OnCompleted<int>(230)
  4820. );
  4821. var o2 = scheduler.CreateHotObservable(
  4822. OnNext(150, 1),
  4823. OnError<int>(250, ex)
  4824. );
  4825. var res = scheduler.Start(() =>
  4826. o1.Concat(o2)
  4827. );
  4828. res.Messages.AssertEqual(
  4829. OnError<int>(250, ex)
  4830. );
  4831. o1.Subscriptions.AssertEqual(
  4832. Subscribe(200, 230)
  4833. );
  4834. o2.Subscriptions.AssertEqual(
  4835. Subscribe(230, 250)
  4836. );
  4837. }
  4838. [Fact]
  4839. public void Concat_ThrowEmpty()
  4840. {
  4841. var scheduler = new TestScheduler();
  4842. var ex = new Exception();
  4843. var o1 = scheduler.CreateHotObservable(
  4844. OnNext(150, 1),
  4845. OnError<int>(230, ex)
  4846. );
  4847. var o2 = scheduler.CreateHotObservable(
  4848. OnNext(150, 1),
  4849. OnCompleted<int>(250)
  4850. );
  4851. var res = scheduler.Start(() =>
  4852. o1.Concat(o2)
  4853. );
  4854. res.Messages.AssertEqual(
  4855. OnError<int>(230, ex)
  4856. );
  4857. o1.Subscriptions.AssertEqual(
  4858. Subscribe(200, 230)
  4859. );
  4860. o2.Subscriptions.AssertEqual(
  4861. );
  4862. }
  4863. [Fact]
  4864. public void Concat_ThrowThrow()
  4865. {
  4866. var scheduler = new TestScheduler();
  4867. var ex = new Exception();
  4868. var o1 = scheduler.CreateHotObservable(
  4869. OnNext(150, 1),
  4870. OnError<int>(230, ex)
  4871. );
  4872. var o2 = scheduler.CreateHotObservable(
  4873. OnNext(150, 1),
  4874. OnError<int>(250, new Exception())
  4875. );
  4876. var res = scheduler.Start(() =>
  4877. o1.Concat(o2)
  4878. );
  4879. res.Messages.AssertEqual(
  4880. OnError<int>(230, ex)
  4881. );
  4882. o1.Subscriptions.AssertEqual(
  4883. Subscribe(200, 230)
  4884. );
  4885. o2.Subscriptions.AssertEqual(
  4886. );
  4887. }
  4888. [Fact]
  4889. public void Concat_ReturnEmpty()
  4890. {
  4891. var scheduler = new TestScheduler();
  4892. var o1 = scheduler.CreateHotObservable(
  4893. OnNext(150, 1),
  4894. OnNext(210, 2),
  4895. OnCompleted<int>(230)
  4896. );
  4897. var o2 = scheduler.CreateHotObservable(
  4898. OnNext(150, 1),
  4899. OnCompleted<int>(250)
  4900. );
  4901. var res = scheduler.Start(() =>
  4902. o1.Concat(o2)
  4903. );
  4904. res.Messages.AssertEqual(
  4905. OnNext(210, 2),
  4906. OnCompleted<int>(250)
  4907. );
  4908. o1.Subscriptions.AssertEqual(
  4909. Subscribe(200, 230)
  4910. );
  4911. o2.Subscriptions.AssertEqual(
  4912. Subscribe(230, 250)
  4913. );
  4914. }
  4915. [Fact]
  4916. public void Concat_EmptyReturn()
  4917. {
  4918. var scheduler = new TestScheduler();
  4919. var o1 = scheduler.CreateHotObservable(
  4920. OnNext(150, 1),
  4921. OnCompleted<int>(230)
  4922. );
  4923. var o2 = scheduler.CreateHotObservable(
  4924. OnNext(150, 1),
  4925. OnNext(240, 2),
  4926. OnCompleted<int>(250)
  4927. );
  4928. var res = scheduler.Start(() =>
  4929. o1.Concat(o2)
  4930. );
  4931. res.Messages.AssertEqual(
  4932. OnNext(240, 2),
  4933. OnCompleted<int>(250)
  4934. );
  4935. o1.Subscriptions.AssertEqual(
  4936. Subscribe(200, 230)
  4937. );
  4938. o2.Subscriptions.AssertEqual(
  4939. Subscribe(230, 250)
  4940. );
  4941. }
  4942. [Fact]
  4943. public void Concat_ReturnNever()
  4944. {
  4945. var scheduler = new TestScheduler();
  4946. var o1 = scheduler.CreateHotObservable(
  4947. OnNext(150, 1),
  4948. OnNext(210, 2),
  4949. OnCompleted<int>(230)
  4950. );
  4951. var o2 = scheduler.CreateHotObservable(
  4952. OnNext(150, 1)
  4953. );
  4954. var res = scheduler.Start(() =>
  4955. o1.Concat(o2)
  4956. );
  4957. res.Messages.AssertEqual(
  4958. OnNext(210, 2)
  4959. );
  4960. o1.Subscriptions.AssertEqual(
  4961. Subscribe(200, 230)
  4962. );
  4963. o2.Subscriptions.AssertEqual(
  4964. Subscribe(230, 1000)
  4965. );
  4966. }
  4967. [Fact]
  4968. public void Concat_NeverReturn()
  4969. {
  4970. var scheduler = new TestScheduler();
  4971. var o1 = scheduler.CreateHotObservable(
  4972. OnNext(150, 1)
  4973. );
  4974. var o2 = scheduler.CreateHotObservable(
  4975. OnNext(150, 1),
  4976. OnNext(210, 2),
  4977. OnCompleted<int>(230)
  4978. );
  4979. var res = scheduler.Start(() =>
  4980. o1.Concat(o2)
  4981. );
  4982. res.Messages.AssertEqual(
  4983. );
  4984. o1.Subscriptions.AssertEqual(
  4985. Subscribe(200, 1000)
  4986. );
  4987. o2.Subscriptions.AssertEqual(
  4988. );
  4989. }
  4990. [Fact]
  4991. public void Concat_ReturnReturn()
  4992. {
  4993. var scheduler = new TestScheduler();
  4994. var ex = new Exception();
  4995. var o1 = scheduler.CreateHotObservable(
  4996. OnNext(150, 1),
  4997. OnNext(220, 2),
  4998. OnCompleted<int>(230)
  4999. );
  5000. var o2 = scheduler.CreateHotObservable(
  5001. OnNext(150, 1),
  5002. OnNext(240, 3),
  5003. OnCompleted<int>(250)
  5004. );
  5005. var res = scheduler.Start(() =>
  5006. o1.Concat(o2)
  5007. );
  5008. res.Messages.AssertEqual(
  5009. OnNext(220, 2),
  5010. OnNext(240, 3),
  5011. OnCompleted<int>(250)
  5012. );
  5013. o1.Subscriptions.AssertEqual(
  5014. Subscribe(200, 230)
  5015. );
  5016. o2.Subscriptions.AssertEqual(
  5017. Subscribe(230, 250)
  5018. );
  5019. }
  5020. [Fact]
  5021. public void Concat_ThrowReturn()
  5022. {
  5023. var scheduler = new TestScheduler();
  5024. var ex = new Exception();
  5025. var o1 = scheduler.CreateHotObservable(
  5026. OnNext(150, 1),
  5027. OnError<int>(230, ex)
  5028. );
  5029. var o2 = scheduler.CreateHotObservable(
  5030. OnNext(150, 1),
  5031. OnNext(240, 2),
  5032. OnCompleted<int>(250)
  5033. );
  5034. var res = scheduler.Start(() =>
  5035. o1.Concat(o2)
  5036. );
  5037. res.Messages.AssertEqual(
  5038. OnError<int>(230, ex)
  5039. );
  5040. o1.Subscriptions.AssertEqual(
  5041. Subscribe(200, 230)
  5042. );
  5043. o2.Subscriptions.AssertEqual(
  5044. );
  5045. }
  5046. [Fact]
  5047. public void Concat_ReturnThrow()
  5048. {
  5049. var scheduler = new TestScheduler();
  5050. var ex = new Exception();
  5051. var o1 = scheduler.CreateHotObservable(
  5052. OnNext(150, 1),
  5053. OnNext(220, 2),
  5054. OnCompleted<int>(230)
  5055. );
  5056. var o2 = scheduler.CreateHotObservable(
  5057. OnNext(150, 1),
  5058. OnError<int>(250, ex)
  5059. );
  5060. var res = scheduler.Start(() =>
  5061. o1.Concat(o2)
  5062. );
  5063. res.Messages.AssertEqual(
  5064. OnNext(220, 2),
  5065. OnError<int>(250, ex)
  5066. );
  5067. o1.Subscriptions.AssertEqual(
  5068. Subscribe(200, 230)
  5069. );
  5070. o2.Subscriptions.AssertEqual(
  5071. Subscribe(230, 250)
  5072. );
  5073. }
  5074. [Fact]
  5075. public void Concat_SomeDataSomeData()
  5076. {
  5077. var scheduler = new TestScheduler();
  5078. var ex = new Exception();
  5079. var o1 = scheduler.CreateHotObservable(
  5080. OnNext(150, 1),
  5081. OnNext(210, 2),
  5082. OnNext(220, 3),
  5083. OnCompleted<int>(225)
  5084. );
  5085. var o2 = scheduler.CreateHotObservable(
  5086. OnNext(150, 1),
  5087. OnNext(230, 4),
  5088. OnNext(240, 5),
  5089. OnCompleted<int>(250)
  5090. );
  5091. var res = scheduler.Start(() =>
  5092. o1.Concat(o2)
  5093. );
  5094. res.Messages.AssertEqual(
  5095. OnNext(210, 2),
  5096. OnNext(220, 3),
  5097. OnNext(230, 4),
  5098. OnNext(240, 5),
  5099. OnCompleted<int>(250)
  5100. );
  5101. o1.Subscriptions.AssertEqual(
  5102. Subscribe(200, 225)
  5103. );
  5104. o2.Subscriptions.AssertEqual(
  5105. Subscribe(225, 250)
  5106. );
  5107. }
  5108. [Fact]
  5109. public void Concat_EnumerableThrows()
  5110. {
  5111. var scheduler = new TestScheduler();
  5112. var o = scheduler.CreateHotObservable(
  5113. OnNext(150, 1),
  5114. OnNext(210, 2),
  5115. OnNext(220, 3),
  5116. OnCompleted<int>(225)
  5117. );
  5118. var ex = new Exception();
  5119. var xss = new MockEnumerable<IObservable<int>>(scheduler, GetObservablesForConcatThrow(o, ex));
  5120. var res = scheduler.Start(() =>
  5121. xss.Concat()
  5122. );
  5123. res.Messages.AssertEqual(
  5124. OnNext(210, 2),
  5125. OnNext(220, 3),
  5126. OnError<int>(225, ex)
  5127. );
  5128. o.Subscriptions.AssertEqual(
  5129. Subscribe(200, 225)
  5130. );
  5131. xss.Subscriptions.AssertEqual(
  5132. Subscribe(200, 225)
  5133. );
  5134. }
  5135. private IEnumerable<IObservable<int>> GetObservablesForConcatThrow(IObservable<int> first, Exception ex)
  5136. {
  5137. yield return first;
  5138. throw ex;
  5139. }
  5140. [Fact]
  5141. public void Concat_EnumerableTiming()
  5142. {
  5143. var scheduler = new TestScheduler();
  5144. var o1 = scheduler.CreateHotObservable(
  5145. OnNext(150, 1),
  5146. OnNext(210, 2), // !
  5147. OnNext(220, 3), // !
  5148. OnCompleted<int>(230)
  5149. );
  5150. var o2 = scheduler.CreateColdObservable(
  5151. OnNext(50, 4), // !
  5152. OnNext(60, 5), // !
  5153. OnNext(70, 6), // !
  5154. OnCompleted<int>(80)
  5155. );
  5156. var o3 = scheduler.CreateHotObservable(
  5157. OnNext(150, 1),
  5158. OnNext(200, 2),
  5159. OnNext(210, 3),
  5160. OnNext(220, 4),
  5161. OnNext(230, 5),
  5162. OnNext(270, 6),
  5163. OnNext(320, 7), // !
  5164. OnNext(330, 8), // !
  5165. OnCompleted<int>(340)
  5166. );
  5167. var xss = new MockEnumerable<ITestableObservable<int>>(scheduler, new[] { o1, o2, o3, o2 });
  5168. var res = scheduler.Start(() =>
  5169. xss.Select(xs => (IObservable<int>)xs).Concat()
  5170. );
  5171. res.Messages.AssertEqual(
  5172. OnNext(210, 2),
  5173. OnNext(220, 3),
  5174. OnNext(280, 4),
  5175. OnNext(290, 5),
  5176. OnNext(300, 6),
  5177. OnNext(320, 7),
  5178. OnNext(330, 8),
  5179. OnNext(390, 4),
  5180. OnNext(400, 5),
  5181. OnNext(410, 6),
  5182. OnCompleted<int>(420)
  5183. );
  5184. o1.Subscriptions.AssertEqual(
  5185. Subscribe(200, 230)
  5186. );
  5187. o2.Subscriptions.AssertEqual(
  5188. Subscribe(230, 310),
  5189. Subscribe(340, 420)
  5190. );
  5191. o3.Subscriptions.AssertEqual(
  5192. Subscribe(310, 340)
  5193. );
  5194. xss.Subscriptions.AssertEqual(
  5195. Subscribe(200, 420)
  5196. );
  5197. }
  5198. [Fact]
  5199. public void Concat_Enumerable_Dispose()
  5200. {
  5201. var scheduler = new TestScheduler();
  5202. var o1 = scheduler.CreateHotObservable(
  5203. OnNext(150, 1),
  5204. OnNext(210, 2),
  5205. OnNext(220, 3),
  5206. OnCompleted<int>(230)
  5207. );
  5208. var o2 = scheduler.CreateHotObservable(
  5209. OnNext(150, 1),
  5210. OnNext(200, 2),
  5211. OnNext(210, 3),
  5212. OnNext(240, 4),
  5213. OnNext(270, 5),
  5214. OnNext(320, 6),
  5215. OnNext(330, 7),
  5216. OnCompleted<int>(340)
  5217. );
  5218. var xss = new MockEnumerable<ITestableObservable<int>>(scheduler, new[] { o1, o2 });
  5219. var res = scheduler.Start(() =>
  5220. xss.Select(xs => (IObservable<int>)xs).Concat(),
  5221. 300
  5222. );
  5223. res.Messages.AssertEqual(
  5224. OnNext(210, 2),
  5225. OnNext(220, 3),
  5226. OnNext(240, 4),
  5227. OnNext(270, 5)
  5228. );
  5229. o1.Subscriptions.AssertEqual(
  5230. Subscribe(200, 230)
  5231. );
  5232. o2.Subscriptions.AssertEqual(
  5233. Subscribe(230, 300)
  5234. );
  5235. xss.Subscriptions.AssertEqual(
  5236. Subscribe(200, 300)
  5237. );
  5238. }
  5239. [Fact]
  5240. public void Concat_Optimization_DeferEvalTiming()
  5241. {
  5242. var scheduler = new TestScheduler();
  5243. var o1 = scheduler.CreateHotObservable(
  5244. OnNext(150, 1),
  5245. OnNext(210, 2),
  5246. OnNext(220, 3),
  5247. OnCompleted<int>(230)
  5248. );
  5249. var o2 = scheduler.CreateColdObservable(
  5250. OnNext(10, 4),
  5251. OnNext(20, 5),
  5252. OnNext(30, 6),
  5253. OnCompleted<int>(40)
  5254. );
  5255. var invoked = default(long);
  5256. var xs = o1;
  5257. var ys = Observable.Defer(() => { invoked = scheduler.Clock; return o2; });
  5258. var res = scheduler.Start(() =>
  5259. xs.Concat(ys)
  5260. );
  5261. res.Messages.AssertEqual(
  5262. OnNext(210, 2),
  5263. OnNext(220, 3),
  5264. OnNext(240, 4),
  5265. OnNext(250, 5),
  5266. OnNext(260, 6),
  5267. OnCompleted<int>(270)
  5268. );
  5269. o1.Subscriptions.AssertEqual(
  5270. Subscribe(200, 230)
  5271. );
  5272. o2.Subscriptions.AssertEqual(
  5273. Subscribe(230, 270)
  5274. );
  5275. Assert.Equal(230, invoked);
  5276. }
  5277. [Fact]
  5278. public void Concat_Optimization_DeferExceptionPropagation()
  5279. {
  5280. var scheduler = new TestScheduler();
  5281. var o1 = scheduler.CreateHotObservable(
  5282. OnNext(150, 1),
  5283. OnNext(210, 2),
  5284. OnCompleted<int>(220)
  5285. );
  5286. var ex = new Exception();
  5287. var invoked = default(long);
  5288. var xs = o1;
  5289. var ys = Observable.Defer<int>(new Func<IObservable<int>>(() => { invoked = scheduler.Clock; throw ex; }));
  5290. var res = scheduler.Start(() =>
  5291. xs.Concat(ys)
  5292. );
  5293. res.Messages.AssertEqual(
  5294. OnNext(210, 2),
  5295. OnError<int>(220, ex)
  5296. );
  5297. o1.Subscriptions.AssertEqual(
  5298. Subscribe(200, 220)
  5299. );
  5300. Assert.Equal(220, invoked);
  5301. }
  5302. #if !NO_PERF
  5303. [Fact]
  5304. public void Concat_TailRecursive1()
  5305. {
  5306. var create = 0L;
  5307. var start = 200L;
  5308. var end = 1000L;
  5309. var scheduler = new TestScheduler();
  5310. var o = scheduler.CreateColdObservable<int>(
  5311. OnNext(10, 1),
  5312. OnNext(20, 2),
  5313. OnNext(30, 3),
  5314. OnCompleted<int>(40)
  5315. );
  5316. var f = default(Func<IObservable<int>>);
  5317. f = () => Observable.Defer(() => o.Concat(f()));
  5318. var res = scheduler.Start(() => f(), create, start, end);
  5319. var expected = new List<Recorded<Notification<int>>>();
  5320. var t = start;
  5321. while (t <= end)
  5322. {
  5323. var n = (t - start) / 10;
  5324. if (n % 4 != 0)
  5325. {
  5326. expected.Add(OnNext(t, (int)(n % 4)));
  5327. }
  5328. t += 10;
  5329. }
  5330. res.Messages.AssertEqual(expected);
  5331. }
  5332. #if !NO_THREAD
  5333. [Fact]
  5334. public void Concat_TailRecursive2()
  5335. {
  5336. var f = default(Func<int, IObservable<int>>);
  5337. f = x => Observable.Defer(() => Observable.Return(x, ThreadPoolScheduler.Instance).Concat(f(x + 1)));
  5338. var lst = new List<int>();
  5339. f(0).Select(x => new StackTrace().FrameCount).Take(10).ForEach(lst.Add);
  5340. Assert.True(lst.Last() - lst.First() < 10);
  5341. }
  5342. #endif
  5343. #endif
  5344. #if !NO_TPL
  5345. [Fact]
  5346. public void Concat_Task()
  5347. {
  5348. var tss = Observable.Concat(new[] { Task.Factory.StartNew(() => 1), Task.Factory.StartNew(() => 2), Task.Factory.StartNew(() => 3) }.ToObservable());
  5349. var res = tss.ToArray().Single();
  5350. Assert.True(res.SequenceEqual(new[] { 1, 2, 3 }));
  5351. }
  5352. #endif
  5353. #endregion
  5354. #region + Merge +
  5355. [Fact]
  5356. public void Merge_ArgumentChecking()
  5357. {
  5358. var xs = DummyObservable<int>.Instance;
  5359. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(default(IScheduler), xs, xs));
  5360. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(xs, xs, default(IScheduler)));
  5361. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(xs, null));
  5362. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(default(IObservable<int>), xs));
  5363. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge((IObservable<int>[])null));
  5364. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge((IEnumerable<IObservable<int>>)null));
  5365. ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).Merge(xs, DummyScheduler.Instance));
  5366. ReactiveAssert.Throws<ArgumentNullException>(() => xs.Merge(default(IObservable<int>), DummyScheduler.Instance));
  5367. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge((IEnumerable<IObservable<int>>)null, DummyScheduler.Instance));
  5368. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(new IObservable<int>[0], default(IScheduler)));
  5369. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge((IObservable<IObservable<int>>)null));
  5370. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(DummyScheduler.Instance, (IObservable<int>[])null));
  5371. #if !NO_TPL
  5372. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge((IObservable<System.Threading.Tasks.Task<int>>)null));
  5373. #endif
  5374. }
  5375. [Fact]
  5376. public void Merge_DefaultScheduler()
  5377. {
  5378. var xs = Observable.Merge<int>(Observable.Return(42), Observable.Return(43), Observable.Return(44));
  5379. var res = xs.ToList().Single();
  5380. Assert.True(new[] { 42, 43, 44 }.SequenceEqual(res));
  5381. }
  5382. [Fact]
  5383. public void Merge_Never2()
  5384. {
  5385. var scheduler = new TestScheduler();
  5386. var n1 = scheduler.CreateHotObservable(
  5387. OnNext(150, 1)
  5388. );
  5389. var n2 = scheduler.CreateHotObservable(
  5390. OnNext(150, 1)
  5391. );
  5392. var res = scheduler.Start(() =>
  5393. Observable.Merge(scheduler, n1, n2)
  5394. );
  5395. res.Messages.AssertEqual(
  5396. );
  5397. n1.Subscriptions.AssertEqual(
  5398. Subscribe(201, 1000)
  5399. );
  5400. n2.Subscriptions.AssertEqual(
  5401. Subscribe(202, 1000)
  5402. );
  5403. }
  5404. [Fact]
  5405. public void Merge_Never3()
  5406. {
  5407. var scheduler = new TestScheduler();
  5408. var n1 = scheduler.CreateHotObservable(
  5409. OnNext(150, 1)
  5410. );
  5411. var n2 = scheduler.CreateHotObservable(
  5412. OnNext(150, 1)
  5413. );
  5414. var n3 = scheduler.CreateHotObservable(
  5415. OnNext(150, 1)
  5416. );
  5417. var res = scheduler.Start(() =>
  5418. Observable.Merge(scheduler, n1, n2, n3)
  5419. );
  5420. res.Messages.AssertEqual(
  5421. );
  5422. n1.Subscriptions.AssertEqual(
  5423. Subscribe(201, 1000)
  5424. );
  5425. n2.Subscriptions.AssertEqual(
  5426. Subscribe(202, 1000)
  5427. );
  5428. n3.Subscriptions.AssertEqual(
  5429. Subscribe(203, 1000)
  5430. );
  5431. }
  5432. [Fact]
  5433. public void Merge_Empty2()
  5434. {
  5435. var scheduler = new TestScheduler();
  5436. var e1 = scheduler.CreateHotObservable(
  5437. OnNext(150, 1),
  5438. OnCompleted<int>(210)
  5439. );
  5440. var e2 = scheduler.CreateHotObservable(
  5441. OnNext(150, 1),
  5442. OnCompleted<int>(230)
  5443. );
  5444. var res = scheduler.Start(() =>
  5445. Observable.Merge(scheduler, e1, e2)
  5446. );
  5447. res.Messages.AssertEqual(
  5448. OnCompleted<int>(230)
  5449. );
  5450. e1.Subscriptions.AssertEqual(
  5451. Subscribe(201, 210)
  5452. );
  5453. e2.Subscriptions.AssertEqual(
  5454. Subscribe(202, 230)
  5455. );
  5456. }
  5457. [Fact]
  5458. public void Merge_Empty3()
  5459. {
  5460. var scheduler = new TestScheduler();
  5461. var e1 = scheduler.CreateHotObservable(
  5462. OnNext(150, 1),
  5463. OnCompleted<int>(210)
  5464. );
  5465. var e2 = scheduler.CreateHotObservable(
  5466. OnNext(150, 1),
  5467. OnCompleted<int>(230)
  5468. );
  5469. var e3 = scheduler.CreateHotObservable(
  5470. OnNext(150, 1),
  5471. OnCompleted<int>(240)
  5472. );
  5473. var res = scheduler.Start(() =>
  5474. Observable.Merge(scheduler, e1, e2, e3)
  5475. );
  5476. res.Messages.AssertEqual(
  5477. OnCompleted<int>(240)
  5478. );
  5479. e1.Subscriptions.AssertEqual(
  5480. Subscribe(201, 210)
  5481. );
  5482. e2.Subscriptions.AssertEqual(
  5483. Subscribe(202, 230)
  5484. );
  5485. e3.Subscriptions.AssertEqual(
  5486. Subscribe(203, 240)
  5487. );
  5488. }
  5489. [Fact]
  5490. public void Merge_EmptyDelayed2_RightLast()
  5491. {
  5492. var scheduler = new TestScheduler();
  5493. var e1 = scheduler.CreateHotObservable(
  5494. OnNext(150, 1),
  5495. OnCompleted<int>(240)
  5496. );
  5497. var e2 = scheduler.CreateHotObservable(
  5498. OnNext(150, 1),
  5499. OnCompleted<int>(250)
  5500. );
  5501. var res = scheduler.Start(() =>
  5502. Observable.Merge(scheduler, e1, e2)
  5503. );
  5504. res.Messages.AssertEqual(
  5505. OnCompleted<int>(250)
  5506. );
  5507. e1.Subscriptions.AssertEqual(
  5508. Subscribe(201, 240)
  5509. );
  5510. e2.Subscriptions.AssertEqual(
  5511. Subscribe(202, 250)
  5512. );
  5513. }
  5514. [Fact]
  5515. public void Merge_EmptyDelayed2_LeftLast()
  5516. {
  5517. var scheduler = new TestScheduler();
  5518. var e1 = scheduler.CreateHotObservable(
  5519. OnNext(150, 1),
  5520. OnCompleted<int>(250)
  5521. );
  5522. var e2 = scheduler.CreateHotObservable(
  5523. OnNext(150, 1),
  5524. OnCompleted<int>(240)
  5525. );
  5526. var res = scheduler.Start(() =>
  5527. Observable.Merge(scheduler, e1, e2)
  5528. );
  5529. res.Messages.AssertEqual(
  5530. OnCompleted<int>(250)
  5531. );
  5532. e1.Subscriptions.AssertEqual(
  5533. Subscribe(201, 250)
  5534. );
  5535. e2.Subscriptions.AssertEqual(
  5536. Subscribe(202, 240)
  5537. );
  5538. }
  5539. [Fact]
  5540. public void Merge_EmptyDelayed3_MiddleLast()
  5541. {
  5542. var scheduler = new TestScheduler();
  5543. var e1 = scheduler.CreateHotObservable(
  5544. OnNext(150, 1),
  5545. OnCompleted<int>(245)
  5546. );
  5547. var e2 = scheduler.CreateHotObservable(
  5548. OnNext(150, 1),
  5549. OnCompleted<int>(250)
  5550. );
  5551. var e3 = scheduler.CreateHotObservable(
  5552. OnNext(150, 1),
  5553. OnCompleted<int>(240)
  5554. );
  5555. var res = scheduler.Start(() =>
  5556. Observable.Merge(scheduler, e1, e2, e3)
  5557. );
  5558. res.Messages.AssertEqual(
  5559. OnCompleted<int>(250)
  5560. );
  5561. e1.Subscriptions.AssertEqual(
  5562. Subscribe(201, 245)
  5563. );
  5564. e2.Subscriptions.AssertEqual(
  5565. Subscribe(202, 250)
  5566. );
  5567. e3.Subscriptions.AssertEqual(
  5568. Subscribe(203, 240)
  5569. );
  5570. }
  5571. [Fact]
  5572. public void Merge_EmptyNever()
  5573. {
  5574. var scheduler = new TestScheduler();
  5575. var e1 = scheduler.CreateHotObservable(
  5576. OnNext(150, 1),
  5577. OnCompleted<int>(245)
  5578. );
  5579. var n1 = scheduler.CreateHotObservable(
  5580. OnNext(150, 1)
  5581. );
  5582. var res = scheduler.Start(() =>
  5583. Observable.Merge(scheduler, e1, n1)
  5584. );
  5585. res.Messages.AssertEqual(
  5586. );
  5587. e1.Subscriptions.AssertEqual(
  5588. Subscribe(201, 245)
  5589. );
  5590. n1.Subscriptions.AssertEqual(
  5591. Subscribe(202, 1000)
  5592. );
  5593. }
  5594. [Fact]
  5595. public void Merge_NeverEmpty()
  5596. {
  5597. var scheduler = new TestScheduler();
  5598. var n1 = scheduler.CreateHotObservable(
  5599. OnNext(150, 1)
  5600. );
  5601. var e1 = scheduler.CreateHotObservable(
  5602. OnNext(150, 1),
  5603. OnCompleted<int>(245)
  5604. );
  5605. var res = scheduler.Start(() =>
  5606. Observable.Merge(scheduler, n1, e1)
  5607. );
  5608. res.Messages.AssertEqual(
  5609. );
  5610. n1.Subscriptions.AssertEqual(
  5611. Subscribe(201, 1000)
  5612. );
  5613. e1.Subscriptions.AssertEqual(
  5614. Subscribe(202, 245)
  5615. );
  5616. }
  5617. [Fact]
  5618. public void Merge_ReturnNever()
  5619. {
  5620. var scheduler = new TestScheduler();
  5621. var r1 = scheduler.CreateHotObservable(
  5622. OnNext(150, 1),
  5623. OnNext(210, 2),
  5624. OnCompleted<int>(245)
  5625. );
  5626. var n1 = scheduler.CreateHotObservable(
  5627. OnNext(150, 1)
  5628. );
  5629. var res = scheduler.Start(() =>
  5630. Observable.Merge(scheduler, r1, n1)
  5631. );
  5632. res.Messages.AssertEqual(
  5633. OnNext(210, 2)
  5634. );
  5635. r1.Subscriptions.AssertEqual(
  5636. Subscribe(201, 245)
  5637. );
  5638. n1.Subscriptions.AssertEqual(
  5639. Subscribe(202, 1000)
  5640. );
  5641. }
  5642. [Fact]
  5643. public void Merge_NeverReturn()
  5644. {
  5645. var scheduler = new TestScheduler();
  5646. var n1 = scheduler.CreateHotObservable(
  5647. OnNext(150, 1)
  5648. );
  5649. var r1 = scheduler.CreateHotObservable(
  5650. OnNext(150, 1),
  5651. OnNext(210, 2),
  5652. OnCompleted<int>(245)
  5653. );
  5654. var res = scheduler.Start(() =>
  5655. Observable.Merge(scheduler, n1, r1)
  5656. );
  5657. res.Messages.AssertEqual(
  5658. OnNext(210, 2)
  5659. );
  5660. n1.Subscriptions.AssertEqual(
  5661. Subscribe(201, 1000)
  5662. );
  5663. r1.Subscriptions.AssertEqual(
  5664. Subscribe(202, 245)
  5665. );
  5666. }
  5667. [Fact]
  5668. public void Merge_ErrorNever()
  5669. {
  5670. var scheduler = new TestScheduler();
  5671. var ex = new Exception();
  5672. var e1 = scheduler.CreateHotObservable(
  5673. OnNext(150, 1),
  5674. OnNext(210, 2),
  5675. OnError<int>(245, ex)
  5676. );
  5677. var n1 = scheduler.CreateHotObservable(
  5678. OnNext(150, 1)
  5679. );
  5680. var res = scheduler.Start(() =>
  5681. Observable.Merge(scheduler, e1, n1)
  5682. );
  5683. res.Messages.AssertEqual(
  5684. OnNext(210, 2),
  5685. OnError<int>(245, ex)
  5686. );
  5687. e1.Subscriptions.AssertEqual(
  5688. Subscribe(201, 245)
  5689. );
  5690. n1.Subscriptions.AssertEqual(
  5691. Subscribe(202, 245)
  5692. );
  5693. }
  5694. [Fact]
  5695. public void Merge_NeverError()
  5696. {
  5697. var scheduler = new TestScheduler();
  5698. var ex = new Exception();
  5699. var n1 = scheduler.CreateHotObservable(
  5700. OnNext(150, 1)
  5701. );
  5702. var e1 = scheduler.CreateHotObservable(
  5703. OnNext(150, 1),
  5704. OnNext(210, 2),
  5705. OnError<int>(245, ex)
  5706. );
  5707. var res = scheduler.Start(() =>
  5708. Observable.Merge(scheduler, n1, e1)
  5709. );
  5710. res.Messages.AssertEqual(
  5711. OnNext(210, 2),
  5712. OnError<int>(245, ex)
  5713. );
  5714. n1.Subscriptions.AssertEqual(
  5715. Subscribe(201, 245)
  5716. );
  5717. e1.Subscriptions.AssertEqual(
  5718. Subscribe(202, 245)
  5719. );
  5720. }
  5721. [Fact]
  5722. public void Merge_EmptyReturn()
  5723. {
  5724. var scheduler = new TestScheduler();
  5725. var e1 = scheduler.CreateHotObservable(
  5726. OnNext(150, 1),
  5727. OnCompleted<int>(245)
  5728. );
  5729. var r1 = scheduler.CreateHotObservable(
  5730. OnNext(150, 1),
  5731. OnNext(210, 2),
  5732. OnCompleted<int>(250)
  5733. );
  5734. var res = scheduler.Start(() =>
  5735. Observable.Merge(scheduler, e1, r1)
  5736. );
  5737. res.Messages.AssertEqual(
  5738. OnNext(210, 2),
  5739. OnCompleted<int>(250)
  5740. );
  5741. e1.Subscriptions.AssertEqual(
  5742. Subscribe(201, 245)
  5743. );
  5744. r1.Subscriptions.AssertEqual(
  5745. Subscribe(202, 250)
  5746. );
  5747. }
  5748. [Fact]
  5749. public void Merge_ReturnEmpty()
  5750. {
  5751. var scheduler = new TestScheduler();
  5752. var r1 = scheduler.CreateHotObservable(
  5753. OnNext(150, 1),
  5754. OnNext(210, 2),
  5755. OnCompleted<int>(250)
  5756. );
  5757. var e1 = scheduler.CreateHotObservable(
  5758. OnNext(150, 1),
  5759. OnCompleted<int>(245)
  5760. );
  5761. var res = scheduler.Start(() =>
  5762. Observable.Merge(scheduler, r1, e1)
  5763. );
  5764. res.Messages.AssertEqual(
  5765. OnNext(210, 2),
  5766. OnCompleted<int>(250)
  5767. );
  5768. r1.Subscriptions.AssertEqual(
  5769. Subscribe(201, 250)
  5770. );
  5771. e1.Subscriptions.AssertEqual(
  5772. Subscribe(202, 245)
  5773. );
  5774. }
  5775. [Fact]
  5776. public void Merge_Lots2()
  5777. {
  5778. var scheduler = new TestScheduler();
  5779. var o1 = scheduler.CreateHotObservable(
  5780. OnNext(150, 1),
  5781. OnNext(210, 2),
  5782. OnNext(220, 4),
  5783. OnNext(230, 6),
  5784. OnNext(240, 8),
  5785. OnCompleted<int>(245)
  5786. );
  5787. var o2 = scheduler.CreateHotObservable(
  5788. OnNext(150, 1),
  5789. OnNext(215, 3),
  5790. OnNext(225, 5),
  5791. OnNext(235, 7),
  5792. OnNext(245, 9),
  5793. OnCompleted<int>(250)
  5794. );
  5795. var res = scheduler.Start(() =>
  5796. Observable.Merge(scheduler, o1, o2)
  5797. );
  5798. res.Messages.AssertEqual(
  5799. OnNext(210, 2),
  5800. OnNext(215, 3),
  5801. OnNext(220, 4),
  5802. OnNext(225, 5),
  5803. OnNext(230, 6),
  5804. OnNext(235, 7),
  5805. OnNext(240, 8),
  5806. OnNext(245, 9),
  5807. OnCompleted<int>(250)
  5808. );
  5809. o1.Subscriptions.AssertEqual(
  5810. Subscribe(201, 245)
  5811. );
  5812. o2.Subscriptions.AssertEqual(
  5813. Subscribe(202, 250)
  5814. );
  5815. }
  5816. [Fact]
  5817. public void Merge_Lots3()
  5818. {
  5819. var scheduler = new TestScheduler();
  5820. var o1 = scheduler.CreateHotObservable(
  5821. OnNext(150, 1),
  5822. OnNext(210, 2),
  5823. OnNext(225, 5),
  5824. OnNext(240, 8),
  5825. OnCompleted<int>(245)
  5826. );
  5827. var o2 = scheduler.CreateHotObservable(
  5828. OnNext(150, 1),
  5829. OnNext(215, 3),
  5830. OnNext(230, 6),
  5831. OnNext(245, 9),
  5832. OnCompleted<int>(250)
  5833. );
  5834. var o3 = scheduler.CreateHotObservable(
  5835. OnNext(150, 1),
  5836. OnNext(220, 4),
  5837. OnNext(235, 7),
  5838. OnCompleted<int>(240)
  5839. );
  5840. var res = scheduler.Start(() =>
  5841. new[] { o1, o2, o3 }.Merge(scheduler)
  5842. );
  5843. res.Messages.AssertEqual(
  5844. OnNext(210, 2),
  5845. OnNext(215, 3),
  5846. OnNext(220, 4),
  5847. OnNext(225, 5),
  5848. OnNext(230, 6),
  5849. OnNext(235, 7),
  5850. OnNext(240, 8),
  5851. OnNext(245, 9),
  5852. OnCompleted<int>(250)
  5853. );
  5854. o1.Subscriptions.AssertEqual(
  5855. Subscribe(201, 245)
  5856. );
  5857. o2.Subscriptions.AssertEqual(
  5858. Subscribe(202, 250)
  5859. );
  5860. o3.Subscriptions.AssertEqual(
  5861. Subscribe(203, 240)
  5862. );
  5863. }
  5864. [Fact]
  5865. public void Merge_LotsMore()
  5866. {
  5867. var inputs = new List<List<Recorded<Notification<int>>>>();
  5868. const int N = 10;
  5869. for (int i = 0; i < N; i++)
  5870. {
  5871. var lst = new List<Recorded<Notification<int>>> { OnNext(150, 1) };
  5872. inputs.Add(lst);
  5873. ushort start = (ushort)(301 + i);
  5874. for (int j = 0; j < i; j++)
  5875. {
  5876. var onNext = OnNext(start += (ushort)(j * 5), j + i + 2);
  5877. lst.Add(onNext);
  5878. }
  5879. lst.Add(OnCompleted<int>((ushort)(start + N - i)));
  5880. }
  5881. var inputsFlat = inputs.Aggregate((l, r) => l.Concat(r).ToList()).ToArray();
  5882. var resOnNext = (from n in inputsFlat
  5883. where n.Time >= 200
  5884. where n.Value.Kind == NotificationKind.OnNext
  5885. orderby n.Time
  5886. select n).ToList();
  5887. var lastCompleted = (from n in inputsFlat
  5888. where n.Time >= 200
  5889. where n.Value.Kind == NotificationKind.OnCompleted
  5890. orderby n.Time descending
  5891. select n).First();
  5892. var scheduler = new TestScheduler();
  5893. // Last ToArray: got to create the hot observables *now*
  5894. var xss = inputs.Select(lst => (IObservable<int>)scheduler.CreateHotObservable(lst.ToArray())).ToArray();
  5895. var res = scheduler.Start(() =>
  5896. xss.Merge(scheduler)
  5897. );
  5898. Assert.Equal(resOnNext.Count + 1, res.Messages.Count, "length");
  5899. for (int i = 0; i < resOnNext.Count; i++)
  5900. {
  5901. var msg = res.Messages[i];
  5902. Assert.True(msg.Time == resOnNext[i].Time);
  5903. Assert.True(msg.Value.Kind == NotificationKind.OnNext);
  5904. Assert.True(msg.Value.Value == resOnNext[i].Value.Value);
  5905. }
  5906. Assert.True(res.Messages[resOnNext.Count].Value.Kind == NotificationKind.OnCompleted && res.Messages[resOnNext.Count].Time == lastCompleted.Time, "complete");
  5907. }
  5908. [Fact]
  5909. public void Merge_ErrorLeft()
  5910. {
  5911. var scheduler = new TestScheduler();
  5912. var ex = new Exception();
  5913. var o1 = scheduler.CreateHotObservable(
  5914. OnNext(150, 1),
  5915. OnNext(210, 2),
  5916. OnError<int>(245, ex)
  5917. );
  5918. var o2 = scheduler.CreateHotObservable(
  5919. OnNext(150, 1),
  5920. OnNext(215, 3),
  5921. OnCompleted<int>(250)
  5922. );
  5923. var res = scheduler.Start(() =>
  5924. Observable.Merge(o1, o2, scheduler)
  5925. );
  5926. res.Messages.AssertEqual(
  5927. OnNext(210, 2),
  5928. OnNext(215, 3),
  5929. OnError<int>(245, ex)
  5930. );
  5931. o1.Subscriptions.AssertEqual(
  5932. Subscribe(201, 245)
  5933. );
  5934. o2.Subscriptions.AssertEqual(
  5935. Subscribe(202, 245)
  5936. );
  5937. }
  5938. [Fact]
  5939. public void Merge_ErrorCausesDisposal()
  5940. {
  5941. var scheduler = new TestScheduler();
  5942. var ex = new Exception();
  5943. var e1 = scheduler.CreateHotObservable(
  5944. OnNext(150, 1),
  5945. OnError<int>(210, ex) //!
  5946. );
  5947. var o1 = scheduler.CreateHotObservable(
  5948. OnNext(150, 1),
  5949. OnNext(220, 1), // should not come
  5950. OnCompleted<int>(230)
  5951. );
  5952. var res = scheduler.Start(() =>
  5953. Observable.Merge(e1, o1, scheduler)
  5954. );
  5955. res.Messages.AssertEqual(
  5956. OnError<int>(210, ex) //!
  5957. );
  5958. e1.Subscriptions.AssertEqual(
  5959. Subscribe(201, 210)
  5960. );
  5961. o1.Subscriptions.AssertEqual(
  5962. Subscribe(202, 210)
  5963. );
  5964. }
  5965. [Fact]
  5966. public void Merge_ObservableOfObservable_Data()
  5967. {
  5968. var scheduler = new TestScheduler();
  5969. var ys1 = scheduler.CreateColdObservable(
  5970. OnNext(10, 101),
  5971. OnNext(20, 102),
  5972. OnNext(110, 103),
  5973. OnNext(120, 104),
  5974. OnNext(210, 105),
  5975. OnNext(220, 106),
  5976. OnCompleted<int>(230)
  5977. );
  5978. var ys2 = scheduler.CreateColdObservable(
  5979. OnNext(10, 201),
  5980. OnNext(20, 202),
  5981. OnNext(30, 203),
  5982. OnNext(40, 204),
  5983. OnCompleted<int>(50)
  5984. );
  5985. var ys3 = scheduler.CreateColdObservable(
  5986. OnNext(10, 301),
  5987. OnNext(20, 302),
  5988. OnNext(30, 303),
  5989. OnNext(40, 304),
  5990. OnNext(120, 305),
  5991. OnCompleted<int>(150)
  5992. );
  5993. var xs = scheduler.CreateHotObservable(
  5994. OnNext<IObservable<int>>(300, ys1),
  5995. OnNext<IObservable<int>>(400, ys2),
  5996. OnNext<IObservable<int>>(500, ys3),
  5997. OnCompleted<IObservable<int>>(600)
  5998. );
  5999. var res = scheduler.Start(() =>
  6000. xs.Merge()
  6001. );
  6002. res.Messages.AssertEqual(
  6003. OnNext(310, 101),
  6004. OnNext(320, 102),
  6005. OnNext(410, 103),
  6006. OnNext(410, 201),
  6007. OnNext(420, 104),
  6008. OnNext(420, 202),
  6009. OnNext(430, 203),
  6010. OnNext(440, 204),
  6011. OnNext(510, 105),
  6012. OnNext(510, 301),
  6013. OnNext(520, 106),
  6014. OnNext(520, 302),
  6015. OnNext(530, 303),
  6016. OnNext(540, 304),
  6017. OnNext(620, 305),
  6018. OnCompleted<int>(650)
  6019. );
  6020. #if !NO_PERF
  6021. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  6022. xs.Subscriptions.AssertEqual(
  6023. Subscribe(200, 600)
  6024. );
  6025. #else
  6026. xs.Subscriptions.AssertEqual(
  6027. Subscribe(200, 650)
  6028. );
  6029. #endif
  6030. ys1.Subscriptions.AssertEqual(
  6031. Subscribe(300, 530)
  6032. );
  6033. ys2.Subscriptions.AssertEqual(
  6034. Subscribe(400, 450)
  6035. );
  6036. ys3.Subscriptions.AssertEqual(
  6037. Subscribe(500, 650)
  6038. );
  6039. }
  6040. [Fact]
  6041. public void Merge_ObservableOfObservable_Data_NonOverlapped()
  6042. {
  6043. var scheduler = new TestScheduler();
  6044. var ys1 = scheduler.CreateColdObservable(
  6045. OnNext(10, 101),
  6046. OnNext(20, 102),
  6047. OnCompleted<int>(230)
  6048. );
  6049. var ys2 = scheduler.CreateColdObservable(
  6050. OnNext(10, 201),
  6051. OnNext(20, 202),
  6052. OnNext(30, 203),
  6053. OnNext(40, 204),
  6054. OnCompleted<int>(50)
  6055. );
  6056. var ys3 = scheduler.CreateColdObservable(
  6057. OnNext(10, 301),
  6058. OnNext(20, 302),
  6059. OnNext(30, 303),
  6060. OnNext(40, 304),
  6061. OnCompleted<int>(50)
  6062. );
  6063. var xs = scheduler.CreateHotObservable(
  6064. OnNext<IObservable<int>>(300, ys1),
  6065. OnNext<IObservable<int>>(400, ys2),
  6066. OnNext<IObservable<int>>(500, ys3),
  6067. OnCompleted<IObservable<int>>(600)
  6068. );
  6069. var res = scheduler.Start(() =>
  6070. xs.Merge()
  6071. );
  6072. res.Messages.AssertEqual(
  6073. OnNext(310, 101),
  6074. OnNext(320, 102),
  6075. OnNext(410, 201),
  6076. OnNext(420, 202),
  6077. OnNext(430, 203),
  6078. OnNext(440, 204),
  6079. OnNext(510, 301),
  6080. OnNext(520, 302),
  6081. OnNext(530, 303),
  6082. OnNext(540, 304),
  6083. OnCompleted<int>(600)
  6084. );
  6085. xs.Subscriptions.AssertEqual(
  6086. Subscribe(200, 600)
  6087. );
  6088. ys1.Subscriptions.AssertEqual(
  6089. Subscribe(300, 530)
  6090. );
  6091. ys2.Subscriptions.AssertEqual(
  6092. Subscribe(400, 450)
  6093. );
  6094. ys3.Subscriptions.AssertEqual(
  6095. Subscribe(500, 550)
  6096. );
  6097. }
  6098. [Fact]
  6099. public void Merge_ObservableOfObservable_InnerThrows()
  6100. {
  6101. var scheduler = new TestScheduler();
  6102. var ex = new Exception();
  6103. var ys1 = scheduler.CreateColdObservable(
  6104. OnNext(10, 101),
  6105. OnNext(20, 102),
  6106. OnNext(110, 103),
  6107. OnNext(120, 104),
  6108. OnNext(210, 105),
  6109. OnNext(220, 106),
  6110. OnCompleted<int>(230)
  6111. );
  6112. var ys2 = scheduler.CreateColdObservable(
  6113. OnNext(10, 201),
  6114. OnNext(20, 202),
  6115. OnNext(30, 203),
  6116. OnNext(40, 204),
  6117. OnError<int>(50, ex)
  6118. );
  6119. var ys3 = scheduler.CreateColdObservable(
  6120. OnNext(10, 301),
  6121. OnNext(20, 302),
  6122. OnNext(30, 303),
  6123. OnNext(40, 304),
  6124. OnCompleted<int>(150)
  6125. );
  6126. var xs = scheduler.CreateHotObservable(
  6127. OnNext<IObservable<int>>(300, ys1),
  6128. OnNext<IObservable<int>>(400, ys2),
  6129. OnNext<IObservable<int>>(500, ys3),
  6130. OnCompleted<IObservable<int>>(600)
  6131. );
  6132. var res = scheduler.Start(() =>
  6133. xs.Merge()
  6134. );
  6135. res.Messages.AssertEqual(
  6136. OnNext(310, 101),
  6137. OnNext(320, 102),
  6138. OnNext(410, 103),
  6139. OnNext(410, 201),
  6140. OnNext(420, 104),
  6141. OnNext(420, 202),
  6142. OnNext(430, 203),
  6143. OnNext(440, 204),
  6144. OnError<int>(450, ex)
  6145. );
  6146. xs.Subscriptions.AssertEqual(
  6147. Subscribe(200, 450)
  6148. );
  6149. ys1.Subscriptions.AssertEqual(
  6150. Subscribe(300, 450)
  6151. );
  6152. ys2.Subscriptions.AssertEqual(
  6153. Subscribe(400, 450)
  6154. );
  6155. ys3.Subscriptions.AssertEqual(
  6156. );
  6157. }
  6158. [Fact]
  6159. public void Merge_ObservableOfObservable_OuterThrows()
  6160. {
  6161. var scheduler = new TestScheduler();
  6162. var ex = new Exception();
  6163. var ys1 = scheduler.CreateColdObservable(
  6164. OnNext(10, 101),
  6165. OnNext(20, 102),
  6166. OnNext(110, 103),
  6167. OnNext(120, 104),
  6168. OnNext(210, 105),
  6169. OnNext(220, 106),
  6170. OnCompleted<int>(230)
  6171. );
  6172. var ys2 = scheduler.CreateColdObservable(
  6173. OnNext(10, 201),
  6174. OnNext(20, 202),
  6175. OnNext(30, 203),
  6176. OnNext(40, 204),
  6177. OnCompleted<int>(50)
  6178. );
  6179. var xs = scheduler.CreateHotObservable(
  6180. OnNext<IObservable<int>>(300, ys1),
  6181. OnNext<IObservable<int>>(400, ys2),
  6182. OnError<IObservable<int>>(500, ex)
  6183. );
  6184. var res = scheduler.Start(() =>
  6185. xs.Merge()
  6186. );
  6187. res.Messages.AssertEqual(
  6188. OnNext(310, 101),
  6189. OnNext(320, 102),
  6190. OnNext(410, 103),
  6191. OnNext(410, 201),
  6192. OnNext(420, 104),
  6193. OnNext(420, 202),
  6194. OnNext(430, 203),
  6195. OnNext(440, 204),
  6196. OnError<int>(500, ex)
  6197. );
  6198. xs.Subscriptions.AssertEqual(
  6199. Subscribe(200, 500)
  6200. );
  6201. ys1.Subscriptions.AssertEqual(
  6202. Subscribe(300, 500)
  6203. );
  6204. ys2.Subscriptions.AssertEqual(
  6205. Subscribe(400, 450)
  6206. );
  6207. }
  6208. [Fact]
  6209. public void Merge_Binary_DefaultScheduler()
  6210. {
  6211. Assert.True(Observable.Return(1).Merge(Observable.Return(2)).ToEnumerable().OrderBy(x => x).SequenceEqual(new[] { 1, 2 }));
  6212. }
  6213. [Fact]
  6214. public void Merge_Params_DefaultScheduler()
  6215. {
  6216. Assert.True(Observable.Merge(Observable.Return(1), Observable.Return(2)).ToEnumerable().OrderBy(x => x).SequenceEqual(new[] { 1, 2 }));
  6217. }
  6218. [Fact]
  6219. public void Merge_IEnumerableOfIObservable_DefaultScheduler()
  6220. {
  6221. Assert.True(Observable.Merge((IEnumerable<IObservable<int>>)new[] { Observable.Return(1), Observable.Return(2) }).ToEnumerable().OrderBy(x => x).SequenceEqual(new[] { 1, 2 }));
  6222. }
  6223. [Fact]
  6224. public void MergeConcat_ArgumentChecking()
  6225. {
  6226. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(default(IEnumerable<IObservable<int>>), 1, DummyScheduler.Instance));
  6227. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.Merge(DummyEnumerable<IObservable<int>>.Instance, 0, DummyScheduler.Instance));
  6228. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(DummyEnumerable<IObservable<int>>.Instance, 1, null));
  6229. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(default(IEnumerable<IObservable<int>>), 1));
  6230. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.Merge(DummyEnumerable<IObservable<int>>.Instance, 0));
  6231. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Merge(default(IObservable<IObservable<int>>), 1));
  6232. ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.Merge(DummyObservable<IObservable<int>>.Instance, 0));
  6233. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat(default(IObservable<IObservable<int>>)));
  6234. #if !NO_TPL
  6235. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Concat(default(IObservable<System.Threading.Tasks.Task<int>>)));
  6236. #endif
  6237. }
  6238. [Fact]
  6239. public void MergeConcat_Enumerable_Scheduler()
  6240. {
  6241. var b = Enumerable.Range(1, 3).Select(x => Observable.Range(x * 10, 3)).Merge(1)
  6242. .SequenceEqual(new[] { 10, 11, 12, 20, 21, 22, 30, 31, 32 }.ToObservable())
  6243. .First();
  6244. Assert.True(b);
  6245. }
  6246. [Fact]
  6247. public void MergeConcat_Enumerable()
  6248. {
  6249. var b = Enumerable.Range(1, 3).Select(x => Observable.Range(x * 10, 3)).Merge(1, DefaultScheduler.Instance)
  6250. .SequenceEqual(new[] { 10, 11, 12, 20, 21, 22, 30, 31, 32 }.ToObservable())
  6251. .First();
  6252. Assert.True(b);
  6253. }
  6254. [Fact]
  6255. public void MergeConcat_Default()
  6256. {
  6257. var b = Observable.Range(1, 3).Select(x => Observable.Range(x * 10, 3)).Concat()
  6258. .SequenceEqual(new[] { 10, 11, 12, 20, 21, 22, 30, 31, 32 }.ToObservable())
  6259. .First();
  6260. Assert.True(b);
  6261. }
  6262. [Fact]
  6263. public void MergeConcat_Basic()
  6264. {
  6265. var scheduler = new TestScheduler();
  6266. var ys1 = scheduler.CreateColdObservable(
  6267. OnNext(50, 1),
  6268. OnNext(100, 2),
  6269. OnNext(120, 3),
  6270. OnCompleted<int>(140)
  6271. );
  6272. var ys2 = scheduler.CreateColdObservable(
  6273. OnNext(20, 4),
  6274. OnNext(70, 5),
  6275. OnCompleted<int>(200)
  6276. );
  6277. var ys3 = scheduler.CreateColdObservable(
  6278. OnNext(10, 6),
  6279. OnNext(90, 7),
  6280. OnNext(110, 8),
  6281. OnCompleted<int>(130)
  6282. );
  6283. var ys4 = scheduler.CreateColdObservable(
  6284. OnNext(210, 9),
  6285. OnNext(240, 10),
  6286. OnCompleted<int>(300)
  6287. );
  6288. var xs = scheduler.CreateHotObservable<IObservable<int>>(
  6289. OnNext<IObservable<int>>(210, ys1),
  6290. OnNext<IObservable<int>>(260, ys2),
  6291. OnNext<IObservable<int>>(270, ys3),
  6292. OnNext<IObservable<int>>(320, ys4),
  6293. OnCompleted<IObservable<int>>(400)
  6294. );
  6295. var res = scheduler.Start(() =>
  6296. xs.Merge(2)
  6297. );
  6298. res.Messages.AssertEqual(
  6299. OnNext(260, 1),
  6300. OnNext(280, 4),
  6301. OnNext(310, 2),
  6302. OnNext(330, 3),
  6303. OnNext(330, 5),
  6304. OnNext(360, 6),
  6305. OnNext(440, 7),
  6306. OnNext(460, 8),
  6307. OnNext(670, 9),
  6308. OnNext(700, 10),
  6309. OnCompleted<int>(760)
  6310. );
  6311. #if !NO_PERF
  6312. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  6313. xs.Subscriptions.AssertEqual(
  6314. Subscribe(200, 400)
  6315. );
  6316. #else
  6317. xs.Subscriptions.AssertEqual(
  6318. Subscribe(200, 760)
  6319. );
  6320. #endif
  6321. ys1.Subscriptions.AssertEqual(
  6322. Subscribe(210, 350)
  6323. );
  6324. ys2.Subscriptions.AssertEqual(
  6325. Subscribe(260, 460)
  6326. );
  6327. ys3.Subscriptions.AssertEqual(
  6328. Subscribe(350, 480)
  6329. );
  6330. ys4.Subscriptions.AssertEqual(
  6331. Subscribe(460, 760)
  6332. );
  6333. }
  6334. [Fact]
  6335. public void MergeConcat_Basic_Long()
  6336. {
  6337. var scheduler = new TestScheduler();
  6338. var ys1 = scheduler.CreateColdObservable(
  6339. OnNext(50, 1),
  6340. OnNext(100, 2),
  6341. OnNext(120, 3),
  6342. OnCompleted<int>(140)
  6343. );
  6344. var ys2 = scheduler.CreateColdObservable(
  6345. OnNext(20, 4),
  6346. OnNext(70, 5),
  6347. OnCompleted<int>(300)
  6348. );
  6349. var ys3 = scheduler.CreateColdObservable(
  6350. OnNext(10, 6),
  6351. OnNext(90, 7),
  6352. OnNext(110, 8),
  6353. OnCompleted<int>(130)
  6354. );
  6355. var ys4 = scheduler.CreateColdObservable(
  6356. OnNext(210, 9),
  6357. OnNext(240, 10),
  6358. OnCompleted<int>(300)
  6359. );
  6360. var xs = scheduler.CreateHotObservable(
  6361. OnNext<IObservable<int>>(210, ys1),
  6362. OnNext<IObservable<int>>(260, ys2),
  6363. OnNext<IObservable<int>>(270, ys3),
  6364. OnNext<IObservable<int>>(320, ys4),
  6365. OnCompleted<IObservable<int>>(400)
  6366. );
  6367. var res = scheduler.Start(() =>
  6368. xs.Merge(2)
  6369. );
  6370. res.Messages.AssertEqual(
  6371. OnNext(260, 1),
  6372. OnNext(280, 4),
  6373. OnNext(310, 2),
  6374. OnNext(330, 3),
  6375. OnNext(330, 5),
  6376. OnNext(360, 6),
  6377. OnNext(440, 7),
  6378. OnNext(460, 8),
  6379. OnNext(690, 9),
  6380. OnNext(720, 10),
  6381. OnCompleted<int>(780)
  6382. );
  6383. #if !NO_PERF
  6384. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  6385. xs.Subscriptions.AssertEqual(
  6386. Subscribe(200, 400)
  6387. );
  6388. #else
  6389. xs.Subscriptions.AssertEqual(
  6390. Subscribe(200, 780)
  6391. );
  6392. #endif
  6393. ys1.Subscriptions.AssertEqual(
  6394. Subscribe(210, 350)
  6395. );
  6396. ys2.Subscriptions.AssertEqual(
  6397. Subscribe(260, 560)
  6398. );
  6399. ys3.Subscriptions.AssertEqual(
  6400. Subscribe(350, 480)
  6401. );
  6402. ys4.Subscriptions.AssertEqual(
  6403. Subscribe(480, 780)
  6404. );
  6405. }
  6406. [Fact]
  6407. public void MergeConcat_Basic_Wide()
  6408. {
  6409. var scheduler = new TestScheduler();
  6410. var ys1 = scheduler.CreateColdObservable(
  6411. OnNext(50, 1),
  6412. OnNext(100, 2),
  6413. OnNext(120, 3),
  6414. OnCompleted<int>(140)
  6415. );
  6416. var ys2 = scheduler.CreateColdObservable(
  6417. OnNext(20, 4),
  6418. OnNext(70, 5),
  6419. OnCompleted<int>(300)
  6420. );
  6421. var ys3 = scheduler.CreateColdObservable(
  6422. OnNext(10, 6),
  6423. OnNext(90, 7),
  6424. OnNext(110, 8),
  6425. OnCompleted<int>(130)
  6426. );
  6427. var ys4 = scheduler.CreateColdObservable(
  6428. OnNext(210, 9),
  6429. OnNext(240, 10),
  6430. OnCompleted<int>(300)
  6431. );
  6432. var xs = scheduler.CreateHotObservable(
  6433. OnNext<IObservable<int>>(210, ys1),
  6434. OnNext<IObservable<int>>(260, ys2),
  6435. OnNext<IObservable<int>>(270, ys3),
  6436. OnNext<IObservable<int>>(420, ys4),
  6437. OnCompleted<IObservable<int>>(450)
  6438. );
  6439. var res = scheduler.Start(() =>
  6440. xs.Merge(3)
  6441. );
  6442. res.Messages.AssertEqual(
  6443. OnNext(260, 1),
  6444. OnNext(280, 4),
  6445. OnNext(280, 6),
  6446. OnNext(310, 2),
  6447. OnNext(330, 3),
  6448. OnNext(330, 5),
  6449. OnNext(360, 7),
  6450. OnNext(380, 8),
  6451. OnNext(630, 9),
  6452. OnNext(660, 10),
  6453. OnCompleted<int>(720)
  6454. );
  6455. #if !NO_PERF
  6456. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  6457. xs.Subscriptions.AssertEqual(
  6458. Subscribe(200, 450)
  6459. );
  6460. #else
  6461. xs.Subscriptions.AssertEqual(
  6462. Subscribe(200, 720)
  6463. );
  6464. #endif
  6465. ys1.Subscriptions.AssertEqual(
  6466. Subscribe(210, 350)
  6467. );
  6468. ys2.Subscriptions.AssertEqual(
  6469. Subscribe(260, 560)
  6470. );
  6471. ys3.Subscriptions.AssertEqual(
  6472. Subscribe(270, 400)
  6473. );
  6474. ys4.Subscriptions.AssertEqual(
  6475. Subscribe(420, 720)
  6476. );
  6477. }
  6478. [Fact]
  6479. public void MergeConcat_Basic_Late()
  6480. {
  6481. var scheduler = new TestScheduler();
  6482. var ys1 = scheduler.CreateColdObservable(
  6483. OnNext(50, 1),
  6484. OnNext(100, 2),
  6485. OnNext(120, 3),
  6486. OnCompleted<int>(140)
  6487. );
  6488. var ys2 = scheduler.CreateColdObservable(
  6489. OnNext(20, 4),
  6490. OnNext(70, 5),
  6491. OnCompleted<int>(300)
  6492. );
  6493. var ys3 = scheduler.CreateColdObservable(
  6494. OnNext(10, 6),
  6495. OnNext(90, 7),
  6496. OnNext(110, 8),
  6497. OnCompleted<int>(130)
  6498. );
  6499. var ys4 = scheduler.CreateColdObservable(
  6500. OnNext(210, 9),
  6501. OnNext(240, 10),
  6502. OnCompleted<int>(300)
  6503. );
  6504. var xs = scheduler.CreateHotObservable(
  6505. OnNext<IObservable<int>>(210, ys1),
  6506. OnNext<IObservable<int>>(260, ys2),
  6507. OnNext<IObservable<int>>(270, ys3),
  6508. OnNext<IObservable<int>>(420, ys4),
  6509. OnCompleted<IObservable<int>>(750)
  6510. );
  6511. var res = scheduler.Start(() =>
  6512. xs.Merge(3)
  6513. );
  6514. res.Messages.AssertEqual(
  6515. OnNext(260, 1),
  6516. OnNext(280, 4),
  6517. OnNext(280, 6),
  6518. OnNext(310, 2),
  6519. OnNext(330, 3),
  6520. OnNext(330, 5),
  6521. OnNext(360, 7),
  6522. OnNext(380, 8),
  6523. OnNext(630, 9),
  6524. OnNext(660, 10),
  6525. OnCompleted<int>(750)
  6526. );
  6527. xs.Subscriptions.AssertEqual(
  6528. Subscribe(200, 750)
  6529. );
  6530. ys1.Subscriptions.AssertEqual(
  6531. Subscribe(210, 350)
  6532. );
  6533. ys2.Subscriptions.AssertEqual(
  6534. Subscribe(260, 560)
  6535. );
  6536. ys3.Subscriptions.AssertEqual(
  6537. Subscribe(270, 400)
  6538. );
  6539. ys4.Subscriptions.AssertEqual(
  6540. Subscribe(420, 720)
  6541. );
  6542. }
  6543. [Fact]
  6544. public void MergeConcat_Disposed()
  6545. {
  6546. var scheduler = new TestScheduler();
  6547. var ys1 = scheduler.CreateColdObservable(
  6548. OnNext(50, 1),
  6549. OnNext(100, 2),
  6550. OnNext(120, 3),
  6551. OnCompleted<int>(140)
  6552. );
  6553. var ys2 = scheduler.CreateColdObservable(
  6554. OnNext(20, 4),
  6555. OnNext(70, 5),
  6556. OnCompleted<int>(200)
  6557. );
  6558. var ys3 = scheduler.CreateColdObservable(
  6559. OnNext(10, 6),
  6560. OnNext(90, 7),
  6561. OnNext(110, 8),
  6562. OnCompleted<int>(130)
  6563. );
  6564. var ys4 = scheduler.CreateColdObservable(
  6565. OnNext(210, 9),
  6566. OnNext(240, 10),
  6567. OnCompleted<int>(300)
  6568. );
  6569. var xs = scheduler.CreateHotObservable(
  6570. OnNext<IObservable<int>>(210, ys1),
  6571. OnNext<IObservable<int>>(260, ys2),
  6572. OnNext<IObservable<int>>(270, ys3),
  6573. OnNext<IObservable<int>>(320, ys4),
  6574. OnCompleted<IObservable<int>>(400)
  6575. );
  6576. var res = scheduler.Start(() =>
  6577. xs.Merge(2),
  6578. 450
  6579. );
  6580. res.Messages.AssertEqual(
  6581. OnNext(260, 1),
  6582. OnNext(280, 4),
  6583. OnNext(310, 2),
  6584. OnNext(330, 3),
  6585. OnNext(330, 5),
  6586. OnNext(360, 6),
  6587. OnNext(440, 7)
  6588. );
  6589. #if !NO_PERF
  6590. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  6591. xs.Subscriptions.AssertEqual(
  6592. Subscribe(200, 400)
  6593. );
  6594. #else
  6595. xs.Subscriptions.AssertEqual(
  6596. Subscribe(200, 450)
  6597. );
  6598. #endif
  6599. ys1.Subscriptions.AssertEqual(
  6600. Subscribe(210, 350)
  6601. );
  6602. ys2.Subscriptions.AssertEqual(
  6603. Subscribe(260, 450)
  6604. );
  6605. ys3.Subscriptions.AssertEqual(
  6606. Subscribe(350, 450)
  6607. );
  6608. ys4.Subscriptions.AssertEqual(
  6609. );
  6610. }
  6611. [Fact]
  6612. public void MergeConcat_OuterError()
  6613. {
  6614. var scheduler = new TestScheduler();
  6615. var ex = new Exception();
  6616. var ys1 = scheduler.CreateColdObservable(
  6617. OnNext(50, 1),
  6618. OnNext(100, 2),
  6619. OnNext(120, 3),
  6620. OnCompleted<int>(140)
  6621. );
  6622. var ys2 = scheduler.CreateColdObservable(
  6623. OnNext(20, 4),
  6624. OnNext(70, 5),
  6625. OnCompleted<int>(200)
  6626. );
  6627. var ys3 = scheduler.CreateColdObservable(
  6628. OnNext(10, 6),
  6629. OnNext(90, 7),
  6630. OnNext(110, 8),
  6631. OnCompleted<int>(130)
  6632. );
  6633. var ys4 = scheduler.CreateColdObservable(
  6634. OnNext(210, 9),
  6635. OnNext(240, 10),
  6636. OnCompleted<int>(300)
  6637. );
  6638. var xs = scheduler.CreateHotObservable(
  6639. OnNext<IObservable<int>>(210, ys1),
  6640. OnNext<IObservable<int>>(260, ys2),
  6641. OnNext<IObservable<int>>(270, ys3),
  6642. OnNext<IObservable<int>>(320, ys4),
  6643. OnError<IObservable<int>>(400, ex)
  6644. );
  6645. var res = scheduler.Start(() =>
  6646. xs.Merge(2)
  6647. );
  6648. res.Messages.AssertEqual(
  6649. OnNext(260, 1),
  6650. OnNext(280, 4),
  6651. OnNext(310, 2),
  6652. OnNext(330, 3),
  6653. OnNext(330, 5),
  6654. OnNext(360, 6),
  6655. OnError<int>(400, ex)
  6656. );
  6657. xs.Subscriptions.AssertEqual(
  6658. Subscribe(200, 400)
  6659. );
  6660. ys1.Subscriptions.AssertEqual(
  6661. Subscribe(210, 350)
  6662. );
  6663. ys2.Subscriptions.AssertEqual(
  6664. Subscribe(260, 400)
  6665. );
  6666. ys3.Subscriptions.AssertEqual(
  6667. Subscribe(350, 400)
  6668. );
  6669. ys4.Subscriptions.AssertEqual(
  6670. );
  6671. }
  6672. [Fact]
  6673. public void MergeConcat_InnerError()
  6674. {
  6675. var scheduler = new TestScheduler();
  6676. var ex = new Exception();
  6677. var ys1 = scheduler.CreateColdObservable(
  6678. OnNext(50, 1),
  6679. OnNext(100, 2),
  6680. OnNext(120, 3),
  6681. OnCompleted<int>(140)
  6682. );
  6683. var ys2 = scheduler.CreateColdObservable(
  6684. OnNext(20, 4),
  6685. OnNext(70, 5),
  6686. OnCompleted<int>(200)
  6687. );
  6688. var ys3 = scheduler.CreateColdObservable(
  6689. OnNext(10, 6),
  6690. OnNext(90, 7),
  6691. OnNext(110, 8),
  6692. OnError<int>(140, ex)
  6693. );
  6694. var ys4 = scheduler.CreateColdObservable(
  6695. OnNext(210, 9),
  6696. OnNext(240, 10),
  6697. OnCompleted<int>(300)
  6698. );
  6699. var xs = scheduler.CreateHotObservable(
  6700. OnNext<IObservable<int>>(210, ys1),
  6701. OnNext<IObservable<int>>(260, ys2),
  6702. OnNext<IObservable<int>>(270, ys3),
  6703. OnNext<IObservable<int>>(320, ys4),
  6704. OnCompleted<IObservable<int>>(400)
  6705. );
  6706. var res = scheduler.Start(() =>
  6707. xs.Merge(2)
  6708. );
  6709. res.Messages.AssertEqual(
  6710. OnNext(260, 1),
  6711. OnNext(280, 4),
  6712. OnNext(310, 2),
  6713. OnNext(330, 3),
  6714. OnNext(330, 5),
  6715. OnNext(360, 6),
  6716. OnNext(440, 7),
  6717. OnNext(460, 8),
  6718. OnError<int>(490, ex)
  6719. );
  6720. #if !NO_PERF
  6721. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  6722. xs.Subscriptions.AssertEqual(
  6723. Subscribe(200, 400)
  6724. );
  6725. #else
  6726. xs.Subscriptions.AssertEqual(
  6727. Subscribe(200, 490)
  6728. );
  6729. #endif
  6730. ys1.Subscriptions.AssertEqual(
  6731. Subscribe(210, 350)
  6732. );
  6733. ys2.Subscriptions.AssertEqual(
  6734. Subscribe(260, 460)
  6735. );
  6736. ys3.Subscriptions.AssertEqual(
  6737. Subscribe(350, 490)
  6738. );
  6739. ys4.Subscriptions.AssertEqual(
  6740. Subscribe(460, 490)
  6741. );
  6742. }
  6743. #if !NO_TPL
  6744. [Fact]
  6745. public void Merge_Task()
  6746. {
  6747. var tss = Observable.Merge(new[] { Task.Factory.StartNew(() => 1), Task.Factory.StartNew(() => 2), Task.Factory.StartNew(() => 3) }.ToObservable());
  6748. var res = tss.ToArray().Single();
  6749. Assert.True(res.OrderBy(x => x).SequenceEqual(new[] { 1, 2, 3 }));
  6750. }
  6751. [Fact]
  6752. public void Merge_TaskWithCompletionSource_RanToCompletion_Async()
  6753. {
  6754. var tcss = new TaskCompletionSource<int>[2];
  6755. tcss[0] = new TaskCompletionSource<int>();
  6756. tcss[1] = new TaskCompletionSource<int>();
  6757. var res = Observable.Merge(Observable.Range(0, 2).Select(x => tcss[x].Task));
  6758. var lst = new List<int>();
  6759. var done = new ManualResetEvent(false);
  6760. res.Subscribe(lst.Add, () => done.Set());
  6761. tcss[0].SetResult(42);
  6762. tcss[1].SetResult(43);
  6763. done.WaitOne();
  6764. lst.OrderBy(x => x).AssertEqual(new[] { 42, 43 });
  6765. }
  6766. [Fact]
  6767. public void Merge_TaskWithCompletionSource_RanToCompletion_Sync()
  6768. {
  6769. var tcss = new TaskCompletionSource<int>[2];
  6770. tcss[0] = new TaskCompletionSource<int>();
  6771. tcss[1] = new TaskCompletionSource<int>();
  6772. tcss[0].SetResult(42);
  6773. tcss[1].SetResult(43);
  6774. var res = Observable.Merge(Observable.Range(0, 2).Select(x => tcss[x].Task));
  6775. var lst = new List<int>();
  6776. var done = new ManualResetEvent(false);
  6777. res.Subscribe(lst.Add, () => done.Set());
  6778. done.WaitOne();
  6779. lst.OrderBy(x => x).AssertEqual(new[] { 42, 43 });
  6780. }
  6781. [Fact]
  6782. public void Merge_TaskWithCompletionSource_Faulted_Async()
  6783. {
  6784. var tcss = new TaskCompletionSource<int>[3];
  6785. tcss[0] = new TaskCompletionSource<int>();
  6786. tcss[1] = new TaskCompletionSource<int>();
  6787. tcss[2] = new TaskCompletionSource<int>();
  6788. var res = Observable.Merge(Observable.Range(0, 3).Select(x => tcss[x].Task));
  6789. var lst = new List<int>();
  6790. var err = default(Exception);
  6791. var done = new ManualResetEvent(false);
  6792. res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
  6793. var ex = new Exception();
  6794. tcss[1].SetException(ex);
  6795. done.WaitOne();
  6796. lst.AssertEqual(new int[0]);
  6797. Assert.Same(ex, err);
  6798. }
  6799. [Fact]
  6800. public void Merge_TaskWithCompletionSource_Faulted_Sync()
  6801. {
  6802. var tcss = new TaskCompletionSource<int>[3];
  6803. tcss[0] = new TaskCompletionSource<int>();
  6804. tcss[1] = new TaskCompletionSource<int>();
  6805. tcss[2] = new TaskCompletionSource<int>();
  6806. var ex = new Exception();
  6807. tcss[1].SetException(ex);
  6808. var res = Observable.Merge(Observable.Range(0, 3).Select(x => tcss[x].Task));
  6809. var lst = new List<int>();
  6810. var err = default(Exception);
  6811. var done = new ManualResetEvent(false);
  6812. res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
  6813. done.WaitOne();
  6814. lst.AssertEqual(new int[0]);
  6815. Assert.Same(ex, err);
  6816. }
  6817. [Fact]
  6818. public void Merge_TaskWithCompletionSource_Canceled_Async()
  6819. {
  6820. var tcss = new TaskCompletionSource<int>[3];
  6821. tcss[0] = new TaskCompletionSource<int>();
  6822. tcss[1] = new TaskCompletionSource<int>();
  6823. tcss[2] = new TaskCompletionSource<int>();
  6824. var res = Observable.Merge(Observable.Range(0, 3).Select(x => tcss[x].Task));
  6825. var lst = new List<int>();
  6826. var err = default(Exception);
  6827. var done = new ManualResetEvent(false);
  6828. res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
  6829. tcss[1].SetCanceled();
  6830. done.WaitOne();
  6831. lst.AssertEqual(new int[0]);
  6832. Assert.True(err is TaskCanceledException && ((TaskCanceledException)err).Task == tcss[1].Task);
  6833. }
  6834. [Fact]
  6835. public void Merge_TaskWithCompletionSource_Canceled_Sync()
  6836. {
  6837. var tcss = new TaskCompletionSource<int>[3];
  6838. tcss[0] = new TaskCompletionSource<int>();
  6839. tcss[1] = new TaskCompletionSource<int>();
  6840. tcss[2] = new TaskCompletionSource<int>();
  6841. tcss[1].SetCanceled();
  6842. var res = Observable.Merge(Observable.Range(0, 3).Select(x => tcss[x].Task));
  6843. var lst = new List<int>();
  6844. var err = default(Exception);
  6845. var done = new ManualResetEvent(false);
  6846. res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
  6847. done.WaitOne();
  6848. lst.AssertEqual(new int[0]);
  6849. Assert.True(err is TaskCanceledException && ((TaskCanceledException)err).Task == tcss[1].Task);
  6850. }
  6851. [Fact]
  6852. public void Merge_TaskWithCompletionSource_InnerCompleteBeforeOuter()
  6853. {
  6854. var xs = new Subject<int>();
  6855. var tcss = new TaskCompletionSource<int>[3];
  6856. tcss[0] = new TaskCompletionSource<int>();
  6857. tcss[1] = new TaskCompletionSource<int>();
  6858. tcss[2] = new TaskCompletionSource<int>();
  6859. var res = Observable.Merge(xs.Select(x => tcss[x].Task));
  6860. var lst = new List<int>();
  6861. var done = new ManualResetEvent(false);
  6862. res.Subscribe(lst.Add, () => done.Set());
  6863. tcss[1].SetResult(42);
  6864. xs.OnNext(0);
  6865. xs.OnNext(1);
  6866. xs.OnNext(2);
  6867. tcss[0].SetResult(43);
  6868. tcss[2].SetResult(44);
  6869. xs.OnCompleted();
  6870. done.WaitOne();
  6871. lst.OrderBy(x => x).AssertEqual(new[] { 42, 43, 44 });
  6872. }
  6873. [Fact]
  6874. public void Merge_TaskWithCompletionSource_OuterCompleteBeforeInner()
  6875. {
  6876. var xs = new Subject<int>();
  6877. var tcss = new TaskCompletionSource<int>[3];
  6878. tcss[0] = new TaskCompletionSource<int>();
  6879. tcss[1] = new TaskCompletionSource<int>();
  6880. tcss[2] = new TaskCompletionSource<int>();
  6881. var res = Observable.Merge(xs.Select(x => tcss[x].Task));
  6882. var lst = new List<int>();
  6883. var done = new ManualResetEvent(false);
  6884. res.Subscribe(lst.Add, () => done.Set());
  6885. tcss[1].SetResult(42);
  6886. xs.OnNext(0);
  6887. xs.OnNext(1);
  6888. xs.OnNext(2);
  6889. xs.OnCompleted();
  6890. tcss[0].SetResult(43);
  6891. tcss[2].SetResult(44);
  6892. done.WaitOne();
  6893. lst.OrderBy(x => x).AssertEqual(new[] { 42, 43, 44 });
  6894. }
  6895. [Fact]
  6896. public void Merge_Task_OnError()
  6897. {
  6898. var xs = new Subject<int>();
  6899. var tcss = new TaskCompletionSource<int>[3];
  6900. tcss[0] = new TaskCompletionSource<int>();
  6901. tcss[1] = new TaskCompletionSource<int>();
  6902. tcss[2] = new TaskCompletionSource<int>();
  6903. var res = Observable.Merge(xs.Select(x => tcss[x].Task));
  6904. var lst = new List<int>();
  6905. var err = default(Exception);
  6906. var done = new ManualResetEvent(false);
  6907. res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
  6908. tcss[1].SetResult(42);
  6909. xs.OnNext(0);
  6910. xs.OnNext(1);
  6911. xs.OnNext(2);
  6912. tcss[0].SetResult(43);
  6913. tcss[2].SetResult(44);
  6914. var ex = new Exception();
  6915. xs.OnError(ex);
  6916. done.WaitOne();
  6917. Assert.Same(ex, err);
  6918. }
  6919. #endif
  6920. #endregion
  6921. #region + OnErrorResumeNext +
  6922. [Fact]
  6923. public void OnErrorResumeNext_ArgumentChecking()
  6924. {
  6925. var xs = DummyObservable<int>.Instance;
  6926. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OnErrorResumeNext<int>((IObservable<int>[])null));
  6927. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OnErrorResumeNext<int>((IEnumerable<IObservable<int>>)null));
  6928. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OnErrorResumeNext<int>((IObservable<int>)null, xs));
  6929. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OnErrorResumeNext<int>(xs, (IObservable<int>)null));
  6930. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OnErrorResumeNext<int>(null, xs));
  6931. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OnErrorResumeNext<int>(xs, null));
  6932. }
  6933. [Fact]
  6934. public void OnErrorResumeNext_IEofIO_GetEnumeratorThrows()
  6935. {
  6936. var ex = new Exception();
  6937. var scheduler = new TestScheduler();
  6938. var xss = new RogueEnumerable<IObservable<int>>(ex);
  6939. var res = scheduler.Start(() =>
  6940. Observable.OnErrorResumeNext(xss)
  6941. );
  6942. res.Messages.AssertEqual(
  6943. OnError<int>(200, ex)
  6944. );
  6945. }
  6946. [Fact]
  6947. public void OnErrorResumeNext_IEofIO()
  6948. {
  6949. var scheduler = new TestScheduler();
  6950. var xs1 = scheduler.CreateColdObservable<int>(
  6951. OnNext(10, 1),
  6952. OnNext(20, 2),
  6953. OnNext(30, 3),
  6954. OnCompleted<int>(40)
  6955. );
  6956. var xs2 = scheduler.CreateColdObservable<int>(
  6957. OnNext(10, 4),
  6958. OnNext(20, 5),
  6959. OnError<int>(30, new Exception())
  6960. );
  6961. var xs3 = scheduler.CreateColdObservable<int>(
  6962. OnNext(10, 6),
  6963. OnNext(20, 7),
  6964. OnNext(30, 8),
  6965. OnNext(40, 9),
  6966. OnCompleted<int>(50)
  6967. );
  6968. var res = scheduler.Start(() =>
  6969. Observable.OnErrorResumeNext(new[] { xs1, xs2, xs3 })
  6970. );
  6971. res.Messages.AssertEqual(
  6972. OnNext(210, 1),
  6973. OnNext(220, 2),
  6974. OnNext(230, 3),
  6975. OnNext(250, 4),
  6976. OnNext(260, 5),
  6977. OnNext(280, 6),
  6978. OnNext(290, 7),
  6979. OnNext(300, 8),
  6980. OnNext(310, 9),
  6981. OnCompleted<int>(320)
  6982. );
  6983. xs1.Subscriptions.AssertEqual(
  6984. Subscribe(200, 240)
  6985. );
  6986. xs2.Subscriptions.AssertEqual(
  6987. Subscribe(240, 270)
  6988. );
  6989. xs3.Subscriptions.AssertEqual(
  6990. Subscribe(270, 320)
  6991. );
  6992. }
  6993. [Fact]
  6994. public void OnErrorResumeNext_NoErrors()
  6995. {
  6996. var scheduler = new TestScheduler();
  6997. var o1 = scheduler.CreateHotObservable(
  6998. OnNext(150, 1),
  6999. OnNext(210, 2),
  7000. OnNext(220, 3),
  7001. OnCompleted<int>(230)
  7002. );
  7003. var o2 = scheduler.CreateHotObservable(
  7004. OnNext(240, 4),
  7005. OnCompleted<int>(250)
  7006. );
  7007. var res = scheduler.Start(() =>
  7008. o1.OnErrorResumeNext(o2)
  7009. );
  7010. res.Messages.AssertEqual(
  7011. OnNext(210, 2),
  7012. OnNext(220, 3),
  7013. OnNext(240, 4),
  7014. OnCompleted<int>(250)
  7015. );
  7016. o1.Subscriptions.AssertEqual(
  7017. Subscribe(200, 230)
  7018. );
  7019. o2.Subscriptions.AssertEqual(
  7020. Subscribe(230, 250)
  7021. );
  7022. }
  7023. [Fact]
  7024. public void OnErrorResumeNext_Error()
  7025. {
  7026. var scheduler = new TestScheduler();
  7027. var o1 = scheduler.CreateHotObservable(
  7028. OnNext(150, 1),
  7029. OnNext(210, 2),
  7030. OnNext(220, 3),
  7031. OnError<int>(230, new Exception())
  7032. );
  7033. var o2 = scheduler.CreateHotObservable(
  7034. OnNext(240, 4),
  7035. OnCompleted<int>(250)
  7036. );
  7037. var res = scheduler.Start(() =>
  7038. o1.OnErrorResumeNext(o2)
  7039. );
  7040. res.Messages.AssertEqual(
  7041. OnNext(210, 2),
  7042. OnNext(220, 3),
  7043. OnNext(240, 4),
  7044. OnCompleted<int>(250)
  7045. );
  7046. o1.Subscriptions.AssertEqual(
  7047. Subscribe(200, 230)
  7048. );
  7049. o2.Subscriptions.AssertEqual(
  7050. Subscribe(230, 250)
  7051. );
  7052. }
  7053. [Fact]
  7054. public void OnErrorResumeNext_ErrorMultiple()
  7055. {
  7056. var scheduler = new TestScheduler();
  7057. var o1 = scheduler.CreateHotObservable(
  7058. OnNext(150, 1),
  7059. OnNext(210, 2),
  7060. OnError<int>(220, new Exception())
  7061. );
  7062. var o2 = scheduler.CreateHotObservable(
  7063. OnNext(230, 3),
  7064. OnError<int>(240, new Exception())
  7065. );
  7066. var o3 = scheduler.CreateHotObservable(
  7067. OnCompleted<int>(250)
  7068. );
  7069. var res = scheduler.Start(() =>
  7070. Observable.OnErrorResumeNext(o1, o2, o3)
  7071. );
  7072. res.Messages.AssertEqual(
  7073. OnNext(210, 2),
  7074. OnNext(230, 3),
  7075. OnCompleted<int>(250)
  7076. );
  7077. o1.Subscriptions.AssertEqual(
  7078. Subscribe(200, 220)
  7079. );
  7080. o2.Subscriptions.AssertEqual(
  7081. Subscribe(220, 240)
  7082. );
  7083. o3.Subscriptions.AssertEqual(
  7084. Subscribe(240, 250)
  7085. );
  7086. }
  7087. [Fact]
  7088. public void OnErrorResumeNext_EmptyReturnThrowAndMore()
  7089. {
  7090. var scheduler = new TestScheduler();
  7091. var o1 = scheduler.CreateHotObservable(
  7092. OnNext(150, 1),
  7093. OnCompleted<int>(205)
  7094. );
  7095. var o2 = scheduler.CreateHotObservable(
  7096. OnNext(215, 2),
  7097. OnCompleted<int>(220)
  7098. );
  7099. var o3 = scheduler.CreateHotObservable(
  7100. OnNext(225, 3),
  7101. OnNext(230, 4),
  7102. OnCompleted<int>(235)
  7103. );
  7104. var o4 = scheduler.CreateHotObservable(
  7105. OnError<int>(240, new Exception())
  7106. );
  7107. var o5 = scheduler.CreateHotObservable(
  7108. OnNext<int>(245, 5),
  7109. OnCompleted<int>(250)
  7110. );
  7111. var res = scheduler.Start(() =>
  7112. new[] { o1, o2, o3, o4, o5 }.OnErrorResumeNext()
  7113. );
  7114. res.Messages.AssertEqual(
  7115. OnNext(215, 2),
  7116. OnNext(225, 3),
  7117. OnNext(230, 4),
  7118. OnNext(245, 5),
  7119. OnCompleted<int>(250)
  7120. );
  7121. o1.Subscriptions.AssertEqual(
  7122. Subscribe(200, 205)
  7123. );
  7124. o2.Subscriptions.AssertEqual(
  7125. Subscribe(205, 220)
  7126. );
  7127. o3.Subscriptions.AssertEqual(
  7128. Subscribe(220, 235)
  7129. );
  7130. o4.Subscriptions.AssertEqual(
  7131. Subscribe(235, 240)
  7132. );
  7133. o5.Subscriptions.AssertEqual(
  7134. Subscribe(240, 250)
  7135. );
  7136. }
  7137. [Fact]
  7138. public void OnErrorResumeNext_LastIsntSpecial()
  7139. {
  7140. var scheduler = new TestScheduler();
  7141. var ex = new Exception();
  7142. var o1 = scheduler.CreateHotObservable(
  7143. OnNext(150, 1),
  7144. OnNext(210, 2),
  7145. OnCompleted<int>(220)
  7146. );
  7147. var o2 = scheduler.CreateHotObservable(
  7148. OnError<int>(230, ex)
  7149. );
  7150. var res = scheduler.Start(() =>
  7151. o1.OnErrorResumeNext(o2)
  7152. );
  7153. res.Messages.AssertEqual(
  7154. OnNext(210, 2),
  7155. OnCompleted<int>(230)
  7156. );
  7157. o1.Subscriptions.AssertEqual(
  7158. Subscribe(200, 220)
  7159. );
  7160. o2.Subscriptions.AssertEqual(
  7161. Subscribe(220, 230)
  7162. );
  7163. }
  7164. [Fact]
  7165. public void OnErrorResumeNext_SingleSourceDoesntThrow()
  7166. {
  7167. var scheduler = new TestScheduler();
  7168. var ex = new Exception();
  7169. var o1 = scheduler.CreateHotObservable(
  7170. OnError<int>(230, ex)
  7171. );
  7172. var res = scheduler.Start(() =>
  7173. Observable.OnErrorResumeNext(o1)
  7174. );
  7175. res.Messages.AssertEqual(
  7176. OnCompleted<int>(230)
  7177. );
  7178. o1.Subscriptions.AssertEqual(
  7179. Subscribe(200, 230)
  7180. );
  7181. }
  7182. [Fact]
  7183. public void OnErrorResumeNext_EndWithNever()
  7184. {
  7185. var scheduler = new TestScheduler();
  7186. var ex = new Exception();
  7187. var o1 = scheduler.CreateHotObservable(
  7188. OnNext(150, 1),
  7189. OnNext(210, 2),
  7190. OnCompleted<int>(220)
  7191. );
  7192. var o2 = scheduler.CreateHotObservable(
  7193. OnNext(150, 1)
  7194. );
  7195. var res = scheduler.Start(() =>
  7196. Observable.OnErrorResumeNext(o1, o2)
  7197. );
  7198. res.Messages.AssertEqual(
  7199. OnNext(210, 2)
  7200. );
  7201. o1.Subscriptions.AssertEqual(
  7202. Subscribe(200, 220)
  7203. );
  7204. o2.Subscriptions.AssertEqual(
  7205. Subscribe(220, 1000)
  7206. );
  7207. }
  7208. [Fact]
  7209. public void OnErrorResumeNext_StartWithNever()
  7210. {
  7211. var scheduler = new TestScheduler();
  7212. var ex = new Exception();
  7213. var o1 = scheduler.CreateHotObservable(
  7214. OnNext(150, 1)
  7215. );
  7216. var o2 = scheduler.CreateHotObservable(
  7217. OnNext(150, 1),
  7218. OnNext(210, 2),
  7219. OnCompleted<int>(220)
  7220. );
  7221. var res = scheduler.Start(() =>
  7222. Observable.OnErrorResumeNext(o1, o2)
  7223. );
  7224. res.Messages.AssertEqual(
  7225. );
  7226. o1.Subscriptions.AssertEqual(
  7227. Subscribe(200, 1000)
  7228. );
  7229. o2.Subscriptions.AssertEqual(
  7230. );
  7231. }
  7232. [Fact]
  7233. public void OnErrorResumeNext_DefaultScheduler_Binary()
  7234. {
  7235. var evt = new ManualResetEvent(false);
  7236. int sum = 0;
  7237. Observable.Return(1).OnErrorResumeNext(Observable.Return(2)).Subscribe(x =>
  7238. {
  7239. sum += x;
  7240. }, () => evt.Set());
  7241. evt.WaitOne();
  7242. Assert.Equal(3, sum);
  7243. }
  7244. [Fact]
  7245. public void OnErrorResumeNext_DefaultScheduler_Nary()
  7246. {
  7247. var evt = new ManualResetEvent(false);
  7248. int sum = 0;
  7249. Observable.OnErrorResumeNext(Observable.Return(1), Observable.Return(2), Observable.Return(3)).Subscribe(x =>
  7250. {
  7251. sum += x;
  7252. }, () => evt.Set());
  7253. evt.WaitOne();
  7254. Assert.Equal(6, sum);
  7255. }
  7256. [Fact]
  7257. public void OnErrorResumeNext_DefaultScheduler_NaryEnumerable()
  7258. {
  7259. var evt = new ManualResetEvent(false);
  7260. IEnumerable<IObservable<int>> sources = new[] { Observable.Return(1), Observable.Return(2), Observable.Return(3) };
  7261. int sum = 0;
  7262. Observable.OnErrorResumeNext(sources).Subscribe(x =>
  7263. {
  7264. sum += x;
  7265. }, () => evt.Set());
  7266. evt.WaitOne();
  7267. Assert.Equal(6, sum);
  7268. }
  7269. [Fact]
  7270. public void OnErrorResumeNext_IteratorThrows()
  7271. {
  7272. var scheduler = new TestScheduler();
  7273. var ex = new Exception();
  7274. var res = scheduler.Start(() =>
  7275. Observable.OnErrorResumeNext<int>(Catch_IteratorThrows_Source(ex, true))
  7276. );
  7277. res.Messages.AssertEqual(
  7278. OnError<int>(200, ex)
  7279. );
  7280. }
  7281. [Fact]
  7282. public void OnErrorResumeNext_EnumerableThrows()
  7283. {
  7284. var scheduler = new TestScheduler();
  7285. var o = scheduler.CreateHotObservable(
  7286. OnNext(150, 1),
  7287. OnNext(210, 2),
  7288. OnNext(220, 3),
  7289. OnError<int>(225, new Exception())
  7290. );
  7291. var ex = new Exception();
  7292. var xss = new MockEnumerable<IObservable<int>>(scheduler, GetObservablesForOnErrorResumeNextThrow(o, ex));
  7293. var res = scheduler.Start(() =>
  7294. xss.OnErrorResumeNext()
  7295. );
  7296. res.Messages.AssertEqual(
  7297. OnNext(210, 2),
  7298. OnNext(220, 3),
  7299. OnError<int>(225, ex)
  7300. );
  7301. o.Subscriptions.AssertEqual(
  7302. Subscribe(200, 225)
  7303. );
  7304. xss.Subscriptions.AssertEqual(
  7305. Subscribe(200, 225)
  7306. );
  7307. }
  7308. private IEnumerable<IObservable<int>> GetObservablesForOnErrorResumeNextThrow(IObservable<int> first, Exception ex)
  7309. {
  7310. yield return first;
  7311. throw ex;
  7312. }
  7313. [Fact]
  7314. public void OnErrorResumeNext_EnumerableTiming()
  7315. {
  7316. var scheduler = new TestScheduler();
  7317. var o1 = scheduler.CreateHotObservable(
  7318. OnNext(150, 1),
  7319. OnNext(210, 2), // !
  7320. OnNext(220, 3), // !
  7321. OnCompleted<int>(230)
  7322. );
  7323. var o2 = scheduler.CreateColdObservable(
  7324. OnNext(50, 4), // !
  7325. OnNext(60, 5), // !
  7326. OnNext(70, 6), // !
  7327. OnError<int>(80, new Exception())
  7328. );
  7329. var o3 = scheduler.CreateHotObservable(
  7330. OnNext(150, 1),
  7331. OnNext(200, 2),
  7332. OnNext(210, 3),
  7333. OnNext(220, 4),
  7334. OnNext(230, 5),
  7335. OnNext(270, 6),
  7336. OnNext(320, 7), // !
  7337. OnNext(330, 8), // !
  7338. OnCompleted<int>(340)
  7339. );
  7340. var xss = new MockEnumerable<ITestableObservable<int>>(scheduler, new[] { o1, o2, o3, o2 });
  7341. var res = scheduler.Start(() =>
  7342. xss.Select(xs => (IObservable<int>)xs).OnErrorResumeNext()
  7343. );
  7344. res.Messages.AssertEqual(
  7345. OnNext(210, 2),
  7346. OnNext(220, 3),
  7347. OnNext(280, 4),
  7348. OnNext(290, 5),
  7349. OnNext(300, 6),
  7350. OnNext(320, 7),
  7351. OnNext(330, 8),
  7352. OnNext(390, 4),
  7353. OnNext(400, 5),
  7354. OnNext(410, 6),
  7355. OnCompleted<int>(420)
  7356. );
  7357. o1.Subscriptions.AssertEqual(
  7358. Subscribe(200, 230)
  7359. );
  7360. o2.Subscriptions.AssertEqual(
  7361. Subscribe(230, 310),
  7362. Subscribe(340, 420)
  7363. );
  7364. o3.Subscriptions.AssertEqual(
  7365. Subscribe(310, 340)
  7366. );
  7367. xss.Subscriptions.AssertEqual(
  7368. Subscribe(200, 420)
  7369. );
  7370. }
  7371. [Fact]
  7372. public void OnErrorResumeNext_Enumerable_Dispose()
  7373. {
  7374. var scheduler = new TestScheduler();
  7375. var o1 = scheduler.CreateHotObservable(
  7376. OnNext(150, 1),
  7377. OnNext(210, 2),
  7378. OnNext(220, 3),
  7379. OnError<int>(230, new Exception())
  7380. );
  7381. var o2 = scheduler.CreateHotObservable(
  7382. OnNext(150, 1),
  7383. OnNext(200, 2),
  7384. OnNext(210, 3),
  7385. OnNext(240, 4),
  7386. OnNext(270, 5),
  7387. OnNext(320, 6),
  7388. OnNext(330, 7),
  7389. OnCompleted<int>(340)
  7390. );
  7391. var xss = new MockEnumerable<ITestableObservable<int>>(scheduler, new[] { o1, o2 });
  7392. var res = scheduler.Start(() =>
  7393. xss.Select(xs => (IObservable<int>)xs).OnErrorResumeNext(),
  7394. 300
  7395. );
  7396. res.Messages.AssertEqual(
  7397. OnNext(210, 2),
  7398. OnNext(220, 3),
  7399. OnNext(240, 4),
  7400. OnNext(270, 5)
  7401. );
  7402. o1.Subscriptions.AssertEqual(
  7403. Subscribe(200, 230)
  7404. );
  7405. o2.Subscriptions.AssertEqual(
  7406. Subscribe(230, 300)
  7407. );
  7408. xss.Subscriptions.AssertEqual(
  7409. Subscribe(200, 300)
  7410. );
  7411. }
  7412. #if !NO_PERF
  7413. [Fact]
  7414. public void OnErrorResumeNext_TailRecursive1()
  7415. {
  7416. var create = 0L;
  7417. var start = 200L;
  7418. var end = 1000L;
  7419. var scheduler = new TestScheduler();
  7420. var o = scheduler.CreateColdObservable<int>(
  7421. OnNext(10, 1),
  7422. OnNext(20, 2),
  7423. OnNext(30, 3),
  7424. OnError<int>(40, new Exception())
  7425. );
  7426. var f = default(Func<IObservable<int>>);
  7427. f = () => Observable.Defer(() => o.OnErrorResumeNext(f()));
  7428. var res = scheduler.Start(() => f(), create, start, end);
  7429. var expected = new List<Recorded<Notification<int>>>();
  7430. var t = start;
  7431. while (t <= end)
  7432. {
  7433. var n = (t - start) / 10;
  7434. if (n % 4 != 0)
  7435. {
  7436. expected.Add(OnNext(t, (int)(n % 4)));
  7437. }
  7438. t += 10;
  7439. }
  7440. res.Messages.AssertEqual(expected);
  7441. }
  7442. #if HAS_STACKTRACE && !NO_THREAD
  7443. [Fact]
  7444. public void OnErrorResumeNext_TailRecursive2()
  7445. {
  7446. var f = default(Func<int, IObservable<int>>);
  7447. f = x => Observable.Defer(() => Observable.Throw<int>(new Exception(), ThreadPoolScheduler.Instance).StartWith(x).OnErrorResumeNext(f(x + 1)));
  7448. var lst = new List<int>();
  7449. f(0).Select(x => new StackTrace().FrameCount).Take(10).ForEach(lst.Add);
  7450. Assert.True(lst.Last() - lst.First() < 10);
  7451. }
  7452. #endif
  7453. [Fact]
  7454. public void OnErrorResumeNext_TailRecursive3()
  7455. {
  7456. var ex = new Exception();
  7457. var res =
  7458. Observable.OnErrorResumeNext(
  7459. Observable.Return(1),
  7460. Observable.Defer(() =>
  7461. {
  7462. if (ex != null)
  7463. {
  7464. throw ex;
  7465. }
  7466. return Observable.Return(-2);
  7467. }),
  7468. Observable.Defer(() =>
  7469. {
  7470. if (ex != null)
  7471. {
  7472. throw ex;
  7473. }
  7474. return Observable.Return(-1);
  7475. }),
  7476. Observable.Return(2)
  7477. )
  7478. .SequenceEqual(new[] { 1, 2 });
  7479. Assert.True(res.Wait());
  7480. }
  7481. #endif
  7482. #endregion
  7483. #region + SkipUntil +
  7484. [Fact]
  7485. public void SkipUntil_ArgumentChecking()
  7486. {
  7487. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SkipUntil<int, int>(null, DummyObservable<int>.Instance));
  7488. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SkipUntil<int, int>(DummyObservable<int>.Instance, null));
  7489. }
  7490. [Fact]
  7491. public void SkipUntil_SomeData_Next()
  7492. {
  7493. var scheduler = new TestScheduler();
  7494. var l = scheduler.CreateHotObservable(
  7495. OnNext(150, 1),
  7496. OnNext(210, 2),
  7497. OnNext(220, 3),
  7498. OnNext(230, 4), //!
  7499. OnNext(240, 5), //!
  7500. OnCompleted<int>(250)
  7501. );
  7502. var r = scheduler.CreateHotObservable(
  7503. OnNext(150, 1),
  7504. OnNext(225, 99),
  7505. OnCompleted<int>(230)
  7506. );
  7507. var res = scheduler.Start(() =>
  7508. l.SkipUntil(r)
  7509. );
  7510. res.Messages.AssertEqual(
  7511. OnNext(230, 4),
  7512. OnNext(240, 5),
  7513. OnCompleted<int>(250)
  7514. );
  7515. l.Subscriptions.AssertEqual(
  7516. Subscribe(200, 250)
  7517. );
  7518. r.Subscriptions.AssertEqual(
  7519. Subscribe(200, 225)
  7520. );
  7521. }
  7522. [Fact]
  7523. public void SkipUntil_SomeData_Error()
  7524. {
  7525. var scheduler = new TestScheduler();
  7526. var ex = new Exception();
  7527. var l = scheduler.CreateHotObservable(
  7528. OnNext(150, 1),
  7529. OnNext(210, 2),
  7530. OnNext(220, 3),
  7531. OnNext(230, 4),
  7532. OnNext(240, 5),
  7533. OnCompleted<int>(250)
  7534. );
  7535. var r = scheduler.CreateHotObservable(
  7536. OnNext(150, 1),
  7537. OnError<int>(225, ex)
  7538. );
  7539. var res = scheduler.Start(() =>
  7540. l.SkipUntil(r)
  7541. );
  7542. res.Messages.AssertEqual(
  7543. OnError<int>(225, ex)
  7544. );
  7545. l.Subscriptions.AssertEqual(
  7546. Subscribe(200, 225)
  7547. );
  7548. r.Subscriptions.AssertEqual(
  7549. Subscribe(200, 225)
  7550. );
  7551. }
  7552. [Fact]
  7553. public void SkipUntil_Error_SomeData()
  7554. {
  7555. var scheduler = new TestScheduler();
  7556. var ex = new Exception();
  7557. var l = scheduler.CreateHotObservable(
  7558. OnNext(150, 1),
  7559. OnNext(210, 2),
  7560. OnError<int>(220, ex)
  7561. );
  7562. var r = scheduler.CreateHotObservable(
  7563. OnNext(150, 1),
  7564. OnNext(230, 2),
  7565. OnCompleted<int>(250)
  7566. );
  7567. var res = scheduler.Start(() =>
  7568. l.SkipUntil(r)
  7569. );
  7570. res.Messages.AssertEqual(
  7571. OnError<int>(220, ex)
  7572. );
  7573. l.Subscriptions.AssertEqual(
  7574. Subscribe(200, 220)
  7575. );
  7576. r.Subscriptions.AssertEqual(
  7577. Subscribe(200, 220)
  7578. );
  7579. }
  7580. [Fact]
  7581. public void SkipUntil_SomeData_Empty()
  7582. {
  7583. var scheduler = new TestScheduler();
  7584. var l = scheduler.CreateHotObservable(
  7585. OnNext(150, 1),
  7586. OnNext(210, 2),
  7587. OnNext(220, 3),
  7588. OnNext(230, 4),
  7589. OnNext(240, 5),
  7590. OnCompleted<int>(250)
  7591. );
  7592. var r = scheduler.CreateHotObservable(
  7593. OnNext(150, 1),
  7594. OnCompleted<int>(225)
  7595. );
  7596. var res = scheduler.Start(() =>
  7597. l.SkipUntil(r)
  7598. );
  7599. res.Messages.AssertEqual(
  7600. );
  7601. l.Subscriptions.AssertEqual(
  7602. Subscribe(200, 250)
  7603. );
  7604. r.Subscriptions.AssertEqual(
  7605. Subscribe(200, 225)
  7606. );
  7607. }
  7608. [Fact]
  7609. public void SkipUntil_Never_Next()
  7610. {
  7611. var scheduler = new TestScheduler();
  7612. var l = scheduler.CreateHotObservable(
  7613. OnNext(150, 1)
  7614. );
  7615. var r = scheduler.CreateHotObservable(
  7616. OnNext(150, 1),
  7617. OnNext(225, 2), //!
  7618. OnCompleted<int>(250)
  7619. );
  7620. var res = scheduler.Start(() =>
  7621. l.SkipUntil(r)
  7622. );
  7623. res.Messages.AssertEqual(
  7624. );
  7625. l.Subscriptions.AssertEqual(
  7626. Subscribe(200, 1000)
  7627. );
  7628. r.Subscriptions.AssertEqual(
  7629. Subscribe(200, 225)
  7630. );
  7631. }
  7632. [Fact]
  7633. public void SkipUntil_Never_Error1()
  7634. {
  7635. var scheduler = new TestScheduler();
  7636. var ex = new Exception();
  7637. var l = scheduler.CreateHotObservable(
  7638. OnNext(150, 1)
  7639. );
  7640. var r = scheduler.CreateHotObservable(
  7641. OnNext(150, 1),
  7642. OnError<int>(225, ex)
  7643. );
  7644. var res = scheduler.Start(() =>
  7645. l.SkipUntil(r)
  7646. );
  7647. res.Messages.AssertEqual(
  7648. OnError<int>(225, ex)
  7649. );
  7650. l.Subscriptions.AssertEqual(
  7651. Subscribe(200, 225)
  7652. );
  7653. r.Subscriptions.AssertEqual(
  7654. Subscribe(200, 225)
  7655. );
  7656. }
  7657. [Fact]
  7658. public void SkipUntil_SomeData_Error2()
  7659. {
  7660. var scheduler = new TestScheduler();
  7661. var ex = new Exception();
  7662. var l = scheduler.CreateHotObservable(
  7663. OnNext(150, 1),
  7664. OnNext(210, 2),
  7665. OnNext(220, 3),
  7666. OnNext(230, 4),
  7667. OnNext(240, 5),
  7668. OnCompleted<int>(250)
  7669. );
  7670. var r = scheduler.CreateHotObservable(
  7671. OnNext(150, 1),
  7672. OnError<int>(300, ex)
  7673. );
  7674. var res = scheduler.Start(() =>
  7675. l.SkipUntil(r)
  7676. );
  7677. res.Messages.AssertEqual(
  7678. OnError<int>(300, ex)
  7679. );
  7680. l.Subscriptions.AssertEqual(
  7681. Subscribe(200, 250)
  7682. );
  7683. r.Subscriptions.AssertEqual(
  7684. Subscribe(200, 300)
  7685. );
  7686. }
  7687. [Fact]
  7688. public void SkipUntil_SomeData_Never()
  7689. {
  7690. var scheduler = new TestScheduler();
  7691. var l = scheduler.CreateHotObservable(
  7692. OnNext(150, 1),
  7693. OnNext(210, 2),
  7694. OnNext(220, 3),
  7695. OnNext(230, 4),
  7696. OnNext(240, 5),
  7697. OnCompleted<int>(250)
  7698. );
  7699. var r = scheduler.CreateHotObservable(
  7700. OnNext(150, 1)
  7701. );
  7702. var res = scheduler.Start(() =>
  7703. l.SkipUntil(r)
  7704. );
  7705. res.Messages.AssertEqual(
  7706. );
  7707. l.Subscriptions.AssertEqual(
  7708. Subscribe(200, 250)
  7709. );
  7710. r.Subscriptions.AssertEqual(
  7711. Subscribe(200, 1000 /* can't dispose prematurely, could be in flight to dispatch OnError */)
  7712. );
  7713. }
  7714. [Fact]
  7715. public void SkipUntil_Never_Empty()
  7716. {
  7717. var scheduler = new TestScheduler();
  7718. var l = scheduler.CreateHotObservable(
  7719. OnNext(150, 1)
  7720. );
  7721. var r = scheduler.CreateHotObservable(
  7722. OnNext(150, 1),
  7723. OnCompleted<int>(225)
  7724. );
  7725. var res = scheduler.Start(() =>
  7726. l.SkipUntil(r)
  7727. );
  7728. res.Messages.AssertEqual(
  7729. );
  7730. l.Subscriptions.AssertEqual(
  7731. Subscribe(200, 1000)
  7732. );
  7733. r.Subscriptions.AssertEqual(
  7734. Subscribe(200, 225)
  7735. );
  7736. }
  7737. [Fact]
  7738. public void SkipUntil_Never_Never()
  7739. {
  7740. var scheduler = new TestScheduler();
  7741. var l = scheduler.CreateHotObservable(
  7742. OnNext(150, 1)
  7743. );
  7744. var r = scheduler.CreateHotObservable(
  7745. OnNext(150, 1)
  7746. );
  7747. var res = scheduler.Start(() =>
  7748. l.SkipUntil(r)
  7749. );
  7750. res.Messages.AssertEqual(
  7751. );
  7752. l.Subscriptions.AssertEqual(
  7753. Subscribe(200, 1000)
  7754. );
  7755. r.Subscriptions.AssertEqual(
  7756. Subscribe(200, 1000)
  7757. );
  7758. }
  7759. [Fact]
  7760. public void SkipUntil_HasCompletedCausesDisposal()
  7761. {
  7762. var scheduler = new TestScheduler();
  7763. bool disposed = false;
  7764. var l = scheduler.CreateHotObservable(
  7765. OnNext(150, 1),
  7766. OnNext(210, 2),
  7767. OnNext(220, 3),
  7768. OnNext(230, 4),
  7769. OnNext(240, 5),
  7770. OnCompleted<int>(250)
  7771. );
  7772. var r = Observable.Create<int>(obs => () => { disposed = true; });
  7773. var res = scheduler.Start(() =>
  7774. l.SkipUntil(r)
  7775. );
  7776. res.Messages.AssertEqual(
  7777. );
  7778. Assert.True(disposed, "disposed");
  7779. }
  7780. #endregion
  7781. #region + Switch +
  7782. [Fact]
  7783. public void Switch_ArgumentChecking()
  7784. {
  7785. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Switch((IObservable<IObservable<int>>)null));
  7786. #if !NO_TPL
  7787. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Switch((IObservable<System.Threading.Tasks.Task<int>>)null));
  7788. #endif
  7789. }
  7790. [Fact]
  7791. public void Switch_Data()
  7792. {
  7793. var scheduler = new TestScheduler();
  7794. var ys1 = scheduler.CreateColdObservable(
  7795. OnNext(10, 101),
  7796. OnNext(20, 102),
  7797. OnNext(110, 103),
  7798. OnNext(120, 104),
  7799. OnNext(210, 105),
  7800. OnNext(220, 106),
  7801. OnCompleted<int>(230)
  7802. );
  7803. var ys2 = scheduler.CreateColdObservable(
  7804. OnNext(10, 201),
  7805. OnNext(20, 202),
  7806. OnNext(30, 203),
  7807. OnNext(40, 204),
  7808. OnCompleted<int>(50)
  7809. );
  7810. var ys3 = scheduler.CreateColdObservable(
  7811. OnNext(10, 301),
  7812. OnNext(20, 302),
  7813. OnNext(30, 303),
  7814. OnNext(40, 304),
  7815. OnCompleted<int>(150)
  7816. );
  7817. var xs = scheduler.CreateHotObservable(
  7818. OnNext<IObservable<int>>(300, ys1),
  7819. OnNext<IObservable<int>>(400, ys2),
  7820. OnNext<IObservable<int>>(500, ys3),
  7821. OnCompleted<IObservable<int>>(600)
  7822. );
  7823. var res = scheduler.Start(() =>
  7824. xs.Switch()
  7825. );
  7826. res.Messages.AssertEqual(
  7827. OnNext(310, 101),
  7828. OnNext(320, 102),
  7829. OnNext(410, 201),
  7830. OnNext(420, 202),
  7831. OnNext(430, 203),
  7832. OnNext(440, 204),
  7833. OnNext(510, 301),
  7834. OnNext(520, 302),
  7835. OnNext(530, 303),
  7836. OnNext(540, 304),
  7837. OnCompleted<int>(650)
  7838. );
  7839. #if !NO_PERF
  7840. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  7841. xs.Subscriptions.AssertEqual(
  7842. Subscribe(200, 600)
  7843. );
  7844. #else
  7845. xs.Subscriptions.AssertEqual(
  7846. Subscribe(200, 650)
  7847. );
  7848. #endif
  7849. ys1.Subscriptions.AssertEqual(
  7850. Subscribe(300, 400)
  7851. );
  7852. #if !NO_PERF
  7853. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  7854. ys2.Subscriptions.AssertEqual(
  7855. Subscribe(400, 450)
  7856. );
  7857. #else
  7858. ys2.Subscriptions.AssertEqual(
  7859. Subscribe(400, 500)
  7860. );
  7861. #endif
  7862. ys3.Subscriptions.AssertEqual(
  7863. Subscribe(500, 650)
  7864. );
  7865. }
  7866. [Fact]
  7867. public void Switch_InnerThrows()
  7868. {
  7869. var scheduler = new TestScheduler();
  7870. var ex = new Exception();
  7871. var ys1 = scheduler.CreateColdObservable(
  7872. OnNext(10, 101),
  7873. OnNext(20, 102),
  7874. OnNext(110, 103),
  7875. OnNext(120, 104),
  7876. OnNext(210, 105),
  7877. OnNext(220, 106),
  7878. OnCompleted<int>(230)
  7879. );
  7880. var ys2 = scheduler.CreateColdObservable(
  7881. OnNext(10, 201),
  7882. OnNext(20, 202),
  7883. OnNext(30, 203),
  7884. OnNext(40, 204),
  7885. OnError<int>(50, ex)
  7886. );
  7887. var ys3 = scheduler.CreateColdObservable(
  7888. OnNext(10, 301),
  7889. OnNext(20, 302),
  7890. OnNext(30, 303),
  7891. OnNext(40, 304),
  7892. OnCompleted<int>(150)
  7893. );
  7894. var xs = scheduler.CreateHotObservable(
  7895. OnNext<IObservable<int>>(300, ys1),
  7896. OnNext<IObservable<int>>(400, ys2),
  7897. OnNext<IObservable<int>>(500, ys3),
  7898. OnCompleted<IObservable<int>>(600)
  7899. );
  7900. var res = scheduler.Start(() =>
  7901. xs.Switch()
  7902. );
  7903. res.Messages.AssertEqual(
  7904. OnNext(310, 101),
  7905. OnNext(320, 102),
  7906. OnNext(410, 201),
  7907. OnNext(420, 202),
  7908. OnNext(430, 203),
  7909. OnNext(440, 204),
  7910. OnError<int>(450, ex)
  7911. );
  7912. xs.Subscriptions.AssertEqual(
  7913. Subscribe(200, 450)
  7914. );
  7915. ys1.Subscriptions.AssertEqual(
  7916. Subscribe(300, 400)
  7917. );
  7918. ys2.Subscriptions.AssertEqual(
  7919. Subscribe(400, 450)
  7920. );
  7921. ys3.Subscriptions.AssertEqual(
  7922. );
  7923. }
  7924. [Fact]
  7925. public void Switch_OuterThrows()
  7926. {
  7927. var scheduler = new TestScheduler();
  7928. var ex = new Exception();
  7929. var ys1 = scheduler.CreateColdObservable(
  7930. OnNext(10, 101),
  7931. OnNext(20, 102),
  7932. OnNext(110, 103),
  7933. OnNext(120, 104),
  7934. OnNext(210, 105),
  7935. OnNext(220, 106),
  7936. OnCompleted<int>(230)
  7937. );
  7938. var ys2 = scheduler.CreateColdObservable(
  7939. OnNext(10, 201),
  7940. OnNext(20, 202),
  7941. OnNext(30, 203),
  7942. OnNext(40, 204),
  7943. OnCompleted<int>(50)
  7944. );
  7945. var xs = scheduler.CreateHotObservable(
  7946. OnNext<IObservable<int>>(300, ys1),
  7947. OnNext<IObservable<int>>(400, ys2),
  7948. OnError<IObservable<int>>(500, ex)
  7949. );
  7950. var res = scheduler.Start(() =>
  7951. xs.Switch()
  7952. );
  7953. res.Messages.AssertEqual(
  7954. OnNext(310, 101),
  7955. OnNext(320, 102),
  7956. OnNext(410, 201),
  7957. OnNext(420, 202),
  7958. OnNext(430, 203),
  7959. OnNext(440, 204),
  7960. OnError<int>(500, ex)
  7961. );
  7962. xs.Subscriptions.AssertEqual(
  7963. Subscribe(200, 500)
  7964. );
  7965. ys1.Subscriptions.AssertEqual(
  7966. Subscribe(300, 400)
  7967. );
  7968. #if !NO_PERF
  7969. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  7970. ys2.Subscriptions.AssertEqual(
  7971. Subscribe(400, 450)
  7972. );
  7973. #else
  7974. ys2.Subscriptions.AssertEqual(
  7975. Subscribe(400, 500)
  7976. );
  7977. #endif
  7978. }
  7979. [Fact]
  7980. public void Switch_NoInner()
  7981. {
  7982. var scheduler = new TestScheduler();
  7983. var xs = scheduler.CreateHotObservable(
  7984. OnCompleted<IObservable<int>>(500)
  7985. );
  7986. var res = scheduler.Start(() =>
  7987. xs.Switch()
  7988. );
  7989. res.Messages.AssertEqual(
  7990. OnCompleted<int>(500)
  7991. );
  7992. xs.Subscriptions.AssertEqual(
  7993. Subscribe(200, 500)
  7994. );
  7995. }
  7996. [Fact]
  7997. public void Switch_InnerCompletes()
  7998. {
  7999. var scheduler = new TestScheduler();
  8000. var ys1 = scheduler.CreateColdObservable(
  8001. OnNext(10, 101),
  8002. OnNext(20, 102),
  8003. OnNext(110, 103),
  8004. OnNext(120, 104),
  8005. OnNext(210, 105),
  8006. OnNext(220, 106),
  8007. OnCompleted<int>(230)
  8008. );
  8009. var xs = scheduler.CreateHotObservable(
  8010. OnNext<IObservable<int>>(300, ys1),
  8011. OnCompleted<IObservable<int>>(540)
  8012. );
  8013. var res = scheduler.Start(() =>
  8014. xs.Switch()
  8015. );
  8016. res.Messages.AssertEqual(
  8017. OnNext(310, 101),
  8018. OnNext(320, 102),
  8019. OnNext(410, 103),
  8020. OnNext(420, 104),
  8021. OnNext(510, 105),
  8022. OnNext(520, 106),
  8023. OnCompleted<int>(540)
  8024. );
  8025. xs.Subscriptions.AssertEqual(
  8026. Subscribe(200, 540)
  8027. );
  8028. #if !NO_PERF
  8029. // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  8030. ys1.Subscriptions.AssertEqual(
  8031. Subscribe(300, 530)
  8032. );
  8033. #else
  8034. ys1.Subscriptions.AssertEqual(
  8035. Subscribe(300, 540)
  8036. );
  8037. #endif
  8038. }
  8039. #if !NO_TPL
  8040. [Fact]
  8041. public void Switch_Task()
  8042. {
  8043. var tss = Observable.Switch(new[] { Task.Factory.StartNew(() => 1), Task.Factory.StartNew(() => 2), Task.Factory.StartNew(() => 3) }.ToObservable());
  8044. var res = tss.ToArray().Single();
  8045. Assert.True(res.Zip(res.Skip(1), (l, r) => r > l).All(b => b));
  8046. }
  8047. #endif
  8048. #endregion
  8049. #region + TakeUntil +
  8050. [Fact]
  8051. public void TakeUntil_ArgumentChecking()
  8052. {
  8053. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeUntil<int, int>(null, DummyObservable<int>.Instance));
  8054. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.TakeUntil<int, int>(DummyObservable<int>.Instance, null));
  8055. }
  8056. [Fact]
  8057. public void TakeUntil_Preempt_SomeData_Next()
  8058. {
  8059. var scheduler = new TestScheduler();
  8060. var l = scheduler.CreateHotObservable(
  8061. OnNext(150, 1),
  8062. OnNext(210, 2),
  8063. OnNext(220, 3),
  8064. OnNext(230, 4),
  8065. OnNext(240, 5),
  8066. OnCompleted<int>(250)
  8067. );
  8068. var r = scheduler.CreateHotObservable(
  8069. OnNext(150, 1),
  8070. OnNext(225, 99),
  8071. OnCompleted<int>(230)
  8072. );
  8073. var res = scheduler.Start(() =>
  8074. l.TakeUntil(r)
  8075. );
  8076. res.Messages.AssertEqual(
  8077. OnNext(210, 2),
  8078. OnNext(220, 3),
  8079. OnCompleted<int>(225)
  8080. );
  8081. l.Subscriptions.AssertEqual(
  8082. Subscribe(200, 225)
  8083. );
  8084. r.Subscriptions.AssertEqual(
  8085. Subscribe(200, 225)
  8086. );
  8087. }
  8088. [Fact]
  8089. public void TakeUntil_Preempt_SomeData_Error()
  8090. {
  8091. var scheduler = new TestScheduler();
  8092. var ex = new Exception();
  8093. var l = scheduler.CreateHotObservable(
  8094. OnNext(150, 1),
  8095. OnNext(210, 2),
  8096. OnNext(220, 3),
  8097. OnNext(230, 4),
  8098. OnNext(240, 5),
  8099. OnCompleted<int>(250)
  8100. );
  8101. var r = scheduler.CreateHotObservable(
  8102. OnNext(150, 1),
  8103. OnError<int>(225, ex)
  8104. );
  8105. var res = scheduler.Start(() =>
  8106. l.TakeUntil(r)
  8107. );
  8108. res.Messages.AssertEqual(
  8109. OnNext(210, 2),
  8110. OnNext(220, 3),
  8111. OnError<int>(225, ex)
  8112. );
  8113. l.Subscriptions.AssertEqual(
  8114. Subscribe(200, 225)
  8115. );
  8116. r.Subscriptions.AssertEqual(
  8117. Subscribe(200, 225)
  8118. );
  8119. }
  8120. [Fact]
  8121. public void TakeUntil_NoPreempt_SomeData_Empty()
  8122. {
  8123. var scheduler = new TestScheduler();
  8124. var l = scheduler.CreateHotObservable(
  8125. OnNext(150, 1),
  8126. OnNext(210, 2),
  8127. OnNext(220, 3),
  8128. OnNext(230, 4),
  8129. OnNext(240, 5),
  8130. OnCompleted<int>(250)
  8131. );
  8132. var r = scheduler.CreateHotObservable(
  8133. OnNext(150, 1),
  8134. OnCompleted<int>(225)
  8135. );
  8136. var res = scheduler.Start(() =>
  8137. l.TakeUntil(r)
  8138. );
  8139. res.Messages.AssertEqual(
  8140. OnNext(210, 2),
  8141. OnNext(220, 3),
  8142. OnNext(230, 4),
  8143. OnNext(240, 5),
  8144. OnCompleted<int>(250)
  8145. );
  8146. l.Subscriptions.AssertEqual(
  8147. Subscribe(200, 250)
  8148. );
  8149. r.Subscriptions.AssertEqual(
  8150. Subscribe(200, 225)
  8151. );
  8152. }
  8153. [Fact]
  8154. public void TakeUntil_NoPreempt_SomeData_Never()
  8155. {
  8156. var scheduler = new TestScheduler();
  8157. var l = scheduler.CreateHotObservable(
  8158. OnNext(150, 1),
  8159. OnNext(210, 2),
  8160. OnNext(220, 3),
  8161. OnNext(230, 4),
  8162. OnNext(240, 5),
  8163. OnCompleted<int>(250)
  8164. );
  8165. var r = scheduler.CreateHotObservable(
  8166. OnNext(150, 1)
  8167. );
  8168. var res = scheduler.Start(() =>
  8169. l.TakeUntil(r)
  8170. );
  8171. res.Messages.AssertEqual(
  8172. OnNext(210, 2),
  8173. OnNext(220, 3),
  8174. OnNext(230, 4),
  8175. OnNext(240, 5),
  8176. OnCompleted<int>(250)
  8177. );
  8178. l.Subscriptions.AssertEqual(
  8179. Subscribe(200, 250)
  8180. );
  8181. r.Subscriptions.AssertEqual(
  8182. Subscribe(200, 250)
  8183. );
  8184. }
  8185. [Fact]
  8186. public void TakeUntil_Preempt_Never_Next()
  8187. {
  8188. var scheduler = new TestScheduler();
  8189. var l = scheduler.CreateHotObservable(
  8190. OnNext(150, 1)
  8191. );
  8192. var r = scheduler.CreateHotObservable(
  8193. OnNext(150, 1),
  8194. OnNext(225, 2), //!
  8195. OnCompleted<int>(250)
  8196. );
  8197. var res = scheduler.Start(() =>
  8198. l.TakeUntil(r)
  8199. );
  8200. res.Messages.AssertEqual(
  8201. OnCompleted<int>(225)
  8202. );
  8203. l.Subscriptions.AssertEqual(
  8204. Subscribe(200, 225)
  8205. );
  8206. r.Subscriptions.AssertEqual(
  8207. Subscribe(200, 225)
  8208. );
  8209. }
  8210. [Fact]
  8211. public void TakeUntil_Preempt_Never_Error()
  8212. {
  8213. var scheduler = new TestScheduler();
  8214. var ex = new Exception();
  8215. var l = scheduler.CreateHotObservable(
  8216. OnNext(150, 1)
  8217. );
  8218. var r = scheduler.CreateHotObservable(
  8219. OnNext(150, 1),
  8220. OnError<int>(225, ex)
  8221. );
  8222. var res = scheduler.Start(() =>
  8223. l.TakeUntil(r)
  8224. );
  8225. res.Messages.AssertEqual(
  8226. OnError<int>(225, ex)
  8227. );
  8228. l.Subscriptions.AssertEqual(
  8229. Subscribe(200, 225)
  8230. );
  8231. r.Subscriptions.AssertEqual(
  8232. Subscribe(200, 225)
  8233. );
  8234. }
  8235. [Fact]
  8236. public void TakeUntil_NoPreempt_Never_Empty()
  8237. {
  8238. var scheduler = new TestScheduler();
  8239. var l = scheduler.CreateHotObservable(
  8240. OnNext(150, 1)
  8241. );
  8242. var r = scheduler.CreateHotObservable(
  8243. OnNext(150, 1),
  8244. OnCompleted<int>(225)
  8245. );
  8246. var res = scheduler.Start(() =>
  8247. l.TakeUntil(r)
  8248. );
  8249. res.Messages.AssertEqual(
  8250. );
  8251. l.Subscriptions.AssertEqual(
  8252. Subscribe(200, 1000 /* can't dispose prematurely, could be in flight to dispatch OnError */)
  8253. );
  8254. r.Subscriptions.AssertEqual(
  8255. Subscribe(200, 225)
  8256. );
  8257. }
  8258. [Fact]
  8259. public void TakeUntil_NoPreempt_Never_Never()
  8260. {
  8261. var scheduler = new TestScheduler();
  8262. var l = scheduler.CreateHotObservable(
  8263. OnNext(150, 1)
  8264. );
  8265. var r = scheduler.CreateHotObservable(
  8266. OnNext(150, 1)
  8267. );
  8268. var res = scheduler.Start(() =>
  8269. l.TakeUntil(r)
  8270. );
  8271. res.Messages.AssertEqual(
  8272. );
  8273. l.Subscriptions.AssertEqual(
  8274. Subscribe(200, 1000)
  8275. );
  8276. r.Subscriptions.AssertEqual(
  8277. Subscribe(200, 1000)
  8278. );
  8279. }
  8280. [Fact]
  8281. public void TakeUntil_Preempt_BeforeFirstProduced()
  8282. {
  8283. var scheduler = new TestScheduler();
  8284. var l = scheduler.CreateHotObservable(
  8285. OnNext(150, 1),
  8286. OnNext(230, 2),
  8287. OnCompleted<int>(240)
  8288. );
  8289. var r = scheduler.CreateHotObservable(
  8290. OnNext(150, 1),
  8291. OnNext(210, 2), //!
  8292. OnCompleted<int>(220)
  8293. );
  8294. var res = scheduler.Start(() =>
  8295. l.TakeUntil(r)
  8296. );
  8297. res.Messages.AssertEqual(
  8298. OnCompleted<int>(210)
  8299. );
  8300. l.Subscriptions.AssertEqual(
  8301. Subscribe(200, 210)
  8302. );
  8303. r.Subscriptions.AssertEqual(
  8304. Subscribe(200, 210)
  8305. );
  8306. }
  8307. [Fact]
  8308. public void TakeUntil_Preempt_BeforeFirstProduced_RemainSilentAndProperDisposed()
  8309. {
  8310. var scheduler = new TestScheduler();
  8311. bool sourceNotDisposed = false;
  8312. var l = scheduler.CreateHotObservable(
  8313. OnNext(150, 1),
  8314. OnError<int>(215, new Exception()), // should not come
  8315. OnCompleted<int>(240)
  8316. );
  8317. var r = scheduler.CreateHotObservable(
  8318. OnNext(150, 1),
  8319. OnNext(210, 2), //!
  8320. OnCompleted<int>(220)
  8321. );
  8322. var res = scheduler.Start(() =>
  8323. l.Do(_ => sourceNotDisposed = true).TakeUntil(r)
  8324. );
  8325. res.Messages.AssertEqual(
  8326. OnCompleted<int>(210)
  8327. );
  8328. Assert.False(sourceNotDisposed);
  8329. }
  8330. [Fact]
  8331. public void TakeUntil_NoPreempt_AfterLastProduced_ProperDisposedSignal()
  8332. {
  8333. var scheduler = new TestScheduler();
  8334. bool signalNotDisposed = false;
  8335. var l = scheduler.CreateHotObservable(
  8336. OnNext(150, 1),
  8337. OnNext(230, 2),
  8338. OnCompleted<int>(240)
  8339. );
  8340. var r = scheduler.CreateHotObservable(
  8341. OnNext(150, 1),
  8342. OnNext(250, 2),
  8343. OnCompleted<int>(260)
  8344. );
  8345. var res = scheduler.Start(() =>
  8346. l.TakeUntil(r.Do(_ => signalNotDisposed = true))
  8347. );
  8348. res.Messages.AssertEqual(
  8349. OnNext(230, 2),
  8350. OnCompleted<int>(240)
  8351. );
  8352. Assert.False(signalNotDisposed);
  8353. }
  8354. [Fact]
  8355. public void TakeUntil_Error_Some()
  8356. {
  8357. var scheduler = new TestScheduler();
  8358. var ex = new Exception();
  8359. var l = scheduler.CreateHotObservable(
  8360. OnNext(150, 1),
  8361. OnError<int>(225, ex)
  8362. );
  8363. var r = scheduler.CreateHotObservable(
  8364. OnNext(150, 1),
  8365. OnNext<int>(240, 2)
  8366. );
  8367. var res = scheduler.Start(() =>
  8368. l.TakeUntil(r)
  8369. );
  8370. res.Messages.AssertEqual(
  8371. OnError<int>(225, ex)
  8372. );
  8373. l.Subscriptions.AssertEqual(
  8374. Subscribe(200, 225)
  8375. );
  8376. r.Subscriptions.AssertEqual(
  8377. Subscribe(200, 225)
  8378. );
  8379. }
  8380. #endregion
  8381. #region + Window +
  8382. [Fact]
  8383. public void Window_ArgumentChecking()
  8384. {
  8385. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Window(default(IObservable<int>), DummyFunc<IObservable<int>>.Instance));
  8386. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Window(DummyObservable<int>.Instance, default(Func<IObservable<int>>)));
  8387. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Window(default(IObservable<int>), DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance));
  8388. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Window(DummyObservable<int>.Instance, default(IObservable<int>), DummyFunc<int, IObservable<int>>.Instance));
  8389. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Window(DummyObservable<int>.Instance, DummyObservable<int>.Instance, default(Func<int, IObservable<int>>)));
  8390. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Window(default(IObservable<int>), DummyObservable<int>.Instance));
  8391. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Window(DummyObservable<int>.Instance, default(IObservable<int>)));
  8392. }
  8393. [Fact]
  8394. public void Window_Closings_Basic()
  8395. {
  8396. var scheduler = new TestScheduler();
  8397. var xs = scheduler.CreateHotObservable(
  8398. OnNext(90, 1),
  8399. OnNext(180, 2),
  8400. OnNext(250, 3),
  8401. OnNext(260, 4),
  8402. OnNext(310, 5),
  8403. OnNext(340, 6),
  8404. OnNext(410, 7),
  8405. OnNext(420, 8),
  8406. OnNext(470, 9),
  8407. OnNext(550, 10),
  8408. OnCompleted<int>(590)
  8409. );
  8410. var window = 1;
  8411. var res = scheduler.Start(() =>
  8412. xs.Window(() => Observable.Timer(TimeSpan.FromTicks((window++) * 100), scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8413. );
  8414. res.Messages.AssertEqual(
  8415. OnNext(250, "0 3"),
  8416. OnNext(260, "0 4"),
  8417. OnNext(310, "1 5"),
  8418. OnNext(340, "1 6"),
  8419. OnNext(410, "1 7"),
  8420. OnNext(420, "1 8"),
  8421. OnNext(470, "1 9"),
  8422. OnNext(550, "2 10"),
  8423. OnCompleted<string>(590)
  8424. );
  8425. xs.Subscriptions.AssertEqual(
  8426. Subscribe(200, 590)
  8427. );
  8428. }
  8429. [Fact]
  8430. public void Window_Closings_InnerSubscriptions()
  8431. {
  8432. var scheduler = new TestScheduler();
  8433. var xs = scheduler.CreateHotObservable(
  8434. OnNext(90, 1),
  8435. OnNext(180, 2),
  8436. OnNext(250, 3),
  8437. OnNext(260, 4),
  8438. OnNext(310, 5),
  8439. OnNext(340, 6),
  8440. OnNext(410, 7),
  8441. OnNext(420, 8),
  8442. OnNext(470, 9),
  8443. OnNext(550, 10),
  8444. OnCompleted<int>(590)
  8445. );
  8446. var closings = new ITestableObservable<bool>[] {
  8447. scheduler.CreateHotObservable(
  8448. OnNext(300, true),
  8449. OnNext(350, false),
  8450. OnCompleted<bool>(380)
  8451. ),
  8452. scheduler.CreateHotObservable(
  8453. OnNext(400, true),
  8454. OnNext(510, false),
  8455. OnNext(620, false)
  8456. ),
  8457. scheduler.CreateHotObservable(
  8458. OnCompleted<bool>(500)
  8459. ),
  8460. scheduler.CreateHotObservable(
  8461. OnNext(600, true)
  8462. )
  8463. };
  8464. var window = 0;
  8465. var res = scheduler.Start(() =>
  8466. xs.Window(() => closings[window++]).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8467. );
  8468. res.Messages.AssertEqual(
  8469. OnNext(250, "0 3"),
  8470. OnNext(260, "0 4"),
  8471. OnNext(310, "1 5"),
  8472. OnNext(340, "1 6"),
  8473. OnNext(410, "2 7"),
  8474. OnNext(420, "2 8"),
  8475. OnNext(470, "2 9"),
  8476. OnNext(550, "3 10"),
  8477. OnCompleted<string>(590)
  8478. );
  8479. xs.Subscriptions.AssertEqual(
  8480. Subscribe(200, 590)
  8481. );
  8482. closings[0].Subscriptions.AssertEqual(
  8483. Subscribe(200, 300)
  8484. );
  8485. closings[1].Subscriptions.AssertEqual(
  8486. Subscribe(300, 400)
  8487. );
  8488. closings[2].Subscriptions.AssertEqual(
  8489. Subscribe(400, 500)
  8490. );
  8491. closings[3].Subscriptions.AssertEqual(
  8492. Subscribe(500, 590)
  8493. );
  8494. }
  8495. [Fact]
  8496. public void Window_Closings_Empty()
  8497. {
  8498. var scheduler = new TestScheduler();
  8499. var xs = scheduler.CreateHotObservable(
  8500. OnNext(90, 1),
  8501. OnNext(180, 2),
  8502. OnNext(250, 3),
  8503. OnNext(260, 4),
  8504. OnNext(310, 5),
  8505. OnNext(340, 6),
  8506. OnNext(410, 7),
  8507. OnNext(420, 8),
  8508. OnNext(470, 9),
  8509. OnNext(550, 10),
  8510. OnCompleted<int>(590)
  8511. );
  8512. var window = 1;
  8513. var res = scheduler.Start(() =>
  8514. xs.Window(() => Observable.Empty<int>().Delay(TimeSpan.FromTicks((window++) * 100), scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8515. );
  8516. res.Messages.AssertEqual(
  8517. OnNext(250, "0 3"),
  8518. OnNext(260, "0 4"),
  8519. OnNext(310, "1 5"),
  8520. OnNext(340, "1 6"),
  8521. OnNext(410, "1 7"),
  8522. OnNext(420, "1 8"),
  8523. OnNext(470, "1 9"),
  8524. OnNext(550, "2 10"),
  8525. OnCompleted<string>(590)
  8526. );
  8527. xs.Subscriptions.AssertEqual(
  8528. Subscribe(200, 590)
  8529. );
  8530. }
  8531. [Fact]
  8532. public void Window_Closings_Dispose()
  8533. {
  8534. var scheduler = new TestScheduler();
  8535. var xs = scheduler.CreateHotObservable(
  8536. OnNext(90, 1),
  8537. OnNext(180, 2),
  8538. OnNext(250, 3),
  8539. OnNext(260, 4),
  8540. OnNext(310, 5),
  8541. OnNext(340, 6),
  8542. OnNext(410, 7),
  8543. OnNext(420, 8),
  8544. OnNext(470, 9),
  8545. OnNext(550, 10),
  8546. OnCompleted<int>(590)
  8547. );
  8548. var window = 1;
  8549. var res = scheduler.Start(() =>
  8550. xs.Window(() => Observable.Timer(TimeSpan.FromTicks((window++) * 100), scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge(),
  8551. 400
  8552. );
  8553. res.Messages.AssertEqual(
  8554. OnNext(250, "0 3"),
  8555. OnNext(260, "0 4"),
  8556. OnNext(310, "1 5"),
  8557. OnNext(340, "1 6")
  8558. );
  8559. xs.Subscriptions.AssertEqual(
  8560. Subscribe(200, 400)
  8561. );
  8562. }
  8563. [Fact]
  8564. public void Window_Closings_Error()
  8565. {
  8566. var scheduler = new TestScheduler();
  8567. var ex = new Exception();
  8568. var xs = scheduler.CreateHotObservable(
  8569. OnNext(90, 1),
  8570. OnNext(180, 2),
  8571. OnNext(250, 3),
  8572. OnNext(260, 4),
  8573. OnNext(310, 5),
  8574. OnNext(340, 6),
  8575. OnNext(410, 7),
  8576. OnNext(420, 8),
  8577. OnNext(470, 9),
  8578. OnNext(550, 10),
  8579. OnError<int>(590, ex)
  8580. );
  8581. var window = 1;
  8582. var res = scheduler.Start(() =>
  8583. xs.Window(() => Observable.Timer(TimeSpan.FromTicks((window++) * 100), scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8584. );
  8585. res.Messages.AssertEqual(
  8586. OnNext(250, "0 3"),
  8587. OnNext(260, "0 4"),
  8588. OnNext(310, "1 5"),
  8589. OnNext(340, "1 6"),
  8590. OnNext(410, "1 7"),
  8591. OnNext(420, "1 8"),
  8592. OnNext(470, "1 9"),
  8593. OnNext(550, "2 10"),
  8594. OnError<string>(590, ex)
  8595. );
  8596. xs.Subscriptions.AssertEqual(
  8597. Subscribe(200, 590)
  8598. );
  8599. }
  8600. [Fact]
  8601. public void Window_Closings_Throw()
  8602. {
  8603. var scheduler = new TestScheduler();
  8604. var ex = new Exception();
  8605. var xs = scheduler.CreateHotObservable(
  8606. OnNext(90, 1),
  8607. OnNext(180, 2),
  8608. OnNext(250, 3),
  8609. OnNext(260, 4),
  8610. OnNext(310, 5),
  8611. OnNext(340, 6),
  8612. OnNext(410, 7),
  8613. OnNext(420, 8),
  8614. OnNext(470, 9),
  8615. OnNext(550, 10),
  8616. OnError<int>(590, new Exception())
  8617. );
  8618. var res = scheduler.Start(() =>
  8619. xs.Window<int, int>(() => { throw ex; }).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8620. );
  8621. res.Messages.AssertEqual(
  8622. OnError<string>(200, ex)
  8623. );
  8624. xs.Subscriptions.AssertEqual(
  8625. Subscribe(200, 200)
  8626. );
  8627. }
  8628. [Fact]
  8629. public void Window_Closings_WindowClose_Error()
  8630. {
  8631. var scheduler = new TestScheduler();
  8632. var ex = new Exception();
  8633. var xs = scheduler.CreateHotObservable(
  8634. OnNext(90, 1),
  8635. OnNext(180, 2),
  8636. OnNext(250, 3),
  8637. OnNext(260, 4),
  8638. OnNext(310, 5),
  8639. OnNext(340, 6),
  8640. OnNext(410, 7),
  8641. OnNext(420, 8),
  8642. OnNext(470, 9),
  8643. OnNext(550, 10),
  8644. OnError<int>(590, new Exception())
  8645. );
  8646. var res = scheduler.Start(() =>
  8647. xs.Window(() => Observable.Throw<int>(ex, scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8648. );
  8649. res.Messages.AssertEqual(
  8650. OnError<string>(201, ex)
  8651. );
  8652. xs.Subscriptions.AssertEqual(
  8653. Subscribe(200, 201)
  8654. );
  8655. }
  8656. [Fact]
  8657. public void Window_Closings_Default()
  8658. {
  8659. var scheduler = new TestScheduler();
  8660. var xs = scheduler.CreateHotObservable(
  8661. OnNext(90, 1),
  8662. OnNext(180, 2),
  8663. OnNext(250, 3),
  8664. OnNext(260, 4),
  8665. OnNext(310, 5),
  8666. OnNext(340, 6),
  8667. OnNext(410, 7),
  8668. OnNext(420, 8),
  8669. OnNext(470, 9),
  8670. OnNext(550, 10),
  8671. OnCompleted<int>(590)
  8672. );
  8673. var window = 1;
  8674. var res = scheduler.Start(() =>
  8675. xs.Window(() => Observable.Timer(TimeSpan.FromTicks((window++) * 100), scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8676. );
  8677. res.Messages.AssertEqual(
  8678. OnNext(250, "0 3"),
  8679. OnNext(260, "0 4"),
  8680. OnNext(310, "1 5"),
  8681. OnNext(340, "1 6"),
  8682. OnNext(410, "1 7"),
  8683. OnNext(420, "1 8"),
  8684. OnNext(470, "1 9"),
  8685. OnNext(550, "2 10"),
  8686. OnCompleted<string>(590)
  8687. );
  8688. xs.Subscriptions.AssertEqual(
  8689. Subscribe(200, 590)
  8690. );
  8691. }
  8692. [Fact]
  8693. public void Window_OpeningClosings_Basic()
  8694. {
  8695. var scheduler = new TestScheduler();
  8696. var xs = scheduler.CreateHotObservable(
  8697. OnNext(90, 1),
  8698. OnNext(180, 2),
  8699. OnNext(250, 3),
  8700. OnNext(260, 4),
  8701. OnNext(310, 5),
  8702. OnNext(340, 6),
  8703. OnNext(410, 7),
  8704. OnNext(420, 8),
  8705. OnNext(470, 9),
  8706. OnNext(550, 10),
  8707. OnCompleted<int>(590)
  8708. );
  8709. var ys = scheduler.CreateHotObservable(
  8710. OnNext(255, 50),
  8711. OnNext(330, 100),
  8712. OnNext(350, 50),
  8713. OnNext(400, 90),
  8714. OnCompleted<int>(900)
  8715. );
  8716. var res = scheduler.Start(() =>
  8717. xs.Window(ys, x => Observable.Timer(TimeSpan.FromTicks(x), scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8718. );
  8719. res.Messages.AssertEqual(
  8720. OnNext(260, "0 4"),
  8721. OnNext(340, "1 6"),
  8722. OnNext(410, "1 7"),
  8723. OnNext(410, "3 7"),
  8724. OnNext(420, "1 8"),
  8725. OnNext(420, "3 8"),
  8726. OnNext(470, "3 9"),
  8727. OnCompleted<string>(900)
  8728. );
  8729. #if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
  8730. xs.Subscriptions.AssertEqual(
  8731. Subscribe(200, 590)
  8732. );
  8733. #else
  8734. xs.Subscriptions.AssertEqual(
  8735. Subscribe(200, 900)
  8736. );
  8737. #endif
  8738. ys.Subscriptions.AssertEqual(
  8739. Subscribe(200, 900)
  8740. );
  8741. }
  8742. [Fact]
  8743. public void Window_OpeningClosings_Throw()
  8744. {
  8745. var scheduler = new TestScheduler();
  8746. var xs = scheduler.CreateHotObservable(
  8747. OnNext(90, 1),
  8748. OnNext(180, 2),
  8749. OnNext(250, 3),
  8750. OnNext(260, 4),
  8751. OnNext(310, 5),
  8752. OnNext(340, 6),
  8753. OnNext(410, 7),
  8754. OnNext(420, 8),
  8755. OnNext(470, 9),
  8756. OnNext(550, 10),
  8757. OnCompleted<int>(590)
  8758. );
  8759. var ys = scheduler.CreateHotObservable(
  8760. OnNext(255, 50),
  8761. OnNext(330, 100),
  8762. OnNext(350, 50),
  8763. OnNext(400, 90),
  8764. OnCompleted<int>(900)
  8765. );
  8766. var ex = new Exception();
  8767. var res = scheduler.Start(() =>
  8768. xs.Window<int, int, int>(ys, x => { throw ex; }).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8769. );
  8770. res.Messages.AssertEqual(
  8771. OnError<string>(255, ex)
  8772. );
  8773. xs.Subscriptions.AssertEqual(
  8774. Subscribe(200, 255)
  8775. );
  8776. ys.Subscriptions.AssertEqual(
  8777. Subscribe(200, 255)
  8778. );
  8779. }
  8780. [Fact]
  8781. public void Window_OpeningClosings_Dispose()
  8782. {
  8783. var scheduler = new TestScheduler();
  8784. var xs = scheduler.CreateHotObservable(
  8785. OnNext(90, 1),
  8786. OnNext(180, 2),
  8787. OnNext(250, 3),
  8788. OnNext(260, 4),
  8789. OnNext(310, 5),
  8790. OnNext(340, 6),
  8791. OnNext(410, 7),
  8792. OnNext(420, 8),
  8793. OnNext(470, 9),
  8794. OnNext(550, 10),
  8795. OnCompleted<int>(590)
  8796. );
  8797. var ys = scheduler.CreateHotObservable(
  8798. OnNext(255, 50),
  8799. OnNext(330, 100),
  8800. OnNext(350, 50),
  8801. OnNext(400, 90),
  8802. OnCompleted<int>(900)
  8803. );
  8804. var res = scheduler.Start(() =>
  8805. xs.Window(ys, x => Observable.Timer(TimeSpan.FromTicks(x), scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge(),
  8806. 415
  8807. );
  8808. res.Messages.AssertEqual(
  8809. OnNext(260, "0 4"),
  8810. OnNext(340, "1 6"),
  8811. OnNext(410, "1 7"),
  8812. OnNext(410, "3 7")
  8813. );
  8814. xs.Subscriptions.AssertEqual(
  8815. Subscribe(200, 415)
  8816. );
  8817. ys.Subscriptions.AssertEqual(
  8818. Subscribe(200, 415)
  8819. );
  8820. }
  8821. [Fact]
  8822. public void Window_OpeningClosings_Data_Error()
  8823. {
  8824. var scheduler = new TestScheduler();
  8825. var ex = new Exception();
  8826. var xs = scheduler.CreateHotObservable(
  8827. OnNext(90, 1),
  8828. OnNext(180, 2),
  8829. OnNext(250, 3),
  8830. OnNext(260, 4),
  8831. OnNext(310, 5),
  8832. OnNext(340, 6),
  8833. OnNext(410, 7),
  8834. OnError<int>(415, ex)
  8835. );
  8836. var ys = scheduler.CreateHotObservable(
  8837. OnNext(255, 50),
  8838. OnNext(330, 100),
  8839. OnNext(350, 50),
  8840. OnNext(400, 90),
  8841. OnCompleted<int>(900)
  8842. );
  8843. var res = scheduler.Start(() =>
  8844. xs.Window(ys, x => Observable.Timer(TimeSpan.FromTicks(x), scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8845. );
  8846. res.Messages.AssertEqual(
  8847. OnNext(260, "0 4"),
  8848. OnNext(340, "1 6"),
  8849. OnNext(410, "1 7"),
  8850. OnNext(410, "3 7"),
  8851. OnError<string>(415, ex)
  8852. );
  8853. xs.Subscriptions.AssertEqual(
  8854. Subscribe(200, 415)
  8855. );
  8856. ys.Subscriptions.AssertEqual(
  8857. Subscribe(200, 415)
  8858. );
  8859. }
  8860. [Fact]
  8861. public void Window_OpeningClosings_Window_Error()
  8862. {
  8863. var scheduler = new TestScheduler();
  8864. var ex = new Exception();
  8865. var xs = scheduler.CreateHotObservable(
  8866. OnNext(90, 1),
  8867. OnNext(180, 2),
  8868. OnNext(250, 3),
  8869. OnNext(260, 4),
  8870. OnNext(310, 5),
  8871. OnNext(340, 6),
  8872. OnNext(410, 7),
  8873. OnNext(420, 8),
  8874. OnNext(470, 9),
  8875. OnNext(550, 10),
  8876. OnCompleted<int>(590)
  8877. );
  8878. var ys = scheduler.CreateHotObservable(
  8879. OnNext(255, 50),
  8880. OnNext(330, 100),
  8881. OnNext(350, 50),
  8882. OnNext(400, 90),
  8883. OnError<int>(415, ex)
  8884. );
  8885. var res = scheduler.Start(() =>
  8886. xs.Window(ys, x => Observable.Timer(TimeSpan.FromTicks(x), scheduler)).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8887. );
  8888. res.Messages.AssertEqual(
  8889. OnNext(260, "0 4"),
  8890. OnNext(340, "1 6"),
  8891. OnNext(410, "1 7"),
  8892. OnNext(410, "3 7"),
  8893. OnError<string>(415, ex)
  8894. );
  8895. xs.Subscriptions.AssertEqual(
  8896. Subscribe(200, 415)
  8897. );
  8898. ys.Subscriptions.AssertEqual(
  8899. Subscribe(200, 415)
  8900. );
  8901. }
  8902. [Fact]
  8903. public void Window_Boundaries_Simple()
  8904. {
  8905. var scheduler = new TestScheduler();
  8906. var xs = scheduler.CreateHotObservable(
  8907. OnNext(90, 1),
  8908. OnNext(180, 2),
  8909. OnNext(250, 3),
  8910. OnNext(260, 4),
  8911. OnNext(310, 5),
  8912. OnNext(340, 6),
  8913. OnNext(410, 7),
  8914. OnNext(420, 8),
  8915. OnNext(470, 9),
  8916. OnNext(550, 10),
  8917. OnCompleted<int>(590)
  8918. );
  8919. var ys = scheduler.CreateHotObservable(
  8920. OnNext(255, true),
  8921. OnNext(330, true),
  8922. OnNext(350, true),
  8923. OnNext(400, true),
  8924. OnNext(500, true),
  8925. OnCompleted<bool>(900)
  8926. );
  8927. var res = scheduler.Start(() =>
  8928. xs.Window(ys).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8929. );
  8930. res.Messages.AssertEqual(
  8931. OnNext(250, "0 3"),
  8932. OnNext(260, "1 4"),
  8933. OnNext(310, "1 5"),
  8934. OnNext(340, "2 6"),
  8935. OnNext(410, "4 7"),
  8936. OnNext(420, "4 8"),
  8937. OnNext(470, "4 9"),
  8938. OnNext(550, "5 10"),
  8939. OnCompleted<string>(590)
  8940. );
  8941. xs.Subscriptions.AssertEqual(
  8942. Subscribe(200, 590)
  8943. );
  8944. ys.Subscriptions.AssertEqual(
  8945. Subscribe(200, 590)
  8946. );
  8947. }
  8948. [Fact]
  8949. public void Window_Boundaries_OnCompletedBoundaries()
  8950. {
  8951. var scheduler = new TestScheduler();
  8952. var xs = scheduler.CreateHotObservable(
  8953. OnNext(90, 1),
  8954. OnNext(180, 2),
  8955. OnNext(250, 3),
  8956. OnNext(260, 4),
  8957. OnNext(310, 5),
  8958. OnNext(340, 6),
  8959. OnNext(410, 7),
  8960. OnNext(420, 8),
  8961. OnNext(470, 9),
  8962. OnNext(550, 10),
  8963. OnCompleted<int>(590)
  8964. );
  8965. var ys = scheduler.CreateHotObservable(
  8966. OnNext(255, true),
  8967. OnNext(330, true),
  8968. OnNext(350, true),
  8969. OnCompleted<bool>(400)
  8970. );
  8971. var res = scheduler.Start(() =>
  8972. xs.Window(ys).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  8973. );
  8974. res.Messages.AssertEqual(
  8975. OnNext(250, "0 3"),
  8976. OnNext(260, "1 4"),
  8977. OnNext(310, "1 5"),
  8978. OnNext(340, "2 6"),
  8979. OnCompleted<string>(400)
  8980. );
  8981. xs.Subscriptions.AssertEqual(
  8982. Subscribe(200, 400)
  8983. );
  8984. ys.Subscriptions.AssertEqual(
  8985. Subscribe(200, 400)
  8986. );
  8987. }
  8988. [Fact]
  8989. public void Window_Boundaries_OnErrorSource()
  8990. {
  8991. var ex = new Exception();
  8992. var scheduler = new TestScheduler();
  8993. var xs = scheduler.CreateHotObservable(
  8994. OnNext(90, 1),
  8995. OnNext(180, 2),
  8996. OnNext(250, 3),
  8997. OnNext(260, 4),
  8998. OnNext(310, 5),
  8999. OnNext(340, 6),
  9000. OnNext(380, 7),
  9001. OnError<int>(400, ex)
  9002. );
  9003. var ys = scheduler.CreateHotObservable(
  9004. OnNext(255, true),
  9005. OnNext(330, true),
  9006. OnNext(350, true),
  9007. OnCompleted<bool>(500)
  9008. );
  9009. var res = scheduler.Start(() =>
  9010. xs.Window(ys).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  9011. );
  9012. res.Messages.AssertEqual(
  9013. OnNext(250, "0 3"),
  9014. OnNext(260, "1 4"),
  9015. OnNext(310, "1 5"),
  9016. OnNext(340, "2 6"),
  9017. OnNext(380, "3 7"),
  9018. OnError<string>(400, ex)
  9019. );
  9020. xs.Subscriptions.AssertEqual(
  9021. Subscribe(200, 400)
  9022. );
  9023. ys.Subscriptions.AssertEqual(
  9024. Subscribe(200, 400)
  9025. );
  9026. }
  9027. [Fact]
  9028. public void Window_Boundaries_OnErrorBoundaries()
  9029. {
  9030. var ex = new Exception();
  9031. var scheduler = new TestScheduler();
  9032. var xs = scheduler.CreateHotObservable(
  9033. OnNext(90, 1),
  9034. OnNext(180, 2),
  9035. OnNext(250, 3),
  9036. OnNext(260, 4),
  9037. OnNext(310, 5),
  9038. OnNext(340, 6),
  9039. OnNext(410, 7),
  9040. OnNext(420, 8),
  9041. OnNext(470, 9),
  9042. OnNext(550, 10),
  9043. OnCompleted<int>(590)
  9044. );
  9045. var ys = scheduler.CreateHotObservable(
  9046. OnNext(255, true),
  9047. OnNext(330, true),
  9048. OnNext(350, true),
  9049. OnError<bool>(400, ex)
  9050. );
  9051. var res = scheduler.Start(() =>
  9052. xs.Window(ys).Select((w, i) => w.Select(x => i.ToString() + " " + x.ToString())).Merge()
  9053. );
  9054. res.Messages.AssertEqual(
  9055. OnNext(250, "0 3"),
  9056. OnNext(260, "1 4"),
  9057. OnNext(310, "1 5"),
  9058. OnNext(340, "2 6"),
  9059. OnError<string>(400, ex)
  9060. );
  9061. xs.Subscriptions.AssertEqual(
  9062. Subscribe(200, 400)
  9063. );
  9064. ys.Subscriptions.AssertEqual(
  9065. Subscribe(200, 400)
  9066. );
  9067. }
  9068. #endregion
  9069. #region + WithLatestFrom +
  9070. [Fact]
  9071. public void WithLatestFrom_ArgumentChecking()
  9072. {
  9073. var someObservable = DummyObservable<int>.Instance;
  9074. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.WithLatestFrom<int, int, int>(someObservable, someObservable, null));
  9075. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.WithLatestFrom<int, int, int>(null, someObservable, (_, __) => 0));
  9076. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.WithLatestFrom<int, int, int>(someObservable, default(IObservable<int>), (_, __) => 0));
  9077. }
  9078. [Fact]
  9079. public void WithLatestFrom_Simple1()
  9080. {
  9081. var scheduler = new TestScheduler();
  9082. var xs = scheduler.CreateHotObservable(
  9083. OnNext(90, 1),
  9084. OnNext(180, 2),
  9085. OnNext(250, 3),
  9086. OnNext(260, 4),
  9087. OnNext(310, 5),
  9088. OnNext(340, 6),
  9089. OnNext(410, 7),
  9090. OnNext(420, 8),
  9091. OnNext(470, 9),
  9092. OnNext(550, 10),
  9093. OnCompleted<int>(590)
  9094. );
  9095. var ys = scheduler.CreateHotObservable(
  9096. OnNext(255, "bar"),
  9097. OnNext(330, "foo"),
  9098. OnNext(350, "qux"),
  9099. OnCompleted<string>(400)
  9100. );
  9101. var res = scheduler.Start(() =>
  9102. xs.WithLatestFrom(ys, (x, y) => x + y)
  9103. );
  9104. res.Messages.AssertEqual(
  9105. OnNext(260, "4bar"),
  9106. OnNext(310, "5bar"),
  9107. OnNext(340, "6foo"),
  9108. OnNext(410, "7qux"),
  9109. OnNext(420, "8qux"),
  9110. OnNext(470, "9qux"),
  9111. OnNext(550, "10qux"),
  9112. OnCompleted<string>(590)
  9113. );
  9114. xs.Subscriptions.AssertEqual(
  9115. Subscribe(200, 590)
  9116. );
  9117. ys.Subscriptions.AssertEqual(
  9118. Subscribe(200, 400)
  9119. );
  9120. }
  9121. [Fact]
  9122. public void WithLatestFrom_Simple2()
  9123. {
  9124. var scheduler = new TestScheduler();
  9125. var xs = scheduler.CreateHotObservable(
  9126. OnNext(90, 1),
  9127. OnNext(180, 2),
  9128. OnNext(250, 3),
  9129. OnNext(260, 4),
  9130. OnNext(310, 5),
  9131. OnNext(340, 6),
  9132. OnCompleted<int>(390)
  9133. );
  9134. var ys = scheduler.CreateHotObservable(
  9135. OnNext(255, "bar"),
  9136. OnNext(330, "foo"),
  9137. OnNext(350, "qux"),
  9138. OnNext(370, "baz"),
  9139. OnCompleted<string>(400)
  9140. );
  9141. var res = scheduler.Start(() =>
  9142. xs.WithLatestFrom(ys, (x, y) => x + y)
  9143. );
  9144. res.Messages.AssertEqual(
  9145. OnNext(260, "4bar"),
  9146. OnNext(310, "5bar"),
  9147. OnNext(340, "6foo"),
  9148. OnCompleted<string>(390)
  9149. );
  9150. xs.Subscriptions.AssertEqual(
  9151. Subscribe(200, 390)
  9152. );
  9153. ys.Subscriptions.AssertEqual(
  9154. Subscribe(200, 390)
  9155. );
  9156. }
  9157. [Fact]
  9158. public void WithLatestFrom_Simple3()
  9159. {
  9160. var scheduler = new TestScheduler();
  9161. var xs = scheduler.CreateHotObservable(
  9162. OnNext(90, 1),
  9163. OnNext(180, 2),
  9164. OnNext(250, 3),
  9165. OnNext(260, 4),
  9166. OnNext(310, 5),
  9167. OnNext(340, 6),
  9168. OnCompleted<int>(390)
  9169. );
  9170. var ys = scheduler.CreateHotObservable(
  9171. OnNext(245, "bar"),
  9172. OnNext(330, "foo"),
  9173. OnNext(350, "qux"),
  9174. OnNext(370, "baz"),
  9175. OnCompleted<string>(400)
  9176. );
  9177. var res = scheduler.Start(() =>
  9178. xs.WithLatestFrom(ys, (x, y) => x + y)
  9179. );
  9180. res.Messages.AssertEqual(
  9181. OnNext(250, "3bar"),
  9182. OnNext(260, "4bar"),
  9183. OnNext(310, "5bar"),
  9184. OnNext(340, "6foo"),
  9185. OnCompleted<string>(390)
  9186. );
  9187. xs.Subscriptions.AssertEqual(
  9188. Subscribe(200, 390)
  9189. );
  9190. ys.Subscriptions.AssertEqual(
  9191. Subscribe(200, 390)
  9192. );
  9193. }
  9194. [Fact]
  9195. public void WithLatestFrom_Error1()
  9196. {
  9197. var scheduler = new TestScheduler();
  9198. var ex = new Exception();
  9199. var xs = scheduler.CreateHotObservable(
  9200. OnNext(90, 1),
  9201. OnNext(180, 2),
  9202. OnNext(250, 3),
  9203. OnNext(260, 4),
  9204. OnNext(310, 5),
  9205. OnNext(340, 6),
  9206. OnNext(410, 7),
  9207. OnNext(420, 8),
  9208. OnNext(470, 9),
  9209. OnNext(550, 10),
  9210. OnError<int>(590, ex)
  9211. );
  9212. var ys = scheduler.CreateHotObservable(
  9213. OnNext(255, "bar"),
  9214. OnNext(330, "foo"),
  9215. OnNext(350, "qux"),
  9216. OnCompleted<string>(400)
  9217. );
  9218. var res = scheduler.Start(() =>
  9219. xs.WithLatestFrom(ys, (x, y) => x + y)
  9220. );
  9221. res.Messages.AssertEqual(
  9222. OnNext(260, "4bar"),
  9223. OnNext(310, "5bar"),
  9224. OnNext(340, "6foo"),
  9225. OnNext(410, "7qux"),
  9226. OnNext(420, "8qux"),
  9227. OnNext(470, "9qux"),
  9228. OnNext(550, "10qux"),
  9229. OnError<string>(590, ex)
  9230. );
  9231. xs.Subscriptions.AssertEqual(
  9232. Subscribe(200, 590)
  9233. );
  9234. ys.Subscriptions.AssertEqual(
  9235. Subscribe(200, 400)
  9236. );
  9237. }
  9238. [Fact]
  9239. public void WithLatestFrom_Error2()
  9240. {
  9241. var scheduler = new TestScheduler();
  9242. var ex = new Exception();
  9243. var xs = scheduler.CreateHotObservable(
  9244. OnNext(90, 1),
  9245. OnNext(180, 2),
  9246. OnNext(250, 3),
  9247. OnNext(260, 4),
  9248. OnNext(310, 5),
  9249. OnNext(340, 6),
  9250. OnCompleted<int>(390)
  9251. );
  9252. var ys = scheduler.CreateHotObservable(
  9253. OnNext(255, "bar"),
  9254. OnNext(330, "foo"),
  9255. OnNext(350, "qux"),
  9256. OnError<string>(370, ex)
  9257. );
  9258. var res = scheduler.Start(() =>
  9259. xs.WithLatestFrom(ys, (x, y) => x + y)
  9260. );
  9261. res.Messages.AssertEqual(
  9262. OnNext(260, "4bar"),
  9263. OnNext(310, "5bar"),
  9264. OnNext(340, "6foo"),
  9265. OnError<string>(370, ex)
  9266. );
  9267. xs.Subscriptions.AssertEqual(
  9268. Subscribe(200, 370)
  9269. );
  9270. ys.Subscriptions.AssertEqual(
  9271. Subscribe(200, 370)
  9272. );
  9273. }
  9274. [Fact]
  9275. public void WithLatestFrom_Error3()
  9276. {
  9277. var scheduler = new TestScheduler();
  9278. var ex = new Exception();
  9279. var xs = scheduler.CreateHotObservable(
  9280. OnNext(90, 1),
  9281. OnNext(180, 2),
  9282. OnNext(250, 3),
  9283. OnNext(260, 4),
  9284. OnNext(310, 5),
  9285. OnNext(340, 6),
  9286. OnCompleted<int>(390)
  9287. );
  9288. var ys = scheduler.CreateHotObservable(
  9289. OnNext(255, "bar"),
  9290. OnNext(330, "foo"),
  9291. OnNext(350, "qux"),
  9292. OnCompleted<string>(400)
  9293. );
  9294. var res = scheduler.Start(() =>
  9295. xs.WithLatestFrom(ys, (x, y) =>
  9296. {
  9297. if (x == 5)
  9298. throw ex;
  9299. return x + y;
  9300. })
  9301. );
  9302. res.Messages.AssertEqual(
  9303. OnNext(260, "4bar"),
  9304. OnError<string>(310, ex)
  9305. );
  9306. xs.Subscriptions.AssertEqual(
  9307. Subscribe(200, 310)
  9308. );
  9309. ys.Subscriptions.AssertEqual(
  9310. Subscribe(200, 310)
  9311. );
  9312. }
  9313. #endregion
  9314. #region + Zip +
  9315. #region ArgumentChecking
  9316. [Fact]
  9317. public void Zip_ArgumentChecking()
  9318. {
  9319. var someObservable = DummyObservable<int>.Instance;
  9320. var someEnumerable = DummyEnumerable<int>.Instance;
  9321. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip<int, int, int>(someObservable, someObservable, null));
  9322. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip<int, int, int>(null, someObservable, (_, __) => 0));
  9323. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip<int, int, int>(someObservable, default(IObservable<int>), (_, __) => 0));
  9324. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip<int, int, int>(someObservable, someEnumerable, null));
  9325. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip<int, int, int>(null, someEnumerable, (_, __) => 0));
  9326. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip<int, int, int>(someObservable, default(IEnumerable<int>), (_, __) => 0));
  9327. }
  9328. [Fact]
  9329. public void Zip_ArgumentCheckingHighArity()
  9330. {
  9331. var xs = DummyObservable<int>.Instance;
  9332. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, (_0, _1) => _0 + _1));
  9333. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), (_0, _1) => _0 + _1));
  9334. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(Func<int, int, int>)));
  9335. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, (_0, _1, _2) => _0 + _1 + _2));
  9336. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, (_0, _1, _2) => _0 + _1 + _2));
  9337. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), (_0, _1, _2) => _0 + _1 + _2));
  9338. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(Func<int, int, int, int>)));
  9339. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3) => _0 + _1 + _2 + _3));
  9340. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3) => _0 + _1 + _2 + _3));
  9341. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3) => _0 + _1 + _2 + _3));
  9342. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3) => _0 + _1 + _2 + _3));
  9343. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(Func<int, int, int, int, int>)));
  9344. #if !NO_LARGEARITY
  9345. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  9346. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  9347. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  9348. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  9349. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4));
  9350. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int>)));
  9351. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  9352. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  9353. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  9354. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  9355. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  9356. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5));
  9357. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int>)));
  9358. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  9359. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  9360. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  9361. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  9362. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  9363. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  9364. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6));
  9365. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int>)));
  9366. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  9367. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  9368. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  9369. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  9370. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  9371. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  9372. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  9373. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7));
  9374. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int>)));
  9375. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  9376. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  9377. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  9378. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  9379. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  9380. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  9381. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  9382. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  9383. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8));
  9384. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int>)));
  9385. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9386. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9387. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9388. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9389. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9390. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9391. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9392. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9393. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9394. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9));
  9395. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int>)));
  9396. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9397. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9398. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9399. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9400. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9401. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9402. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9403. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9404. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9405. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9406. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10));
  9407. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int>)));
  9408. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9409. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9410. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9411. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9412. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9413. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9414. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9415. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9416. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9417. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9418. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9419. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11));
  9420. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  9421. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9422. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9423. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9424. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9425. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9426. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9427. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9428. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9429. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9430. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9431. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9432. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9433. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12));
  9434. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  9435. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9436. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9437. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9438. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9439. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9440. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9441. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9442. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9443. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9444. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9445. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9446. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9447. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9448. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13));
  9449. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  9450. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9451. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9452. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9453. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9454. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9455. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9456. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9457. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9458. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9459. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9460. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9461. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9462. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9463. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9464. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14));
  9465. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  9466. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9467. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9468. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9469. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9470. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9471. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9472. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9473. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9474. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9475. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9476. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9477. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9478. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9479. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9480. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), xs, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9481. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(IObservable<int>), (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15));
  9482. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, xs, default(Func<int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int>)));
  9483. #endif
  9484. }
  9485. #endregion
  9486. #region Never/Never
  9487. [Fact]
  9488. public void Zip_Never2()
  9489. {
  9490. var scheduler = new TestScheduler();
  9491. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9492. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9493. var res = scheduler.Start(() =>
  9494. Observable.Zip(e0, e1, (_0, _1) => 42)
  9495. );
  9496. res.Messages.AssertEqual(
  9497. );
  9498. foreach (var e in new[] { e0, e1 })
  9499. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9500. }
  9501. [Fact]
  9502. public void Zip_Never3()
  9503. {
  9504. var scheduler = new TestScheduler();
  9505. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9506. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9507. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9508. var res = scheduler.Start(() =>
  9509. Observable.Zip(e0, e1, e2, (_0, _1, _2) => 42)
  9510. );
  9511. res.Messages.AssertEqual(
  9512. );
  9513. foreach (var e in new[] { e0, e1, e2 })
  9514. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9515. }
  9516. [Fact]
  9517. public void Zip_Never4()
  9518. {
  9519. var scheduler = new TestScheduler();
  9520. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9521. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9522. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9523. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9524. var res = scheduler.Start(() =>
  9525. Observable.Zip(e0, e1, e2, e3, (_0, _1, _2, _3) => 42)
  9526. );
  9527. res.Messages.AssertEqual(
  9528. );
  9529. foreach (var e in new[] { e0, e1, e2, e3 })
  9530. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9531. }
  9532. #if !NO_LARGEARITY
  9533. [Fact]
  9534. public void Zip_Never5()
  9535. {
  9536. var scheduler = new TestScheduler();
  9537. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9538. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9539. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9540. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9541. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9542. var res = scheduler.Start(() =>
  9543. Observable.Zip(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => 42)
  9544. );
  9545. res.Messages.AssertEqual(
  9546. );
  9547. foreach (var e in new[] { e0, e1, e2, e3, e4 })
  9548. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9549. }
  9550. [Fact]
  9551. public void Zip_Never6()
  9552. {
  9553. var scheduler = new TestScheduler();
  9554. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9555. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9556. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9557. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9558. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9559. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9560. var res = scheduler.Start(() =>
  9561. Observable.Zip(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => 42)
  9562. );
  9563. res.Messages.AssertEqual(
  9564. );
  9565. foreach (var e in new[] { e0, e1, e2, e3, e4, e5 })
  9566. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9567. }
  9568. [Fact]
  9569. public void Zip_Never7()
  9570. {
  9571. var scheduler = new TestScheduler();
  9572. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9573. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9574. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9575. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9576. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9577. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9578. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9579. var res = scheduler.Start(() =>
  9580. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => 42)
  9581. );
  9582. res.Messages.AssertEqual(
  9583. );
  9584. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6 })
  9585. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9586. }
  9587. [Fact]
  9588. public void Zip_Never8()
  9589. {
  9590. var scheduler = new TestScheduler();
  9591. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9592. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9593. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9594. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9595. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9596. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9597. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9598. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9599. var res = scheduler.Start(() =>
  9600. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => 42)
  9601. );
  9602. res.Messages.AssertEqual(
  9603. );
  9604. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7 })
  9605. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9606. }
  9607. [Fact]
  9608. public void Zip_Never9()
  9609. {
  9610. var scheduler = new TestScheduler();
  9611. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9612. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9613. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9614. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9615. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9616. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9617. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9618. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9619. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9620. var res = scheduler.Start(() =>
  9621. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => 42)
  9622. );
  9623. res.Messages.AssertEqual(
  9624. );
  9625. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 })
  9626. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9627. }
  9628. [Fact]
  9629. public void Zip_Never10()
  9630. {
  9631. var scheduler = new TestScheduler();
  9632. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9633. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9634. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9635. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9636. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9637. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9638. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9639. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9640. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9641. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9642. var res = scheduler.Start(() =>
  9643. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => 42)
  9644. );
  9645. res.Messages.AssertEqual(
  9646. );
  9647. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 })
  9648. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9649. }
  9650. [Fact]
  9651. public void Zip_Never11()
  9652. {
  9653. var scheduler = new TestScheduler();
  9654. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9655. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9656. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9657. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9658. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9659. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9660. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9661. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9662. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9663. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9664. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9665. var res = scheduler.Start(() =>
  9666. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => 42)
  9667. );
  9668. res.Messages.AssertEqual(
  9669. );
  9670. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 })
  9671. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9672. }
  9673. [Fact]
  9674. public void Zip_Never12()
  9675. {
  9676. var scheduler = new TestScheduler();
  9677. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9678. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9679. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9680. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9681. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9682. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9683. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9684. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9685. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9686. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9687. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9688. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9689. var res = scheduler.Start(() =>
  9690. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => 42)
  9691. );
  9692. res.Messages.AssertEqual(
  9693. );
  9694. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 })
  9695. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9696. }
  9697. [Fact]
  9698. public void Zip_Never13()
  9699. {
  9700. var scheduler = new TestScheduler();
  9701. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9702. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9703. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9704. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9705. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9706. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9707. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9708. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9709. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9710. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9711. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9712. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9713. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9714. var res = scheduler.Start(() =>
  9715. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => 42)
  9716. );
  9717. res.Messages.AssertEqual(
  9718. );
  9719. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 })
  9720. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9721. }
  9722. [Fact]
  9723. public void Zip_Never14()
  9724. {
  9725. var scheduler = new TestScheduler();
  9726. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9727. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9728. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9729. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9730. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9731. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9732. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9733. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9734. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9735. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9736. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9737. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9738. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9739. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9740. var res = scheduler.Start(
  9741. () => Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => 42)
  9742. );
  9743. res.Messages.AssertEqual(
  9744. );
  9745. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 })
  9746. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9747. }
  9748. [Fact]
  9749. public void Zip_Never15()
  9750. {
  9751. var scheduler = new TestScheduler();
  9752. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9753. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9754. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9755. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9756. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9757. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9758. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9759. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9760. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9761. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9762. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9763. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9764. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9765. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9766. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9767. var res = scheduler.Start(() =>
  9768. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => 42)
  9769. );
  9770. res.Messages.AssertEqual(
  9771. );
  9772. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 })
  9773. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9774. }
  9775. [Fact]
  9776. public void Zip_Never16()
  9777. {
  9778. var scheduler = new TestScheduler();
  9779. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9780. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9781. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9782. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9783. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9784. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9785. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9786. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9787. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9788. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9789. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9790. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9791. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9792. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9793. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9794. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1) });
  9795. var res = scheduler.Start(() =>
  9796. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => 42)
  9797. );
  9798. res.Messages.AssertEqual(
  9799. );
  9800. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 })
  9801. e.Subscriptions.AssertEqual(Subscribe(200, 1000));
  9802. }
  9803. #endif
  9804. #endregion
  9805. #region Never/Empty
  9806. [Fact]
  9807. public void Zip_NeverEmpty()
  9808. {
  9809. var scheduler = new TestScheduler();
  9810. var n = scheduler.CreateHotObservable(
  9811. OnNext(150, 1)
  9812. );
  9813. var e = scheduler.CreateHotObservable(
  9814. OnNext(150, 1),
  9815. OnCompleted<int>(210)
  9816. );
  9817. var res = scheduler.Start(() =>
  9818. n.Zip(e, (x, y) => x + y)
  9819. );
  9820. res.Messages.AssertEqual(
  9821. );
  9822. n.Subscriptions.AssertEqual(
  9823. Subscribe(200, 1000)
  9824. );
  9825. e.Subscriptions.AssertEqual(
  9826. Subscribe(200, 210)
  9827. );
  9828. }
  9829. [Fact]
  9830. public void Zip_EmptyNever()
  9831. {
  9832. var scheduler = new TestScheduler();
  9833. var n = scheduler.CreateHotObservable(
  9834. OnNext(150, 1)
  9835. );
  9836. var e = scheduler.CreateHotObservable(
  9837. OnNext(150, 1),
  9838. OnCompleted<int>(210)
  9839. );
  9840. var res = scheduler.Start(() =>
  9841. e.Zip(n, (x, y) => x + y)
  9842. );
  9843. res.Messages.AssertEqual(
  9844. );
  9845. n.Subscriptions.AssertEqual(
  9846. Subscribe(200, 1000)
  9847. );
  9848. e.Subscriptions.AssertEqual(
  9849. Subscribe(200, 210)
  9850. );
  9851. }
  9852. #endregion
  9853. #region Empty/Empty
  9854. [Fact]
  9855. public void Zip_EmptyEmpty()
  9856. {
  9857. var scheduler = new TestScheduler();
  9858. var e1 = scheduler.CreateHotObservable(
  9859. OnNext(150, 1),
  9860. OnCompleted<int>(210)
  9861. );
  9862. var e2 = scheduler.CreateHotObservable(
  9863. OnNext(150, 1),
  9864. OnCompleted<int>(210)
  9865. );
  9866. var res = scheduler.Start(() =>
  9867. e1.Zip(e2, (x, y) => x + y)
  9868. );
  9869. res.Messages.AssertEqual(
  9870. OnCompleted<int>(210)
  9871. );
  9872. e1.Subscriptions.AssertEqual(
  9873. Subscribe(200, 210)
  9874. );
  9875. e2.Subscriptions.AssertEqual(
  9876. Subscribe(200, 210)
  9877. );
  9878. }
  9879. [Fact]
  9880. public void Zip_Empty2()
  9881. {
  9882. var scheduler = new TestScheduler();
  9883. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  9884. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  9885. var res = scheduler.Start(() =>
  9886. Observable.Zip(e0, e1, (_0, _1) => 42)
  9887. );
  9888. res.Messages.AssertEqual(
  9889. OnCompleted<int>(220)
  9890. );
  9891. var i = 0;
  9892. foreach (var e in new[] { e0, e1 })
  9893. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  9894. }
  9895. [Fact]
  9896. public void Zip_Empty3()
  9897. {
  9898. var scheduler = new TestScheduler();
  9899. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  9900. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  9901. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  9902. var res = scheduler.Start(() =>
  9903. Observable.Zip(e0, e1, e2, (_0, _1, _2) => 42)
  9904. );
  9905. res.Messages.AssertEqual(
  9906. OnCompleted<int>(230)
  9907. );
  9908. var i = 0;
  9909. foreach (var e in new[] { e0, e1, e2 })
  9910. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  9911. }
  9912. [Fact]
  9913. public void Zip_Empty4()
  9914. {
  9915. var scheduler = new TestScheduler();
  9916. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  9917. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  9918. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  9919. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  9920. var res = scheduler.Start(() =>
  9921. Observable.Zip(e0, e1, e2, e3, (_0, _1, _2, _3) => 42)
  9922. );
  9923. res.Messages.AssertEqual(
  9924. OnCompleted<int>(240)
  9925. );
  9926. var i = 0;
  9927. foreach (var e in new[] { e0, e1, e2, e3 })
  9928. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  9929. }
  9930. #if !NO_LARGEARITY
  9931. [Fact]
  9932. public void Zip_Empty5()
  9933. {
  9934. var scheduler = new TestScheduler();
  9935. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  9936. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  9937. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  9938. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  9939. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  9940. var res = scheduler.Start(() =>
  9941. Observable.Zip(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => 42)
  9942. );
  9943. res.Messages.AssertEqual(
  9944. OnCompleted<int>(250)
  9945. );
  9946. var i = 0;
  9947. foreach (var e in new[] { e0, e1, e2, e3, e4 })
  9948. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  9949. }
  9950. [Fact]
  9951. public void Zip_Empty6()
  9952. {
  9953. var scheduler = new TestScheduler();
  9954. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  9955. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  9956. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  9957. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  9958. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  9959. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  9960. var res = scheduler.Start(() =>
  9961. Observable.Zip(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => 42)
  9962. );
  9963. res.Messages.AssertEqual(
  9964. OnCompleted<int>(260)
  9965. );
  9966. var i = 0;
  9967. foreach (var e in new[] { e0, e1, e2, e3, e4, e5 })
  9968. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  9969. }
  9970. [Fact]
  9971. public void Zip_Empty7()
  9972. {
  9973. var scheduler = new TestScheduler();
  9974. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  9975. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  9976. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  9977. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  9978. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  9979. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  9980. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  9981. var res = scheduler.Start(() =>
  9982. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => 42)
  9983. );
  9984. res.Messages.AssertEqual(
  9985. OnCompleted<int>(270)
  9986. );
  9987. var i = 0;
  9988. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6 })
  9989. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  9990. }
  9991. [Fact]
  9992. public void Zip_Empty8()
  9993. {
  9994. var scheduler = new TestScheduler();
  9995. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  9996. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  9997. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  9998. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  9999. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  10000. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  10001. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  10002. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  10003. var res = scheduler.Start(() =>
  10004. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => 42)
  10005. );
  10006. res.Messages.AssertEqual(
  10007. OnCompleted<int>(280)
  10008. );
  10009. var i = 0;
  10010. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7 })
  10011. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  10012. }
  10013. [Fact]
  10014. public void Zip_Empty9()
  10015. {
  10016. var scheduler = new TestScheduler();
  10017. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  10018. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  10019. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  10020. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  10021. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  10022. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  10023. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  10024. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  10025. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  10026. var res = scheduler.Start(() =>
  10027. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => 42)
  10028. );
  10029. res.Messages.AssertEqual(
  10030. OnCompleted<int>(290)
  10031. );
  10032. var i = 0;
  10033. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 })
  10034. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  10035. }
  10036. [Fact]
  10037. public void Zip_Empty10()
  10038. {
  10039. var scheduler = new TestScheduler();
  10040. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  10041. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  10042. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  10043. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  10044. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  10045. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  10046. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  10047. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  10048. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  10049. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  10050. var res = scheduler.Start(() =>
  10051. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => 42)
  10052. );
  10053. res.Messages.AssertEqual(
  10054. OnCompleted<int>(300)
  10055. );
  10056. var i = 0;
  10057. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 })
  10058. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  10059. }
  10060. [Fact]
  10061. public void Zip_Empty11()
  10062. {
  10063. var scheduler = new TestScheduler();
  10064. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  10065. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  10066. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  10067. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  10068. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  10069. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  10070. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  10071. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  10072. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  10073. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  10074. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  10075. var res = scheduler.Start(() =>
  10076. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => 42)
  10077. );
  10078. res.Messages.AssertEqual(
  10079. OnCompleted<int>(310)
  10080. );
  10081. var i = 0;
  10082. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 })
  10083. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  10084. }
  10085. [Fact]
  10086. public void Zip_Empty12()
  10087. {
  10088. var scheduler = new TestScheduler();
  10089. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  10090. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  10091. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  10092. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  10093. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  10094. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  10095. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  10096. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  10097. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  10098. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  10099. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  10100. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  10101. var res = scheduler.Start(() =>
  10102. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => 42)
  10103. );
  10104. res.Messages.AssertEqual(
  10105. OnCompleted<int>(320)
  10106. );
  10107. var i = 0;
  10108. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 })
  10109. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  10110. }
  10111. [Fact]
  10112. public void Zip_Empty13()
  10113. {
  10114. var scheduler = new TestScheduler();
  10115. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  10116. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  10117. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  10118. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  10119. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  10120. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  10121. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  10122. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  10123. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  10124. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  10125. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  10126. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  10127. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  10128. var res = scheduler.Start(() =>
  10129. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => 42)
  10130. );
  10131. res.Messages.AssertEqual(
  10132. OnCompleted<int>(330)
  10133. );
  10134. var i = 0;
  10135. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 })
  10136. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  10137. }
  10138. [Fact]
  10139. public void Zip_Empty14()
  10140. {
  10141. var scheduler = new TestScheduler();
  10142. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  10143. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  10144. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  10145. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  10146. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  10147. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  10148. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  10149. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  10150. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  10151. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  10152. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  10153. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  10154. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  10155. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  10156. var res = scheduler.Start(() =>
  10157. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => 42)
  10158. );
  10159. res.Messages.AssertEqual(
  10160. OnCompleted<int>(340)
  10161. );
  10162. var i = 0;
  10163. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 })
  10164. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  10165. }
  10166. [Fact]
  10167. public void Zip_Empty15()
  10168. {
  10169. var scheduler = new TestScheduler();
  10170. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  10171. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  10172. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  10173. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  10174. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  10175. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  10176. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  10177. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  10178. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  10179. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  10180. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  10181. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  10182. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  10183. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  10184. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(350) });
  10185. var res = scheduler.Start(() =>
  10186. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => 42)
  10187. );
  10188. res.Messages.AssertEqual(
  10189. OnCompleted<int>(350)
  10190. );
  10191. var i = 0;
  10192. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 })
  10193. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  10194. }
  10195. [Fact]
  10196. public void Zip_Empty16()
  10197. {
  10198. var scheduler = new TestScheduler();
  10199. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(210) });
  10200. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(220) });
  10201. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(230) });
  10202. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(240) });
  10203. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(250) });
  10204. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(260) });
  10205. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(270) });
  10206. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(280) });
  10207. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(290) });
  10208. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(300) });
  10209. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(310) });
  10210. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(320) });
  10211. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(330) });
  10212. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(340) });
  10213. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(350) });
  10214. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnCompleted<int>(360) });
  10215. var res = scheduler.Start(() =>
  10216. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => 42)
  10217. );
  10218. res.Messages.AssertEqual(
  10219. OnCompleted<int>(360)
  10220. );
  10221. var i = 0;
  10222. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 })
  10223. e.Subscriptions.AssertEqual(Subscribe(200, 200 + (++i * 10)));
  10224. }
  10225. #endif
  10226. #endregion
  10227. #region Empty/Some
  10228. [Fact]
  10229. public void Zip_EmptyNonEmpty()
  10230. {
  10231. var scheduler = new TestScheduler();
  10232. var e = scheduler.CreateHotObservable(
  10233. OnNext(150, 1),
  10234. OnCompleted<int>(210)
  10235. );
  10236. var o = scheduler.CreateHotObservable(
  10237. OnNext(150, 1),
  10238. OnNext(215, 2), // Intended behavior - will only know here there was no error and we can complete gracefully
  10239. OnCompleted<int>(220)
  10240. );
  10241. var res = scheduler.Start(() =>
  10242. e.Zip(o, (x, y) => x + y)
  10243. );
  10244. res.Messages.AssertEqual(
  10245. OnCompleted<int>(215)
  10246. );
  10247. e.Subscriptions.AssertEqual(
  10248. Subscribe(200, 210)
  10249. );
  10250. o.Subscriptions.AssertEqual(
  10251. Subscribe(200, 215)
  10252. );
  10253. }
  10254. [Fact]
  10255. public void Zip_NonEmptyEmpty()
  10256. {
  10257. var scheduler = new TestScheduler();
  10258. var e = scheduler.CreateHotObservable(
  10259. OnNext(150, 1),
  10260. OnCompleted<int>(210)
  10261. );
  10262. var o = scheduler.CreateHotObservable(
  10263. OnNext(150, 1),
  10264. OnNext(215, 2),
  10265. OnCompleted<int>(220)
  10266. );
  10267. var res = scheduler.Start(() =>
  10268. o.Zip(e, (x, y) => x + y)
  10269. );
  10270. res.Messages.AssertEqual(
  10271. OnCompleted<int>(215)
  10272. );
  10273. e.Subscriptions.AssertEqual(
  10274. Subscribe(200, 210)
  10275. );
  10276. o.Subscriptions.AssertEqual(
  10277. Subscribe(200, 215)
  10278. );
  10279. }
  10280. #endregion
  10281. #region Never/Some
  10282. [Fact]
  10283. public void Zip_NeverNonEmpty()
  10284. {
  10285. var scheduler = new TestScheduler();
  10286. var o = scheduler.CreateHotObservable(
  10287. OnNext(150, 1),
  10288. OnNext(215, 2),
  10289. OnCompleted<int>(220)
  10290. );
  10291. var n = scheduler.CreateHotObservable(
  10292. OnNext(150, 1)
  10293. );
  10294. var res = scheduler.Start(() =>
  10295. n.Zip(o, (x, y) => x + y)
  10296. );
  10297. res.Messages.AssertEqual(
  10298. );
  10299. o.Subscriptions.AssertEqual(
  10300. Subscribe(200, 220)
  10301. );
  10302. n.Subscriptions.AssertEqual(
  10303. Subscribe(200, 1000)
  10304. );
  10305. }
  10306. [Fact]
  10307. public void Zip_NonEmptyNever()
  10308. {
  10309. var scheduler = new TestScheduler();
  10310. var o = scheduler.CreateHotObservable(
  10311. OnNext(150, 1),
  10312. OnNext(215, 2),
  10313. OnCompleted<int>(220)
  10314. );
  10315. var n = scheduler.CreateHotObservable(
  10316. OnNext(150, 1)
  10317. );
  10318. var res = scheduler.Start(() =>
  10319. o.Zip(n, (x, y) => x + y)
  10320. );
  10321. res.Messages.AssertEqual(
  10322. );
  10323. o.Subscriptions.AssertEqual(
  10324. Subscribe(200, 220)
  10325. );
  10326. n.Subscriptions.AssertEqual(
  10327. Subscribe(200, 1000)
  10328. );
  10329. }
  10330. #endregion
  10331. #region Some/Some
  10332. [Fact]
  10333. public void Zip_NonEmptyNonEmpty()
  10334. {
  10335. var scheduler = new TestScheduler();
  10336. var o1 = scheduler.CreateHotObservable(
  10337. OnNext(150, 1),
  10338. OnNext(215, 2),
  10339. OnCompleted<int>(230)
  10340. );
  10341. var o2 = scheduler.CreateHotObservable(
  10342. OnNext(150, 1),
  10343. OnNext(220, 3),
  10344. OnCompleted<int>(240) // Intended behavior - will only know here there was no error and we can complete gracefully
  10345. );
  10346. var res = scheduler.Start(() =>
  10347. o1.Zip(o2, (x, y) => x + y)
  10348. );
  10349. res.Messages.AssertEqual(
  10350. OnNext(220, 2 + 3),
  10351. OnCompleted<int>(240)
  10352. );
  10353. o1.Subscriptions.AssertEqual(
  10354. Subscribe(200, 230)
  10355. );
  10356. o2.Subscriptions.AssertEqual(
  10357. Subscribe(200, 240)
  10358. );
  10359. }
  10360. #endregion
  10361. #region Empty/Error
  10362. [Fact]
  10363. public void Zip_EmptyError()
  10364. {
  10365. var scheduler = new TestScheduler();
  10366. var ex = new Exception();
  10367. var e = scheduler.CreateHotObservable(
  10368. OnNext(150, 1),
  10369. OnCompleted<int>(230)
  10370. );
  10371. var f = scheduler.CreateHotObservable(
  10372. OnNext(150, 1),
  10373. OnError<int>(220, ex)
  10374. );
  10375. var res = scheduler.Start(() =>
  10376. e.Zip(f, (x, y) => x + y)
  10377. );
  10378. res.Messages.AssertEqual(
  10379. OnError<int>(220, ex)
  10380. );
  10381. e.Subscriptions.AssertEqual(
  10382. Subscribe(200, 220)
  10383. );
  10384. f.Subscriptions.AssertEqual(
  10385. Subscribe(200, 220)
  10386. );
  10387. }
  10388. [Fact]
  10389. public void Zip_ErrorEmpty()
  10390. {
  10391. var scheduler = new TestScheduler();
  10392. var ex = new Exception();
  10393. var e = scheduler.CreateHotObservable(
  10394. OnNext(150, 1),
  10395. OnCompleted<int>(230)
  10396. );
  10397. var f = scheduler.CreateHotObservable(
  10398. OnNext(150, 1),
  10399. OnError<int>(220, ex)
  10400. );
  10401. var res = scheduler.Start(() =>
  10402. f.Zip(e, (x, y) => x + y)
  10403. );
  10404. res.Messages.AssertEqual(
  10405. OnError<int>(220, ex)
  10406. );
  10407. e.Subscriptions.AssertEqual(
  10408. Subscribe(200, 220)
  10409. );
  10410. f.Subscriptions.AssertEqual(
  10411. Subscribe(200, 220)
  10412. );
  10413. }
  10414. #endregion
  10415. #region Never/Error
  10416. [Fact]
  10417. public void Zip_NeverError()
  10418. {
  10419. var scheduler = new TestScheduler();
  10420. var ex = new Exception();
  10421. var n = scheduler.CreateHotObservable(
  10422. OnNext(150, 1)
  10423. );
  10424. var f = scheduler.CreateHotObservable(
  10425. OnNext(150, 1),
  10426. OnError<int>(220, ex)
  10427. );
  10428. var res = scheduler.Start(() =>
  10429. n.Zip(f, (x, y) => x + y)
  10430. );
  10431. res.Messages.AssertEqual(
  10432. OnError<int>(220, ex)
  10433. );
  10434. n.Subscriptions.AssertEqual(
  10435. Subscribe(200, 220)
  10436. );
  10437. f.Subscriptions.AssertEqual(
  10438. Subscribe(200, 220)
  10439. );
  10440. }
  10441. [Fact]
  10442. public void Zip_ErrorNever()
  10443. {
  10444. var scheduler = new TestScheduler();
  10445. var ex = new Exception();
  10446. var n = scheduler.CreateHotObservable(
  10447. OnNext(150, 1)
  10448. );
  10449. var f = scheduler.CreateHotObservable(
  10450. OnNext(150, 1),
  10451. OnError<int>(220, ex)
  10452. );
  10453. var res = scheduler.Start(() =>
  10454. f.Zip(n, (x, y) => x + y)
  10455. );
  10456. res.Messages.AssertEqual(
  10457. OnError<int>(220, ex)
  10458. );
  10459. n.Subscriptions.AssertEqual(
  10460. Subscribe(200, 220)
  10461. );
  10462. f.Subscriptions.AssertEqual(
  10463. Subscribe(200, 220)
  10464. );
  10465. }
  10466. #endregion
  10467. #region Error/Error
  10468. [Fact]
  10469. public void Zip_ErrorError()
  10470. {
  10471. var scheduler = new TestScheduler();
  10472. var ex1 = new Exception();
  10473. var ex2 = new Exception();
  10474. var f1 = scheduler.CreateHotObservable(
  10475. OnNext(150, 1),
  10476. OnError<int>(230, ex1)
  10477. );
  10478. var f2 = scheduler.CreateHotObservable(
  10479. OnNext(150, 1),
  10480. OnError<int>(220, ex2)
  10481. );
  10482. var res = scheduler.Start(() =>
  10483. f1.Zip(f2, (x, y) => x + y)
  10484. );
  10485. res.Messages.AssertEqual(
  10486. OnError<int>(220, ex2)
  10487. );
  10488. f1.Subscriptions.AssertEqual(
  10489. Subscribe(200, 220)
  10490. );
  10491. f2.Subscriptions.AssertEqual(
  10492. Subscribe(200, 220)
  10493. );
  10494. }
  10495. #endregion
  10496. #region Some/Error
  10497. [Fact]
  10498. public void Zip_SomeError()
  10499. {
  10500. var scheduler = new TestScheduler();
  10501. var ex = new Exception();
  10502. var o = scheduler.CreateHotObservable(
  10503. OnNext(150, 1),
  10504. OnNext(215, 2),
  10505. OnCompleted<int>(230)
  10506. );
  10507. var e = scheduler.CreateHotObservable(
  10508. OnNext(150, 1),
  10509. OnError<int>(220, ex)
  10510. );
  10511. var res = scheduler.Start(() =>
  10512. o.Zip(e, (x, y) => x + y)
  10513. );
  10514. res.Messages.AssertEqual(
  10515. OnError<int>(220, ex)
  10516. );
  10517. o.Subscriptions.AssertEqual(
  10518. Subscribe(200, 220)
  10519. );
  10520. e.Subscriptions.AssertEqual(
  10521. Subscribe(200, 220)
  10522. );
  10523. }
  10524. [Fact]
  10525. public void Zip_ErrorSome()
  10526. {
  10527. var scheduler = new TestScheduler();
  10528. var ex = new Exception();
  10529. var o = scheduler.CreateHotObservable(
  10530. OnNext(150, 1),
  10531. OnNext(215, 2),
  10532. OnCompleted<int>(230)
  10533. );
  10534. var e = scheduler.CreateHotObservable(
  10535. OnNext(150, 1),
  10536. OnError<int>(220, ex)
  10537. );
  10538. var res = scheduler.Start(() =>
  10539. e.Zip(o, (x, y) => x + y)
  10540. );
  10541. res.Messages.AssertEqual(
  10542. OnError<int>(220, ex)
  10543. );
  10544. o.Subscriptions.AssertEqual(
  10545. Subscribe(200, 220)
  10546. );
  10547. e.Subscriptions.AssertEqual(
  10548. Subscribe(200, 220)
  10549. );
  10550. }
  10551. #endregion
  10552. #region Simple
  10553. [Fact]
  10554. public void Zip_LeftCompletesFirst()
  10555. {
  10556. var scheduler = new TestScheduler();
  10557. var o = scheduler.CreateHotObservable(
  10558. OnNext(150, 1),
  10559. OnNext(210, 2),
  10560. OnCompleted<int>(220)
  10561. );
  10562. var e = scheduler.CreateHotObservable(
  10563. OnNext(150, 1),
  10564. OnNext(215, 4),
  10565. OnCompleted<int>(225)
  10566. );
  10567. var res = scheduler.Start(() =>
  10568. o.Zip(e, (x, y) => x + y)
  10569. );
  10570. res.Messages.AssertEqual(
  10571. OnNext(215, 6),
  10572. OnCompleted<int>(225)
  10573. );
  10574. o.Subscriptions.AssertEqual(
  10575. Subscribe(200, 220)
  10576. );
  10577. e.Subscriptions.AssertEqual(
  10578. Subscribe(200, 225)
  10579. );
  10580. }
  10581. [Fact]
  10582. public void Zip_RightCompletesFirst()
  10583. {
  10584. var scheduler = new TestScheduler();
  10585. var o = scheduler.CreateHotObservable(
  10586. OnNext(150, 1),
  10587. OnNext(215, 4),
  10588. OnCompleted<int>(225)
  10589. );
  10590. var e = scheduler.CreateHotObservable(
  10591. OnNext(150, 1),
  10592. OnNext(210, 2),
  10593. OnCompleted<int>(220)
  10594. );
  10595. var res = scheduler.Start(() =>
  10596. o.Zip(e, (x, y) => x + y)
  10597. );
  10598. res.Messages.AssertEqual(
  10599. OnNext(215, 6),
  10600. OnCompleted<int>(225)
  10601. );
  10602. o.Subscriptions.AssertEqual(
  10603. Subscribe(200, 225)
  10604. );
  10605. e.Subscriptions.AssertEqual(
  10606. Subscribe(200, 220)
  10607. );
  10608. }
  10609. [Fact]
  10610. public void Zip_LeftTriggersSelectorError()
  10611. {
  10612. var scheduler = new TestScheduler();
  10613. var ex = new Exception();
  10614. var o = scheduler.CreateHotObservable(
  10615. OnNext(150, 1),
  10616. OnNext(220, 2)
  10617. );
  10618. var e = scheduler.CreateHotObservable(
  10619. OnNext(150, 1),
  10620. OnNext(210, 4)
  10621. );
  10622. var res = scheduler.Start(() =>
  10623. o.Zip(e, (x, y) => { if (x == y) return 42; throw ex; })
  10624. );
  10625. res.Messages.AssertEqual(
  10626. OnError<int>(220, ex)
  10627. );
  10628. o.Subscriptions.AssertEqual(
  10629. Subscribe(200, 220)
  10630. );
  10631. e.Subscriptions.AssertEqual(
  10632. Subscribe(200, 220)
  10633. );
  10634. }
  10635. [Fact]
  10636. public void Zip_RightTriggersSelectorError()
  10637. {
  10638. var scheduler = new TestScheduler();
  10639. var ex = new Exception();
  10640. var o = scheduler.CreateHotObservable(
  10641. OnNext(150, 1),
  10642. OnNext(210, 2)
  10643. );
  10644. var e = scheduler.CreateHotObservable(
  10645. OnNext(150, 1),
  10646. OnNext(220, 4)
  10647. );
  10648. var res = scheduler.Start(() =>
  10649. o.Zip(e, (x, y) => { if (x == y) return 42; throw ex; })
  10650. );
  10651. res.Messages.AssertEqual(
  10652. OnError<int>(220, ex)
  10653. );
  10654. o.Subscriptions.AssertEqual(
  10655. Subscribe(200, 220)
  10656. );
  10657. e.Subscriptions.AssertEqual(
  10658. Subscribe(200, 220)
  10659. );
  10660. }
  10661. #endregion
  10662. #region SymmetricReturn
  10663. [Fact]
  10664. public void Zip_SymmetricReturn2()
  10665. {
  10666. var scheduler = new TestScheduler();
  10667. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10668. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10669. var res = scheduler.Start(() =>
  10670. Observable.Zip(e0, e1, (_0, _1) => _0 + _1)
  10671. );
  10672. res.Messages.AssertEqual(
  10673. OnNext(220, 3),
  10674. OnCompleted<int>(400)
  10675. );
  10676. foreach (var e in new[] { e0, e1 })
  10677. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10678. }
  10679. [Fact]
  10680. public void Zip_SymmetricReturn3()
  10681. {
  10682. var scheduler = new TestScheduler();
  10683. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10684. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10685. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10686. var res = scheduler.Start(() =>
  10687. Observable.Zip(e0, e1, e2, (_0, _1, _2) => _0 + _1 + _2)
  10688. );
  10689. res.Messages.AssertEqual(
  10690. OnNext(230, 6),
  10691. OnCompleted<int>(400)
  10692. );
  10693. foreach (var e in new[] { e0, e1, e2 })
  10694. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10695. }
  10696. [Fact]
  10697. public void Zip_SymmetricReturn4()
  10698. {
  10699. var scheduler = new TestScheduler();
  10700. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10701. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10702. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10703. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10704. var res = scheduler.Start(() =>
  10705. Observable.Zip(e0, e1, e2, e3, (_0, _1, _2, _3) => _0 + _1 + _2 + _3)
  10706. );
  10707. res.Messages.AssertEqual(
  10708. OnNext(240, 10),
  10709. OnCompleted<int>(400)
  10710. );
  10711. foreach (var e in new[] { e0, e1, e2, e3 })
  10712. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10713. }
  10714. #if !NO_LARGEARITY
  10715. [Fact]
  10716. public void Zip_SymmetricReturn5()
  10717. {
  10718. var scheduler = new TestScheduler();
  10719. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10720. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10721. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10722. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10723. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10724. var res = scheduler.Start(() =>
  10725. Observable.Zip(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4)
  10726. );
  10727. res.Messages.AssertEqual(
  10728. OnNext(250, 15),
  10729. OnCompleted<int>(400)
  10730. );
  10731. foreach (var e in new[] { e0, e1, e2, e3, e4 })
  10732. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10733. }
  10734. [Fact]
  10735. public void Zip_SymmetricReturn6()
  10736. {
  10737. var scheduler = new TestScheduler();
  10738. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10739. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10740. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10741. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10742. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10743. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10744. var res = scheduler.Start(() =>
  10745. Observable.Zip(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5)
  10746. );
  10747. res.Messages.AssertEqual(
  10748. OnNext(260, 21),
  10749. OnCompleted<int>(400)
  10750. );
  10751. foreach (var e in new[] { e0, e1, e2, e3, e4, e5 })
  10752. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10753. }
  10754. [Fact]
  10755. public void Zip_SymmetricReturn7()
  10756. {
  10757. var scheduler = new TestScheduler();
  10758. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10759. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10760. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10761. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10762. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10763. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10764. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10765. var res = scheduler.Start(() =>
  10766. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6)
  10767. );
  10768. res.Messages.AssertEqual(
  10769. OnNext(270, 28),
  10770. OnCompleted<int>(400)
  10771. );
  10772. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6 })
  10773. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10774. }
  10775. [Fact]
  10776. public void Zip_SymmetricReturn8()
  10777. {
  10778. var scheduler = new TestScheduler();
  10779. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10780. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10781. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10782. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10783. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10784. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10785. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10786. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  10787. var res = scheduler.Start(() =>
  10788. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7)
  10789. );
  10790. res.Messages.AssertEqual(
  10791. OnNext(280, 36),
  10792. OnCompleted<int>(400)
  10793. );
  10794. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7 })
  10795. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10796. }
  10797. [Fact]
  10798. public void Zip_SymmetricReturn9()
  10799. {
  10800. var scheduler = new TestScheduler();
  10801. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10802. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10803. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10804. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10805. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10806. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10807. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10808. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  10809. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  10810. var res = scheduler.Start(() =>
  10811. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8)
  10812. );
  10813. res.Messages.AssertEqual(
  10814. OnNext(290, 45),
  10815. OnCompleted<int>(400)
  10816. );
  10817. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 })
  10818. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10819. }
  10820. [Fact]
  10821. public void Zip_SymmetricReturn10()
  10822. {
  10823. var scheduler = new TestScheduler();
  10824. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10825. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10826. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10827. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10828. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10829. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10830. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10831. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  10832. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  10833. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  10834. var res = scheduler.Start(() =>
  10835. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9)
  10836. );
  10837. res.Messages.AssertEqual(
  10838. OnNext(300, 55),
  10839. OnCompleted<int>(400)
  10840. );
  10841. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 })
  10842. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10843. }
  10844. [Fact]
  10845. public void Zip_SymmetricReturn11()
  10846. {
  10847. var scheduler = new TestScheduler();
  10848. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10849. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10850. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10851. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10852. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10853. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10854. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10855. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  10856. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  10857. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  10858. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  10859. var res = scheduler.Start(() =>
  10860. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10)
  10861. );
  10862. res.Messages.AssertEqual(
  10863. OnNext(310, 66),
  10864. OnCompleted<int>(400)
  10865. );
  10866. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 })
  10867. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10868. }
  10869. [Fact]
  10870. public void Zip_SymmetricReturn12()
  10871. {
  10872. var scheduler = new TestScheduler();
  10873. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10874. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10875. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10876. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10877. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10878. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10879. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10880. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  10881. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  10882. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  10883. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  10884. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  10885. var res = scheduler.Start(() =>
  10886. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11)
  10887. );
  10888. res.Messages.AssertEqual(
  10889. OnNext(320, 78),
  10890. OnCompleted<int>(400)
  10891. );
  10892. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 })
  10893. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10894. }
  10895. [Fact]
  10896. public void Zip_SymmetricReturn13()
  10897. {
  10898. var scheduler = new TestScheduler();
  10899. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10900. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10901. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10902. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10903. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10904. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10905. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10906. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  10907. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  10908. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  10909. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  10910. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  10911. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  10912. var res = scheduler.Start(() =>
  10913. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12)
  10914. );
  10915. res.Messages.AssertEqual(
  10916. OnNext(330, 91),
  10917. OnCompleted<int>(400)
  10918. );
  10919. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 })
  10920. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10921. }
  10922. [Fact]
  10923. public void Zip_SymmetricReturn14()
  10924. {
  10925. var scheduler = new TestScheduler();
  10926. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10927. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10928. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10929. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10930. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10931. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10932. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10933. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  10934. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  10935. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  10936. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  10937. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  10938. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  10939. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnCompleted<int>(400) });
  10940. var res = scheduler.Start(() =>
  10941. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13)
  10942. );
  10943. res.Messages.AssertEqual(
  10944. OnNext(340, 105),
  10945. OnCompleted<int>(400)
  10946. );
  10947. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 })
  10948. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10949. }
  10950. [Fact]
  10951. public void Zip_SymmetricReturn15()
  10952. {
  10953. var scheduler = new TestScheduler();
  10954. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10955. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10956. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10957. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10958. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10959. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10960. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10961. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  10962. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  10963. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  10964. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  10965. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  10966. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  10967. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnCompleted<int>(400) });
  10968. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(350, 15), OnCompleted<int>(400) });
  10969. var res = scheduler.Start(() =>
  10970. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14)
  10971. );
  10972. res.Messages.AssertEqual(
  10973. OnNext(350, 120),
  10974. OnCompleted<int>(400)
  10975. );
  10976. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 })
  10977. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  10978. }
  10979. [Fact]
  10980. public void Zip_SymmetricReturn16()
  10981. {
  10982. var scheduler = new TestScheduler();
  10983. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  10984. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  10985. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  10986. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  10987. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  10988. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  10989. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  10990. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  10991. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  10992. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  10993. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  10994. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  10995. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  10996. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnCompleted<int>(400) });
  10997. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(350, 15), OnCompleted<int>(400) });
  10998. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(360, 16), OnCompleted<int>(400) });
  10999. var res = scheduler.Start(() =>
  11000. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15)
  11001. );
  11002. res.Messages.AssertEqual(
  11003. OnNext(360, 136),
  11004. OnCompleted<int>(400)
  11005. );
  11006. foreach (var e in new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 })
  11007. e.Subscriptions.AssertEqual(Subscribe(200, 400));
  11008. }
  11009. #endif
  11010. #endregion
  11011. #region Various
  11012. [Fact]
  11013. public void Zip_SomeDataAsymmetric1()
  11014. {
  11015. var scheduler = new TestScheduler();
  11016. var msgs1 = Enumerable.Range(0, 5).Select((x, i) => OnNext((ushort)(205 + i * 5), x)).ToArray();
  11017. var msgs2 = Enumerable.Range(0, 10).Select((x, i) => OnNext((ushort)(202 + i * 8), x)).ToArray();
  11018. int len = Math.Min(msgs1.Length, msgs2.Length);
  11019. var o1 = scheduler.CreateHotObservable(msgs1);
  11020. var o2 = scheduler.CreateHotObservable(msgs2);
  11021. var res = scheduler.Start(() =>
  11022. o1.Zip(o2, (x, y) => x + y)
  11023. );
  11024. Assert.Equal(len, res.Messages.Count, "length");
  11025. for (int i = 0; i < len; i++)
  11026. {
  11027. var sum = msgs1[i].Value.Value + msgs2[i].Value.Value;
  11028. var time = Math.Max(msgs1[i].Time, msgs2[i].Time);
  11029. Assert.True(res.Messages[i].Time == time);
  11030. Assert.True(res.Messages[i].Value.Kind == NotificationKind.OnNext);
  11031. Assert.True(res.Messages[i].Value.Value == sum, i.ToString());
  11032. }
  11033. }
  11034. [Fact]
  11035. public void Zip_SomeDataAsymmetric2()
  11036. {
  11037. var scheduler = new TestScheduler();
  11038. var msgs1 = Enumerable.Range(0, 10).Select((x, i) => OnNext((ushort)(205 + i * 5), x)).ToArray();
  11039. var msgs2 = Enumerable.Range(0, 5).Select((x, i) => OnNext((ushort)(202 + i * 8), x)).ToArray();
  11040. int len = Math.Min(msgs1.Length, msgs2.Length);
  11041. var o1 = scheduler.CreateHotObservable(msgs1);
  11042. var o2 = scheduler.CreateHotObservable(msgs2);
  11043. var res = scheduler.Start(() =>
  11044. o1.Zip(o2, (x, y) => x + y)
  11045. );
  11046. Assert.Equal(len, res.Messages.Count, "length");
  11047. for (int i = 0; i < len; i++)
  11048. {
  11049. var sum = msgs1[i].Value.Value + msgs2[i].Value.Value;
  11050. var time = Math.Max(msgs1[i].Time, msgs2[i].Time);
  11051. Assert.True(res.Messages[i].Time == time);
  11052. Assert.True(res.Messages[i].Value.Kind == NotificationKind.OnNext);
  11053. Assert.True(res.Messages[i].Value.Value == sum, i.ToString());
  11054. }
  11055. }
  11056. [Fact]
  11057. public void Zip_SomeDataSymmetric()
  11058. {
  11059. var scheduler = new TestScheduler();
  11060. var msgs1 = Enumerable.Range(0, 10).Select((x, i) => OnNext((ushort)(205 + i * 5), x)).ToArray();
  11061. var msgs2 = Enumerable.Range(0, 10).Select((x, i) => OnNext((ushort)(202 + i * 8), x)).ToArray();
  11062. int len = Math.Min(msgs1.Length, msgs2.Length);
  11063. var o1 = scheduler.CreateHotObservable(msgs1);
  11064. var o2 = scheduler.CreateHotObservable(msgs2);
  11065. var res = scheduler.Start(() =>
  11066. o1.Zip(o2, (x, y) => x + y)
  11067. );
  11068. Assert.Equal(len, res.Messages.Count, "length");
  11069. for (int i = 0; i < len; i++)
  11070. {
  11071. var sum = msgs1[i].Value.Value + msgs2[i].Value.Value;
  11072. var time = Math.Max(msgs1[i].Time, msgs2[i].Time);
  11073. Assert.True(res.Messages[i].Time == time);
  11074. Assert.True(res.Messages[i].Value.Kind == NotificationKind.OnNext);
  11075. Assert.True(res.Messages[i].Value.Value == sum, i.ToString());
  11076. }
  11077. }
  11078. #endregion
  11079. #region SelectorThrows
  11080. [Fact]
  11081. public void Zip_SelectorThrows()
  11082. {
  11083. var scheduler = new TestScheduler();
  11084. var o1 = scheduler.CreateHotObservable(
  11085. OnNext(150, 1),
  11086. OnNext(215, 2),
  11087. OnNext(225, 4),
  11088. OnCompleted<int>(240)
  11089. );
  11090. var o2 = scheduler.CreateHotObservable(
  11091. OnNext(150, 1),
  11092. OnNext(220, 3),
  11093. OnNext(230, 5), //!
  11094. OnCompleted<int>(250)
  11095. );
  11096. var ex = new Exception();
  11097. var res = scheduler.Start(() =>
  11098. o1.Zip(o2, (x, y) =>
  11099. {
  11100. if (y == 5)
  11101. throw ex;
  11102. return x + y;
  11103. })
  11104. );
  11105. res.Messages.AssertEqual(
  11106. OnNext(220, 2 + 3),
  11107. OnError<int>(230, ex)
  11108. );
  11109. }
  11110. [Fact]
  11111. public void Zip_SelectorThrows2()
  11112. {
  11113. var scheduler = new TestScheduler();
  11114. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11115. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11116. var ex = new Exception();
  11117. Func<int> f = () => { throw ex; };
  11118. var res = scheduler.Start(() =>
  11119. Observable.Zip(e0, e1, (_0, _1) => f())
  11120. );
  11121. res.Messages.AssertEqual(
  11122. OnError<int>(220, ex)
  11123. );
  11124. var es = new[] { e0, e1 };
  11125. foreach (var e in es)
  11126. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11127. }
  11128. [Fact]
  11129. public void Zip_SelectorThrows3()
  11130. {
  11131. var scheduler = new TestScheduler();
  11132. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11133. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11134. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11135. var ex = new Exception();
  11136. Func<int> f = () => { throw ex; };
  11137. var res = scheduler.Start(() =>
  11138. Observable.Zip(e0, e1, e2, (_0, _1, _2) => f())
  11139. );
  11140. res.Messages.AssertEqual(
  11141. OnError<int>(230, ex)
  11142. );
  11143. var es = new[] { e0, e1, e2 };
  11144. foreach (var e in es)
  11145. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11146. }
  11147. [Fact]
  11148. public void Zip_SelectorThrows4()
  11149. {
  11150. var scheduler = new TestScheduler();
  11151. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11152. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11153. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11154. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11155. var ex = new Exception();
  11156. Func<int> f = () => { throw ex; };
  11157. var res = scheduler.Start(() =>
  11158. Observable.Zip(e0, e1, e2, e3, (_0, _1, _2, _3) => f())
  11159. );
  11160. res.Messages.AssertEqual(
  11161. OnError<int>(240, ex)
  11162. );
  11163. var es = new[] { e0, e1, e2, e3 };
  11164. foreach (var e in es)
  11165. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11166. }
  11167. #if !NO_LARGEARITY
  11168. [Fact]
  11169. public void Zip_SelectorThrows5()
  11170. {
  11171. var scheduler = new TestScheduler();
  11172. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11173. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11174. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11175. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11176. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11177. var ex = new Exception();
  11178. Func<int> f = () => { throw ex; };
  11179. var res = scheduler.Start(() =>
  11180. Observable.Zip(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => f())
  11181. );
  11182. res.Messages.AssertEqual(
  11183. OnError<int>(250, ex)
  11184. );
  11185. var es = new[] { e0, e1, e2, e3, e4 };
  11186. foreach (var e in es)
  11187. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11188. }
  11189. [Fact]
  11190. public void Zip_SelectorThrows6()
  11191. {
  11192. var scheduler = new TestScheduler();
  11193. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11194. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11195. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11196. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11197. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11198. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11199. var ex = new Exception();
  11200. Func<int> f = () => { throw ex; };
  11201. var res = scheduler.Start(() =>
  11202. Observable.Zip(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => f())
  11203. );
  11204. res.Messages.AssertEqual(
  11205. OnError<int>(260, ex)
  11206. );
  11207. var es = new[] { e0, e1, e2, e3, e4, e5 };
  11208. foreach (var e in es)
  11209. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11210. }
  11211. [Fact]
  11212. public void Zip_SelectorThrows7()
  11213. {
  11214. var scheduler = new TestScheduler();
  11215. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11216. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11217. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11218. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11219. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11220. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11221. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11222. var ex = new Exception();
  11223. Func<int> f = () => { throw ex; };
  11224. var res = scheduler.Start(() =>
  11225. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => f())
  11226. );
  11227. res.Messages.AssertEqual(
  11228. OnError<int>(270, ex)
  11229. );
  11230. var es = new[] { e0, e1, e2, e3, e4, e5, e6 };
  11231. foreach (var e in es)
  11232. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11233. }
  11234. [Fact]
  11235. public void Zip_SelectorThrows8()
  11236. {
  11237. var scheduler = new TestScheduler();
  11238. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11239. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11240. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11241. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11242. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11243. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11244. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11245. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  11246. var ex = new Exception();
  11247. Func<int> f = () => { throw ex; };
  11248. var res = scheduler.Start(() =>
  11249. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => f())
  11250. );
  11251. res.Messages.AssertEqual(
  11252. OnError<int>(280, ex)
  11253. );
  11254. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7 };
  11255. foreach (var e in es)
  11256. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11257. }
  11258. [Fact]
  11259. public void Zip_SelectorThrows9()
  11260. {
  11261. var scheduler = new TestScheduler();
  11262. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11263. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11264. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11265. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11266. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11267. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11268. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11269. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  11270. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  11271. var ex = new Exception();
  11272. Func<int> f = () => { throw ex; };
  11273. var res = scheduler.Start(() =>
  11274. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => f())
  11275. );
  11276. res.Messages.AssertEqual(
  11277. OnError<int>(290, ex)
  11278. );
  11279. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 };
  11280. foreach (var e in es)
  11281. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11282. }
  11283. [Fact]
  11284. public void Zip_SelectorThrows10()
  11285. {
  11286. var scheduler = new TestScheduler();
  11287. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11288. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11289. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11290. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11291. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11292. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11293. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11294. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  11295. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  11296. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  11297. var ex = new Exception();
  11298. Func<int> f = () => { throw ex; };
  11299. var res = scheduler.Start(() =>
  11300. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => f())
  11301. );
  11302. res.Messages.AssertEqual(
  11303. OnError<int>(300, ex)
  11304. );
  11305. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 };
  11306. foreach (var e in es)
  11307. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11308. }
  11309. [Fact]
  11310. public void Zip_SelectorThrows11()
  11311. {
  11312. var scheduler = new TestScheduler();
  11313. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11314. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11315. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11316. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11317. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11318. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11319. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11320. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  11321. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  11322. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  11323. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  11324. var ex = new Exception();
  11325. Func<int> f = () => { throw ex; };
  11326. var res = scheduler.Start(() =>
  11327. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => f())
  11328. );
  11329. res.Messages.AssertEqual(
  11330. OnError<int>(310, ex)
  11331. );
  11332. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 };
  11333. foreach (var e in es)
  11334. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11335. }
  11336. [Fact]
  11337. public void Zip_SelectorThrows12()
  11338. {
  11339. var scheduler = new TestScheduler();
  11340. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11341. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11342. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11343. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11344. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11345. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11346. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11347. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  11348. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  11349. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  11350. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  11351. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  11352. var ex = new Exception();
  11353. Func<int> f = () => { throw ex; };
  11354. var res = scheduler.Start(() =>
  11355. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => f())
  11356. );
  11357. res.Messages.AssertEqual(
  11358. OnError<int>(320, ex)
  11359. );
  11360. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 };
  11361. foreach (var e in es)
  11362. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11363. }
  11364. [Fact]
  11365. public void Zip_SelectorThrows13()
  11366. {
  11367. var scheduler = new TestScheduler();
  11368. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11369. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11370. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11371. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11372. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11373. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11374. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11375. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  11376. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  11377. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  11378. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  11379. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  11380. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  11381. var ex = new Exception();
  11382. Func<int> f = () => { throw ex; };
  11383. var res = scheduler.Start(() =>
  11384. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => f())
  11385. );
  11386. res.Messages.AssertEqual(
  11387. OnError<int>(330, ex)
  11388. );
  11389. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 };
  11390. foreach (var e in es)
  11391. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11392. }
  11393. [Fact]
  11394. public void Zip_SelectorThrows14()
  11395. {
  11396. var scheduler = new TestScheduler();
  11397. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11398. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11399. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11400. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11401. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11402. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11403. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11404. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  11405. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  11406. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  11407. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  11408. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  11409. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  11410. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnCompleted<int>(400) });
  11411. var ex = new Exception();
  11412. Func<int> f = () => { throw ex; };
  11413. var res = scheduler.Start(() =>
  11414. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => f())
  11415. );
  11416. res.Messages.AssertEqual(
  11417. OnError<int>(340, ex)
  11418. );
  11419. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 };
  11420. foreach (var e in es)
  11421. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11422. }
  11423. [Fact]
  11424. public void Zip_SelectorThrows15()
  11425. {
  11426. var scheduler = new TestScheduler();
  11427. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11428. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11429. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11430. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11431. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11432. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11433. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11434. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  11435. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  11436. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  11437. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  11438. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  11439. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  11440. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnCompleted<int>(400) });
  11441. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(350, 15), OnCompleted<int>(400) });
  11442. var ex = new Exception();
  11443. Func<int> f = () => { throw ex; };
  11444. var res = scheduler.Start(() =>
  11445. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => f())
  11446. );
  11447. res.Messages.AssertEqual(
  11448. OnError<int>(350, ex)
  11449. );
  11450. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 };
  11451. foreach (var e in es)
  11452. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11453. }
  11454. [Fact]
  11455. public void Zip_SelectorThrows16()
  11456. {
  11457. var scheduler = new TestScheduler();
  11458. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  11459. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  11460. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnCompleted<int>(400) });
  11461. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  11462. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(250, 5), OnCompleted<int>(400) });
  11463. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(260, 6), OnCompleted<int>(400) });
  11464. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(270, 7), OnCompleted<int>(400) });
  11465. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(280, 8), OnCompleted<int>(400) });
  11466. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(290, 9), OnCompleted<int>(400) });
  11467. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(300, 10), OnCompleted<int>(400) });
  11468. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(310, 11), OnCompleted<int>(400) });
  11469. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(320, 12), OnCompleted<int>(400) });
  11470. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(330, 13), OnCompleted<int>(400) });
  11471. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(340, 14), OnCompleted<int>(400) });
  11472. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(350, 15), OnCompleted<int>(400) });
  11473. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(360, 16), OnCompleted<int>(400) });
  11474. var ex = new Exception();
  11475. Func<int> f = () => { throw ex; };
  11476. var res = scheduler.Start(() =>
  11477. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => f())
  11478. );
  11479. res.Messages.AssertEqual(
  11480. OnError<int>(360, ex)
  11481. );
  11482. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 };
  11483. foreach (var e in es)
  11484. e.Subscriptions.AssertEqual(Subscribe(200, 200 + es.Length * 10));
  11485. }
  11486. #endif
  11487. #endregion
  11488. #region GetEnumeratorThrows
  11489. [Fact]
  11490. public void Zip_GetEnumeratorThrows()
  11491. {
  11492. var ex = new Exception();
  11493. var scheduler = new TestScheduler();
  11494. var xs = scheduler.CreateHotObservable<int>(
  11495. OnNext(210, 42),
  11496. OnNext(220, 43),
  11497. OnCompleted<int>(230)
  11498. );
  11499. var ys = new RogueEnumerable<int>(ex);
  11500. var res = scheduler.Start(() =>
  11501. xs.Zip(ys, (x, y) => x + y)
  11502. );
  11503. res.Messages.AssertEqual(
  11504. OnError<int>(200, ex)
  11505. );
  11506. xs.Subscriptions.AssertEqual(
  11507. );
  11508. }
  11509. #endregion
  11510. #region AllCompleted
  11511. [Fact]
  11512. public void Zip_AllCompleted2()
  11513. {
  11514. var scheduler = new TestScheduler();
  11515. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11516. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11517. var res = scheduler.Start(() =>
  11518. Observable.Zip(e0, e1, (_0, _1) => _0 + _1)
  11519. );
  11520. res.Messages.AssertEqual(
  11521. OnNext<int>(210, 10),
  11522. OnCompleted<int>(220)
  11523. );
  11524. var es = new[] { e0, e1 };
  11525. var i = 0;
  11526. foreach (var e in es.Take(es.Length - 1))
  11527. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11528. es.Last().Subscriptions.AssertEqual(
  11529. Subscribe(200, 220 + (i - 1) * 10)
  11530. );
  11531. }
  11532. [Fact]
  11533. public void Zip_AllCompleted3()
  11534. {
  11535. var scheduler = new TestScheduler();
  11536. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11537. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11538. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11539. var res = scheduler.Start(() =>
  11540. Observable.Zip(e0, e1, e2, (_0, _1, _2) => _0 + _1 + _2)
  11541. );
  11542. res.Messages.AssertEqual(
  11543. OnNext<int>(210, 15),
  11544. OnCompleted<int>(230)
  11545. );
  11546. var es = new[] { e0, e1, e2 };
  11547. var i = 0;
  11548. foreach (var e in es.Take(es.Length - 1))
  11549. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11550. es.Last().Subscriptions.AssertEqual(
  11551. Subscribe(200, 220 + (i - 1) * 10)
  11552. );
  11553. }
  11554. [Fact]
  11555. public void Zip_AllCompleted4()
  11556. {
  11557. var scheduler = new TestScheduler();
  11558. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11559. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11560. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11561. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11562. var res = scheduler.Start(() =>
  11563. Observable.Zip(e0, e1, e2, e3, (_0, _1, _2, _3) => _0 + _1 + _2 + _3)
  11564. );
  11565. res.Messages.AssertEqual(
  11566. OnNext<int>(210, 20),
  11567. OnCompleted<int>(240)
  11568. );
  11569. var es = new[] { e0, e1, e2, e3 };
  11570. var i = 0;
  11571. foreach (var e in es.Take(es.Length - 1))
  11572. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11573. es.Last().Subscriptions.AssertEqual(
  11574. Subscribe(200, 220 + (i - 1) * 10)
  11575. );
  11576. }
  11577. #if !NO_LARGEARITY
  11578. [Fact]
  11579. public void Zip_AllCompleted5()
  11580. {
  11581. var scheduler = new TestScheduler();
  11582. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11583. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11584. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11585. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11586. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11587. var res = scheduler.Start(() =>
  11588. Observable.Zip(e0, e1, e2, e3, e4, (_0, _1, _2, _3, _4) => _0 + _1 + _2 + _3 + _4)
  11589. );
  11590. res.Messages.AssertEqual(
  11591. OnNext<int>(210, 25),
  11592. OnCompleted<int>(250)
  11593. );
  11594. var es = new[] { e0, e1, e2, e3, e4 };
  11595. var i = 0;
  11596. foreach (var e in es.Take(es.Length - 1))
  11597. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11598. es.Last().Subscriptions.AssertEqual(
  11599. Subscribe(200, 220 + (i - 1) * 10)
  11600. );
  11601. }
  11602. [Fact]
  11603. public void Zip_AllCompleted6()
  11604. {
  11605. var scheduler = new TestScheduler();
  11606. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11607. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11608. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11609. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11610. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11611. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11612. var res = scheduler.Start(() =>
  11613. Observable.Zip(e0, e1, e2, e3, e4, e5, (_0, _1, _2, _3, _4, _5) => _0 + _1 + _2 + _3 + _4 + _5)
  11614. );
  11615. res.Messages.AssertEqual(
  11616. OnNext<int>(210, 30),
  11617. OnCompleted<int>(260)
  11618. );
  11619. var es = new[] { e0, e1, e2, e3, e4, e5 };
  11620. var i = 0;
  11621. foreach (var e in es.Take(es.Length - 1))
  11622. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11623. es.Last().Subscriptions.AssertEqual(
  11624. Subscribe(200, 220 + (i - 1) * 10)
  11625. );
  11626. }
  11627. [Fact]
  11628. public void Zip_AllCompleted7()
  11629. {
  11630. var scheduler = new TestScheduler();
  11631. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11632. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11633. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11634. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11635. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11636. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11637. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11638. var res = scheduler.Start(() =>
  11639. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, (_0, _1, _2, _3, _4, _5, _6) => _0 + _1 + _2 + _3 + _4 + _5 + _6)
  11640. );
  11641. res.Messages.AssertEqual(
  11642. OnNext<int>(210, 35),
  11643. OnCompleted<int>(270)
  11644. );
  11645. var es = new[] { e0, e1, e2, e3, e4, e5, e6 };
  11646. var i = 0;
  11647. foreach (var e in es.Take(es.Length - 1))
  11648. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11649. es.Last().Subscriptions.AssertEqual(
  11650. Subscribe(200, 220 + (i - 1) * 10)
  11651. );
  11652. }
  11653. [Fact]
  11654. public void Zip_AllCompleted8()
  11655. {
  11656. var scheduler = new TestScheduler();
  11657. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11658. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11659. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11660. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11661. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11662. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11663. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11664. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnCompleted<int>(290) });
  11665. var res = scheduler.Start(() =>
  11666. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, (_0, _1, _2, _3, _4, _5, _6, _7) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7)
  11667. );
  11668. res.Messages.AssertEqual(
  11669. OnNext<int>(210, 40),
  11670. OnCompleted<int>(280)
  11671. );
  11672. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7 };
  11673. var i = 0;
  11674. foreach (var e in es.Take(es.Length - 1))
  11675. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11676. es.Last().Subscriptions.AssertEqual(
  11677. Subscribe(200, 220 + (i - 1) * 10)
  11678. );
  11679. }
  11680. [Fact]
  11681. public void Zip_AllCompleted9()
  11682. {
  11683. var scheduler = new TestScheduler();
  11684. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11685. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11686. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11687. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11688. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11689. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11690. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11691. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnCompleted<int>(290) });
  11692. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnCompleted<int>(300) });
  11693. var res = scheduler.Start(() =>
  11694. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, (_0, _1, _2, _3, _4, _5, _6, _7, _8) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8)
  11695. );
  11696. res.Messages.AssertEqual(
  11697. OnNext<int>(210, 45),
  11698. OnCompleted<int>(290)
  11699. );
  11700. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 };
  11701. var i = 0;
  11702. foreach (var e in es.Take(es.Length - 1))
  11703. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11704. es.Last().Subscriptions.AssertEqual(
  11705. Subscribe(200, 220 + (i - 1) * 10)
  11706. );
  11707. }
  11708. [Fact]
  11709. public void Zip_AllCompleted10()
  11710. {
  11711. var scheduler = new TestScheduler();
  11712. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11713. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11714. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11715. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11716. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11717. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11718. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11719. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnCompleted<int>(290) });
  11720. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnCompleted<int>(300) });
  11721. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnCompleted<int>(310) });
  11722. var res = scheduler.Start(() =>
  11723. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9)
  11724. );
  11725. res.Messages.AssertEqual(
  11726. OnNext<int>(210, 50),
  11727. OnCompleted<int>(300)
  11728. );
  11729. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 };
  11730. var i = 0;
  11731. foreach (var e in es.Take(es.Length - 1))
  11732. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11733. es.Last().Subscriptions.AssertEqual(
  11734. Subscribe(200, 220 + (i - 1) * 10)
  11735. );
  11736. }
  11737. [Fact]
  11738. public void Zip_AllCompleted11()
  11739. {
  11740. var scheduler = new TestScheduler();
  11741. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11742. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11743. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11744. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11745. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11746. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11747. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11748. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnCompleted<int>(290) });
  11749. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnCompleted<int>(300) });
  11750. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnCompleted<int>(310) });
  11751. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnCompleted<int>(320) });
  11752. var res = scheduler.Start(() =>
  11753. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10)
  11754. );
  11755. res.Messages.AssertEqual(
  11756. OnNext<int>(210, 55),
  11757. OnCompleted<int>(310)
  11758. );
  11759. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 };
  11760. var i = 0;
  11761. foreach (var e in es.Take(es.Length - 1))
  11762. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11763. es.Last().Subscriptions.AssertEqual(
  11764. Subscribe(200, 220 + (i - 1) * 10)
  11765. );
  11766. }
  11767. [Fact]
  11768. public void Zip_AllCompleted12()
  11769. {
  11770. var scheduler = new TestScheduler();
  11771. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11772. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11773. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11774. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11775. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11776. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11777. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11778. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnCompleted<int>(290) });
  11779. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnCompleted<int>(300) });
  11780. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnCompleted<int>(310) });
  11781. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnCompleted<int>(320) });
  11782. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnCompleted<int>(330) });
  11783. var res = scheduler.Start(() =>
  11784. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11)
  11785. );
  11786. res.Messages.AssertEqual(
  11787. OnNext<int>(210, 60),
  11788. OnCompleted<int>(320)
  11789. );
  11790. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11 };
  11791. var i = 0;
  11792. foreach (var e in es.Take(es.Length - 1))
  11793. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11794. es.Last().Subscriptions.AssertEqual(
  11795. Subscribe(200, 220 + (i - 1) * 10)
  11796. );
  11797. }
  11798. [Fact]
  11799. public void Zip_AllCompleted13()
  11800. {
  11801. var scheduler = new TestScheduler();
  11802. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11803. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11804. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11805. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11806. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11807. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11808. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11809. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnCompleted<int>(290) });
  11810. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnCompleted<int>(300) });
  11811. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnCompleted<int>(310) });
  11812. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnCompleted<int>(320) });
  11813. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnCompleted<int>(330) });
  11814. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnCompleted<int>(340) });
  11815. var res = scheduler.Start(() =>
  11816. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12)
  11817. );
  11818. res.Messages.AssertEqual(
  11819. OnNext<int>(210, 65),
  11820. OnCompleted<int>(330)
  11821. );
  11822. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12 };
  11823. var i = 0;
  11824. foreach (var e in es.Take(es.Length - 1))
  11825. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11826. es.Last().Subscriptions.AssertEqual(
  11827. Subscribe(200, 220 + (i - 1) * 10)
  11828. );
  11829. }
  11830. [Fact]
  11831. public void Zip_AllCompleted14()
  11832. {
  11833. var scheduler = new TestScheduler();
  11834. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11835. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11836. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11837. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11838. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11839. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11840. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11841. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnCompleted<int>(290) });
  11842. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnCompleted<int>(300) });
  11843. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnCompleted<int>(310) });
  11844. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnCompleted<int>(320) });
  11845. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnCompleted<int>(330) });
  11846. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnCompleted<int>(340) });
  11847. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnNext(340, 18), OnCompleted<int>(350) });
  11848. var res = scheduler.Start(() =>
  11849. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13)
  11850. );
  11851. res.Messages.AssertEqual(
  11852. OnNext<int>(210, 70),
  11853. OnCompleted<int>(340)
  11854. );
  11855. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13 };
  11856. var i = 0;
  11857. foreach (var e in es.Take(es.Length - 1))
  11858. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11859. es.Last().Subscriptions.AssertEqual(
  11860. Subscribe(200, 220 + (i - 1) * 10)
  11861. );
  11862. }
  11863. [Fact]
  11864. public void Zip_AllCompleted15()
  11865. {
  11866. var scheduler = new TestScheduler();
  11867. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11868. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11869. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11870. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11871. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11872. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11873. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11874. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnCompleted<int>(290) });
  11875. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnCompleted<int>(300) });
  11876. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnCompleted<int>(310) });
  11877. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnCompleted<int>(320) });
  11878. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnCompleted<int>(330) });
  11879. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnCompleted<int>(340) });
  11880. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnNext(340, 18), OnCompleted<int>(350) });
  11881. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnNext(340, 18), OnNext(350, 19), OnCompleted<int>(360) });
  11882. var res = scheduler.Start(() =>
  11883. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14)
  11884. );
  11885. res.Messages.AssertEqual(
  11886. OnNext<int>(210, 75),
  11887. OnCompleted<int>(350)
  11888. );
  11889. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14 };
  11890. var i = 0;
  11891. foreach (var e in es.Take(es.Length - 1))
  11892. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11893. es.Last().Subscriptions.AssertEqual(
  11894. Subscribe(200, 220 + (i - 1) * 10)
  11895. );
  11896. }
  11897. [Fact]
  11898. public void Zip_AllCompleted16()
  11899. {
  11900. var scheduler = new TestScheduler();
  11901. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnCompleted<int>(220) });
  11902. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnCompleted<int>(230) });
  11903. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnCompleted<int>(240) });
  11904. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnCompleted<int>(250) });
  11905. var e4 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnCompleted<int>(260) });
  11906. var e5 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnCompleted<int>(270) });
  11907. var e6 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnCompleted<int>(280) });
  11908. var e7 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnCompleted<int>(290) });
  11909. var e8 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnCompleted<int>(300) });
  11910. var e9 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnCompleted<int>(310) });
  11911. var e10 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnCompleted<int>(320) });
  11912. var e11 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnCompleted<int>(330) });
  11913. var e12 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnCompleted<int>(340) });
  11914. var e13 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnNext(340, 18), OnCompleted<int>(350) });
  11915. var e14 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnNext(340, 18), OnNext(350, 19), OnCompleted<int>(360) });
  11916. var e15 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 5), OnNext(220, 6), OnNext(230, 7), OnNext(240, 8), OnNext(250, 9), OnNext(260, 10), OnNext(270, 11), OnNext(280, 12), OnNext(290, 13), OnNext(300, 14), OnNext(310, 15), OnNext(320, 16), OnNext(330, 17), OnNext(340, 18), OnNext(350, 19), OnNext(360, 20), OnCompleted<int>(370) });
  11917. var res = scheduler.Start(() =>
  11918. Observable.Zip(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, (_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) => _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 + _11 + _12 + _13 + _14 + _15)
  11919. );
  11920. res.Messages.AssertEqual(
  11921. OnNext<int>(210, 80),
  11922. OnCompleted<int>(360)
  11923. );
  11924. var es = new[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15 };
  11925. var i = 0;
  11926. foreach (var e in es.Take(es.Length - 1))
  11927. e.Subscriptions.AssertEqual(Subscribe(200, 220 + (i++ * 10)));
  11928. es.Last().Subscriptions.AssertEqual(
  11929. Subscribe(200, 220 + (i - 1) * 10)
  11930. );
  11931. }
  11932. #endif
  11933. #endregion
  11934. #region ZipWithEnumerable
  11935. [Fact]
  11936. public void ZipWithEnumerable_NeverNever()
  11937. {
  11938. var evt = new ManualResetEvent(false);
  11939. var scheduler = new TestScheduler();
  11940. var n1 = scheduler.CreateHotObservable(
  11941. OnNext(150, 1)
  11942. );
  11943. var n2 = new MockEnumerable<int>(scheduler,
  11944. EnumerableNever(evt)
  11945. );
  11946. var res = scheduler.Start(() =>
  11947. n1.Zip(n2, (x, y) => x + y)
  11948. );
  11949. res.Messages.AssertEqual(
  11950. );
  11951. n1.Subscriptions.AssertEqual(
  11952. Subscribe(200, 1000)
  11953. );
  11954. n2.Subscriptions.AssertEqual(
  11955. Subscribe(200, 1000)
  11956. );
  11957. evt.Set();
  11958. }
  11959. [Fact]
  11960. public void ZipWithEnumerable_NeverEmpty()
  11961. {
  11962. var scheduler = new TestScheduler();
  11963. var n = scheduler.CreateHotObservable(
  11964. OnNext(150, 1)
  11965. );
  11966. var e = new MockEnumerable<int>(scheduler,
  11967. Enumerable.Empty<int>()
  11968. );
  11969. var res = scheduler.Start(() =>
  11970. n.Zip(e, (x, y) => x + y)
  11971. );
  11972. res.Messages.AssertEqual(
  11973. );
  11974. n.Subscriptions.AssertEqual(
  11975. Subscribe(200, 1000)
  11976. );
  11977. e.Subscriptions.AssertEqual(
  11978. Subscribe(200, 1000)
  11979. );
  11980. }
  11981. [Fact]
  11982. public void ZipWithEnumerable_EmptyNever()
  11983. {
  11984. var evt = new ManualResetEvent(false);
  11985. var scheduler = new TestScheduler();
  11986. var e = scheduler.CreateHotObservable(
  11987. OnNext(150, 1),
  11988. OnCompleted<int>(210)
  11989. );
  11990. var n = new MockEnumerable<int>(scheduler,
  11991. EnumerableNever(evt)
  11992. );
  11993. var res = scheduler.Start(() =>
  11994. e.Zip(n, (x, y) => x + y)
  11995. );
  11996. res.Messages.AssertEqual(
  11997. OnCompleted<int>(210)
  11998. );
  11999. e.Subscriptions.AssertEqual(
  12000. Subscribe(200, 210)
  12001. );
  12002. n.Subscriptions.AssertEqual(
  12003. Subscribe(200, 210)
  12004. );
  12005. evt.Set();
  12006. }
  12007. [Fact]
  12008. public void ZipWithEnumerable_EmptyEmpty()
  12009. {
  12010. var scheduler = new TestScheduler();
  12011. var e1 = scheduler.CreateHotObservable(
  12012. OnNext(150, 1),
  12013. OnCompleted<int>(210)
  12014. );
  12015. var e2 = new MockEnumerable<int>(scheduler,
  12016. Enumerable.Empty<int>()
  12017. );
  12018. var res = scheduler.Start(() =>
  12019. e1.Zip(e2, (x, y) => x + y)
  12020. );
  12021. res.Messages.AssertEqual(
  12022. OnCompleted<int>(210)
  12023. );
  12024. e1.Subscriptions.AssertEqual(
  12025. Subscribe(200, 210)
  12026. );
  12027. e2.Subscriptions.AssertEqual(
  12028. Subscribe(200, 210)
  12029. );
  12030. }
  12031. [Fact]
  12032. public void ZipWithEnumerable_EmptyNonEmpty()
  12033. {
  12034. var scheduler = new TestScheduler();
  12035. var e = scheduler.CreateHotObservable(
  12036. OnNext(150, 1),
  12037. OnCompleted<int>(210)
  12038. );
  12039. var o = new MockEnumerable<int>(scheduler,
  12040. new[] { 2 }
  12041. );
  12042. var res = scheduler.Start(() =>
  12043. e.Zip(o, (x, y) => x + y)
  12044. );
  12045. res.Messages.AssertEqual(
  12046. OnCompleted<int>(210)
  12047. );
  12048. e.Subscriptions.AssertEqual(
  12049. Subscribe(200, 210)
  12050. );
  12051. o.Subscriptions.AssertEqual(
  12052. Subscribe(200, 210)
  12053. );
  12054. }
  12055. [Fact]
  12056. public void ZipWithEnumerable_NonEmptyEmpty()
  12057. {
  12058. var scheduler = new TestScheduler();
  12059. var e = new MockEnumerable<int>(scheduler,
  12060. Enumerable.Empty<int>()
  12061. );
  12062. var o = scheduler.CreateHotObservable(
  12063. OnNext(150, 1),
  12064. OnNext(215, 2),
  12065. OnCompleted<int>(220)
  12066. );
  12067. var res = scheduler.Start(() =>
  12068. o.Zip(e, (x, y) => x + y)
  12069. );
  12070. res.Messages.AssertEqual(
  12071. OnCompleted<int>(215)
  12072. );
  12073. e.Subscriptions.AssertEqual(
  12074. Subscribe(200, 215)
  12075. );
  12076. o.Subscriptions.AssertEqual(
  12077. Subscribe(200, 215)
  12078. );
  12079. }
  12080. [Fact]
  12081. public void ZipWithEnumerable_NeverNonEmpty()
  12082. {
  12083. var scheduler = new TestScheduler();
  12084. var o = new MockEnumerable<int>(scheduler,
  12085. new[] { 2 }
  12086. );
  12087. var n = scheduler.CreateHotObservable(
  12088. OnNext(150, 1)
  12089. );
  12090. var res = scheduler.Start(() =>
  12091. n.Zip(o, (x, y) => x + y)
  12092. );
  12093. res.Messages.AssertEqual(
  12094. );
  12095. o.Subscriptions.AssertEqual(
  12096. Subscribe(200, 1000)
  12097. );
  12098. n.Subscriptions.AssertEqual(
  12099. Subscribe(200, 1000)
  12100. );
  12101. }
  12102. [Fact]
  12103. public void ZipWithEnumerable_NonEmptyNonEmpty()
  12104. {
  12105. var scheduler = new TestScheduler();
  12106. var o1 = scheduler.CreateHotObservable(
  12107. OnNext(150, 1),
  12108. OnNext(215, 2),
  12109. OnCompleted<int>(230)
  12110. );
  12111. var o2 = new MockEnumerable<int>(scheduler,
  12112. new[] { 3 }
  12113. );
  12114. var res = scheduler.Start(() =>
  12115. o1.Zip(o2, (x, y) => x + y)
  12116. );
  12117. res.Messages.AssertEqual(
  12118. OnNext(215, 2 + 3),
  12119. OnCompleted<int>(230)
  12120. );
  12121. o1.Subscriptions.AssertEqual(
  12122. Subscribe(200, 230)
  12123. );
  12124. o2.Subscriptions.AssertEqual(
  12125. Subscribe(200, 230)
  12126. );
  12127. }
  12128. [Fact]
  12129. public void ZipWithEnumerable_EmptyError()
  12130. {
  12131. var scheduler = new TestScheduler();
  12132. var ex = new Exception();
  12133. var e = scheduler.CreateHotObservable(
  12134. OnNext(150, 1),
  12135. OnCompleted<int>(230)
  12136. );
  12137. var f = new MockEnumerable<int>(scheduler,
  12138. ThrowEnumerable(false, ex)
  12139. );
  12140. var res = scheduler.Start(() =>
  12141. e.Zip(f, (x, y) => x + y)
  12142. );
  12143. res.Messages.AssertEqual(
  12144. OnCompleted<int>(230)
  12145. );
  12146. e.Subscriptions.AssertEqual(
  12147. Subscribe(200, 230)
  12148. );
  12149. f.Subscriptions.AssertEqual(
  12150. Subscribe(200, 230)
  12151. );
  12152. }
  12153. [Fact]
  12154. public void ZipWithEnumerable_ErrorEmpty()
  12155. {
  12156. var scheduler = new TestScheduler();
  12157. var ex = new Exception();
  12158. var e = new MockEnumerable<int>(scheduler,
  12159. Enumerable.Empty<int>()
  12160. );
  12161. var f = scheduler.CreateHotObservable(
  12162. OnNext(150, 1),
  12163. OnError<int>(220, ex)
  12164. );
  12165. var res = scheduler.Start(() =>
  12166. f.Zip(e, (x, y) => x + y)
  12167. );
  12168. res.Messages.AssertEqual(
  12169. OnError<int>(220, ex)
  12170. );
  12171. e.Subscriptions.AssertEqual(
  12172. Subscribe(200, 220)
  12173. );
  12174. f.Subscriptions.AssertEqual(
  12175. Subscribe(200, 220)
  12176. );
  12177. }
  12178. [Fact]
  12179. public void ZipWithEnumerable_NeverError()
  12180. {
  12181. var scheduler = new TestScheduler();
  12182. var ex = new Exception();
  12183. var n = scheduler.CreateHotObservable(
  12184. OnNext(150, 1)
  12185. );
  12186. var f = new MockEnumerable<int>(scheduler,
  12187. ThrowEnumerable(false, ex)
  12188. );
  12189. var res = scheduler.Start(() =>
  12190. n.Zip(f, (x, y) => x + y)
  12191. );
  12192. res.Messages.AssertEqual(
  12193. );
  12194. n.Subscriptions.AssertEqual(
  12195. Subscribe(200, 1000)
  12196. );
  12197. f.Subscriptions.AssertEqual(
  12198. Subscribe(200, 1000)
  12199. );
  12200. }
  12201. [Fact]
  12202. public void ZipWithEnumerable_ErrorNever()
  12203. {
  12204. var evt = new ManualResetEvent(false);
  12205. var scheduler = new TestScheduler();
  12206. var ex = new Exception();
  12207. var n = new MockEnumerable<int>(scheduler,
  12208. EnumerableNever(evt)
  12209. );
  12210. var f = scheduler.CreateHotObservable(
  12211. OnNext(150, 1),
  12212. OnError<int>(220, ex)
  12213. );
  12214. var res = scheduler.Start(() =>
  12215. f.Zip(n, (x, y) => x + y)
  12216. );
  12217. res.Messages.AssertEqual(
  12218. OnError<int>(220, ex)
  12219. );
  12220. n.Subscriptions.AssertEqual(
  12221. Subscribe(200, 220)
  12222. );
  12223. f.Subscriptions.AssertEqual(
  12224. Subscribe(200, 220)
  12225. );
  12226. evt.Set();
  12227. }
  12228. [Fact]
  12229. public void ZipWithEnumerable_ErrorError()
  12230. {
  12231. var scheduler = new TestScheduler();
  12232. var ex1 = new Exception();
  12233. var ex2 = new Exception();
  12234. var f1 = scheduler.CreateHotObservable(
  12235. OnNext(150, 1),
  12236. OnError<int>(230, ex1)
  12237. );
  12238. var f2 = new MockEnumerable<int>(scheduler,
  12239. ThrowEnumerable(false, ex2)
  12240. );
  12241. var res = scheduler.Start(() =>
  12242. f1.Zip(f2, (x, y) => x + y)
  12243. );
  12244. res.Messages.AssertEqual(
  12245. OnError<int>(230, ex1)
  12246. );
  12247. f1.Subscriptions.AssertEqual(
  12248. Subscribe(200, 230)
  12249. );
  12250. f2.Subscriptions.AssertEqual(
  12251. Subscribe(200, 230)
  12252. );
  12253. }
  12254. [Fact]
  12255. public void ZipWithEnumerable_SomeError()
  12256. {
  12257. var scheduler = new TestScheduler();
  12258. var ex = new Exception();
  12259. var o = scheduler.CreateHotObservable(
  12260. OnNext(150, 1),
  12261. OnNext(215, 2),
  12262. OnCompleted<int>(230)
  12263. );
  12264. var e = new MockEnumerable<int>(scheduler,
  12265. ThrowEnumerable(false, ex)
  12266. );
  12267. var res = scheduler.Start(() =>
  12268. o.Zip(e, (x, y) => x + y)
  12269. );
  12270. res.Messages.AssertEqual(
  12271. OnError<int>(215, ex)
  12272. );
  12273. o.Subscriptions.AssertEqual(
  12274. Subscribe(200, 215)
  12275. );
  12276. e.Subscriptions.AssertEqual(
  12277. Subscribe(200, 215)
  12278. );
  12279. }
  12280. [Fact]
  12281. public void ZipWithEnumerable_ErrorSome()
  12282. {
  12283. var scheduler = new TestScheduler();
  12284. var ex = new Exception();
  12285. var o = new MockEnumerable<int>(scheduler,
  12286. new[] { 2 }
  12287. );
  12288. var e = scheduler.CreateHotObservable(
  12289. OnNext(150, 1),
  12290. OnError<int>(220, ex)
  12291. );
  12292. var res = scheduler.Start(() =>
  12293. e.Zip(o, (x, y) => x + y)
  12294. );
  12295. res.Messages.AssertEqual(
  12296. OnError<int>(220, ex)
  12297. );
  12298. o.Subscriptions.AssertEqual(
  12299. Subscribe(200, 220)
  12300. );
  12301. e.Subscriptions.AssertEqual(
  12302. Subscribe(200, 220)
  12303. );
  12304. }
  12305. [Fact]
  12306. public void ZipWithEnumerable_SomeDataBothSides()
  12307. {
  12308. var scheduler = new TestScheduler();
  12309. var ex = new Exception();
  12310. var o = new MockEnumerable<int>(scheduler,
  12311. new[] { 5, 4, 3, 2 }
  12312. );
  12313. var e = scheduler.CreateHotObservable(
  12314. OnNext(150, 1),
  12315. OnNext(210, 2),
  12316. OnNext(220, 3),
  12317. OnNext(230, 4),
  12318. OnNext(240, 5)
  12319. );
  12320. var res = scheduler.Start(() =>
  12321. e.Zip(o, (x, y) => x + y)
  12322. );
  12323. res.Messages.AssertEqual(
  12324. OnNext(210, 7),
  12325. OnNext(220, 7),
  12326. OnNext(230, 7),
  12327. OnNext(240, 7)
  12328. );
  12329. o.Subscriptions.AssertEqual(
  12330. Subscribe(200, 1000)
  12331. );
  12332. e.Subscriptions.AssertEqual(
  12333. Subscribe(200, 1000)
  12334. );
  12335. }
  12336. [Fact]
  12337. public void ZipWithEnumerable_EnumeratorThrowsMoveNext()
  12338. {
  12339. var ex = new Exception();
  12340. var scheduler = new TestScheduler();
  12341. var o1 = scheduler.CreateHotObservable(
  12342. OnNext(150, 1),
  12343. OnNext(215, 2),
  12344. OnNext(225, 4),
  12345. OnCompleted<int>(240)
  12346. );
  12347. var o2 = new MockEnumerable<int>(scheduler,
  12348. new MyEnumerable(false, ex)
  12349. );
  12350. var res = scheduler.Start(() =>
  12351. o1.Zip(o2, (x, y) => x + y)
  12352. );
  12353. res.Messages.AssertEqual(
  12354. OnError<int>(215, ex)
  12355. );
  12356. o1.Subscriptions.AssertEqual(
  12357. Subscribe(200, 215)
  12358. );
  12359. o2.Subscriptions.AssertEqual(
  12360. Subscribe(200, 215)
  12361. );
  12362. }
  12363. [Fact]
  12364. public void ZipWithEnumerable_EnumeratorThrowsCurrent()
  12365. {
  12366. var ex = new Exception();
  12367. var scheduler = new TestScheduler();
  12368. var o1 = scheduler.CreateHotObservable(
  12369. OnNext(150, 1),
  12370. OnNext(215, 2),
  12371. OnNext(225, 4),
  12372. OnCompleted<int>(240)
  12373. );
  12374. var o2 = new MockEnumerable<int>(scheduler,
  12375. new MyEnumerable(true, ex)
  12376. );
  12377. var res = scheduler.Start(() =>
  12378. o1.Zip(o2, (x, y) => x + y)
  12379. );
  12380. res.Messages.AssertEqual(
  12381. OnError<int>(215, ex)
  12382. );
  12383. o1.Subscriptions.AssertEqual(
  12384. Subscribe(200, 215)
  12385. );
  12386. o2.Subscriptions.AssertEqual(
  12387. Subscribe(200, 215)
  12388. );
  12389. }
  12390. [Fact]
  12391. public void ZipWithEnumerable_SelectorThrows()
  12392. {
  12393. var scheduler = new TestScheduler();
  12394. var o1 = scheduler.CreateHotObservable(
  12395. OnNext(150, 1),
  12396. OnNext(215, 2),
  12397. OnNext(225, 4),
  12398. OnCompleted<int>(240)
  12399. );
  12400. var o2 = new MockEnumerable<int>(scheduler,
  12401. new[] { 3, 5 }
  12402. );
  12403. var ex = new Exception();
  12404. var res = scheduler.Start(() =>
  12405. o1.Zip(o2, (x, y) =>
  12406. {
  12407. if (y == 5)
  12408. throw ex;
  12409. return x + y;
  12410. })
  12411. );
  12412. res.Messages.AssertEqual(
  12413. OnNext(215, 2 + 3),
  12414. OnError<int>(225, ex)
  12415. );
  12416. o1.Subscriptions.AssertEqual(
  12417. Subscribe(200, 225)
  12418. );
  12419. o2.Subscriptions.AssertEqual(
  12420. Subscribe(200, 225)
  12421. );
  12422. }
  12423. private IEnumerable<int> EnumerableNever(ManualResetEvent evt)
  12424. {
  12425. evt.WaitOne();
  12426. yield break;
  12427. }
  12428. private IEnumerable<int> ThrowEnumerable(bool b, Exception ex)
  12429. {
  12430. if (!b)
  12431. throw ex;
  12432. yield break;
  12433. }
  12434. class MyEnumerable : IEnumerable<int>
  12435. {
  12436. private bool _throwInCurrent;
  12437. private Exception _ex;
  12438. public MyEnumerable(bool throwInCurrent, Exception ex)
  12439. {
  12440. _throwInCurrent = throwInCurrent;
  12441. _ex = ex;
  12442. }
  12443. public IEnumerator<int> GetEnumerator()
  12444. {
  12445. return new MyEnumerator(_throwInCurrent, _ex);
  12446. }
  12447. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  12448. {
  12449. return GetEnumerator();
  12450. }
  12451. class MyEnumerator : IEnumerator<int>
  12452. {
  12453. private bool _throwInCurrent;
  12454. private Exception _ex;
  12455. public MyEnumerator(bool throwInCurrent, Exception ex)
  12456. {
  12457. _throwInCurrent = throwInCurrent;
  12458. _ex = ex;
  12459. }
  12460. public int Current
  12461. {
  12462. get
  12463. {
  12464. if (_throwInCurrent)
  12465. throw _ex;
  12466. else
  12467. return 1;
  12468. }
  12469. }
  12470. public void Dispose()
  12471. {
  12472. }
  12473. object System.Collections.IEnumerator.Current
  12474. {
  12475. get { return Current; }
  12476. }
  12477. public bool MoveNext()
  12478. {
  12479. if (!_throwInCurrent)
  12480. throw _ex;
  12481. return true;
  12482. }
  12483. public void Reset()
  12484. {
  12485. }
  12486. }
  12487. }
  12488. #endregion
  12489. #region NAry
  12490. [Fact]
  12491. public void Zip_NAry_ArgumentChecking()
  12492. {
  12493. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IEnumerable<IObservable<int>>)));
  12494. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IEnumerable<IObservable<int>>), _ => 42));
  12495. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(new[] { Observable.Return(42) }, default(Func<IList<int>, string>)));
  12496. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Zip(default(IObservable<int>[])));
  12497. }
  12498. [Fact]
  12499. public void Zip_NAry_Symmetric()
  12500. {
  12501. var scheduler = new TestScheduler();
  12502. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(250, 4), OnCompleted<int>(420) });
  12503. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnCompleted<int>(410) });
  12504. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(400) });
  12505. var res = scheduler.Start(() =>
  12506. Observable.Zip(e0, e1, e2)
  12507. );
  12508. res.Messages.AssertEqual(
  12509. OnNext<IList<int>>(230, l => l.SequenceEqual(new[] { 1, 2, 3 })),
  12510. OnNext<IList<int>>(260, l => l.SequenceEqual(new[] { 4, 5, 6 })),
  12511. OnCompleted<IList<int>>(420)
  12512. );
  12513. e0.Subscriptions.AssertEqual(
  12514. Subscribe(200, 420)
  12515. );
  12516. e1.Subscriptions.AssertEqual(
  12517. Subscribe(200, 410)
  12518. );
  12519. e2.Subscriptions.AssertEqual(
  12520. Subscribe(200, 400)
  12521. );
  12522. }
  12523. [Fact]
  12524. public void Zip_NAry_Symmetric_Selector()
  12525. {
  12526. var scheduler = new TestScheduler();
  12527. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(250, 4), OnCompleted<int>(420) });
  12528. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnCompleted<int>(410) });
  12529. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(400) });
  12530. var res = scheduler.Start(() =>
  12531. Observable.Zip(new[] { e0, e1, e2 }, xs => xs.Sum())
  12532. );
  12533. res.Messages.AssertEqual(
  12534. OnNext<int>(230, new[] { 1, 2, 3 }.Sum()),
  12535. OnNext<int>(260, new[] { 4, 5, 6 }.Sum()),
  12536. OnCompleted<int>(420)
  12537. );
  12538. e0.Subscriptions.AssertEqual(
  12539. Subscribe(200, 420)
  12540. );
  12541. e1.Subscriptions.AssertEqual(
  12542. Subscribe(200, 410)
  12543. );
  12544. e2.Subscriptions.AssertEqual(
  12545. Subscribe(200, 400)
  12546. );
  12547. }
  12548. [Fact]
  12549. public void Zip_NAry_Asymmetric()
  12550. {
  12551. var scheduler = new TestScheduler();
  12552. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(250, 4), OnCompleted<int>(270) });
  12553. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnNext(290, 7), OnNext(310, 9), OnCompleted<int>(410) });
  12554. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnNext(280, 8), OnCompleted<int>(300) });
  12555. var res = scheduler.Start(() =>
  12556. Observable.Zip(e0, e1, e2)
  12557. );
  12558. res.Messages.AssertEqual(
  12559. OnNext<IList<int>>(230, l => l.SequenceEqual(new[] { 1, 2, 3 })),
  12560. OnNext<IList<int>>(260, l => l.SequenceEqual(new[] { 4, 5, 6 })),
  12561. OnCompleted<IList<int>>(310)
  12562. );
  12563. e0.Subscriptions.AssertEqual(
  12564. Subscribe(200, 270)
  12565. );
  12566. e1.Subscriptions.AssertEqual(
  12567. Subscribe(200, 310)
  12568. );
  12569. e2.Subscriptions.AssertEqual(
  12570. Subscribe(200, 300)
  12571. );
  12572. }
  12573. [Fact]
  12574. public void Zip_NAry_Asymmetric_Selector()
  12575. {
  12576. var scheduler = new TestScheduler();
  12577. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(250, 4), OnCompleted<int>(270) });
  12578. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnNext(290, 7), OnNext(310, 9), OnCompleted<int>(410) });
  12579. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnNext(280, 8), OnCompleted<int>(300) });
  12580. var res = scheduler.Start(() =>
  12581. Observable.Zip(new[] { e0, e1, e2 }, xs => xs.Sum())
  12582. );
  12583. res.Messages.AssertEqual(
  12584. OnNext<int>(230, new[] { 1, 2, 3 }.Sum()),
  12585. OnNext<int>(260, new[] { 4, 5, 6 }.Sum()),
  12586. OnCompleted<int>(310)
  12587. );
  12588. e0.Subscriptions.AssertEqual(
  12589. Subscribe(200, 270)
  12590. );
  12591. e1.Subscriptions.AssertEqual(
  12592. Subscribe(200, 310)
  12593. );
  12594. e2.Subscriptions.AssertEqual(
  12595. Subscribe(200, 300)
  12596. );
  12597. }
  12598. [Fact]
  12599. public void Zip_NAry_Error()
  12600. {
  12601. var ex = new Exception();
  12602. var scheduler = new TestScheduler();
  12603. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnError<int>(250, ex) });
  12604. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnCompleted<int>(410) });
  12605. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(400) });
  12606. var res = scheduler.Start(() =>
  12607. Observable.Zip(e0, e1, e2)
  12608. );
  12609. res.Messages.AssertEqual(
  12610. OnNext<IList<int>>(230, l => l.SequenceEqual(new[] { 1, 2, 3 })),
  12611. OnError<IList<int>>(250, ex)
  12612. );
  12613. e0.Subscriptions.AssertEqual(
  12614. Subscribe(200, 250)
  12615. );
  12616. e1.Subscriptions.AssertEqual(
  12617. Subscribe(200, 250)
  12618. );
  12619. e2.Subscriptions.AssertEqual(
  12620. Subscribe(200, 250)
  12621. );
  12622. }
  12623. [Fact]
  12624. public void Zip_NAry_Error_Selector()
  12625. {
  12626. var ex = new Exception();
  12627. var scheduler = new TestScheduler();
  12628. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnError<int>(250, ex) });
  12629. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnCompleted<int>(410) });
  12630. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(400) });
  12631. var res = scheduler.Start(() =>
  12632. Observable.Zip(new[] { e0, e1, e2 }, xs => xs.Sum())
  12633. );
  12634. res.Messages.AssertEqual(
  12635. OnNext<int>(230, new[] { 1, 2, 3 }.Sum()),
  12636. OnError<int>(250, ex)
  12637. );
  12638. e0.Subscriptions.AssertEqual(
  12639. Subscribe(200, 250)
  12640. );
  12641. e1.Subscriptions.AssertEqual(
  12642. Subscribe(200, 250)
  12643. );
  12644. e2.Subscriptions.AssertEqual(
  12645. Subscribe(200, 250)
  12646. );
  12647. }
  12648. [Fact]
  12649. public void Zip_NAry_Enumerable_Simple()
  12650. {
  12651. var scheduler = new TestScheduler();
  12652. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnNext(250, 4), OnCompleted<int>(420) });
  12653. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnNext(240, 5), OnCompleted<int>(410) });
  12654. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(230, 3), OnNext(260, 6), OnCompleted<int>(400) });
  12655. var started = default(long);
  12656. var xss = GetSources(() => started = scheduler.Clock, e0, e1, e2).Select(xs => (IObservable<int>)xs);
  12657. var res = scheduler.Start(() =>
  12658. Observable.Zip(xss)
  12659. );
  12660. Assert.Equal(200, started);
  12661. res.Messages.AssertEqual(
  12662. OnNext<IList<int>>(230, l => l.SequenceEqual(new[] { 1, 2, 3 })),
  12663. OnNext<IList<int>>(260, l => l.SequenceEqual(new[] { 4, 5, 6 })),
  12664. OnCompleted<IList<int>>(420)
  12665. );
  12666. e0.Subscriptions.AssertEqual(
  12667. Subscribe(200, 420)
  12668. );
  12669. e1.Subscriptions.AssertEqual(
  12670. Subscribe(200, 410)
  12671. );
  12672. e2.Subscriptions.AssertEqual(
  12673. Subscribe(200, 400)
  12674. );
  12675. }
  12676. [Fact]
  12677. public void Zip_NAry_Enumerable_Throws()
  12678. {
  12679. var ex = new Exception();
  12680. var xss = GetSources(ex, Observable.Return(42));
  12681. var res = Observable.Zip(xss);
  12682. ReactiveAssert.Throws(ex, () => res.Subscribe(_ => { }));
  12683. }
  12684. private IEnumerable<ITestableObservable<int>> GetSources(Action start, params ITestableObservable<int>[] sources)
  12685. {
  12686. start();
  12687. foreach (var xs in sources)
  12688. yield return xs;
  12689. }
  12690. private IEnumerable<IObservable<T>> GetSources<T>(Exception ex, params IObservable<T>[] sources)
  12691. {
  12692. foreach (var xs in sources)
  12693. yield return xs;
  12694. throw ex;
  12695. }
  12696. #endregion
  12697. #region AtLeastOneThrows
  12698. [Fact]
  12699. public void Zip_AtLeastOneThrows4()
  12700. {
  12701. var ex = new Exception();
  12702. var scheduler = new TestScheduler();
  12703. var e0 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(210, 1), OnCompleted<int>(400) });
  12704. var e1 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(220, 2), OnCompleted<int>(400) });
  12705. var e2 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnError<int>(230, ex) });
  12706. var e3 = scheduler.CreateHotObservable(new[] { OnNext(150, 1), OnNext(240, 4), OnCompleted<int>(400) });
  12707. var res = scheduler.Start(() =>
  12708. Observable.Zip(e0, e1, e2, e3, (_0, _1, _2, _3) => 42)
  12709. );
  12710. res.Messages.AssertEqual(
  12711. OnError<int>(230, ex)
  12712. );
  12713. e0.Subscriptions.AssertEqual(Subscribe(200, 230));
  12714. e1.Subscriptions.AssertEqual(Subscribe(200, 230));
  12715. e2.Subscriptions.AssertEqual(Subscribe(200, 230));
  12716. e3.Subscriptions.AssertEqual(Subscribe(200, 230));
  12717. }
  12718. #endregion
  12719. #endregion
  12720. }
  12721. }