1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377 |
- // Copyright 2005, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // The Google C++ Testing and Mocking Framework (Google Test)
- //
- // This header file defines the public API for Google Test. It should be
- // included by any test program that uses Google Test.
- //
- // IMPORTANT NOTE: Due to limitation of the C++ language, we have to
- // leave some internal implementation details in this header file.
- // They are clearly marked by comments like this:
- //
- // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- //
- // Such code is NOT meant to be used by a user directly, and is subject
- // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
- // program!
- //
- // Acknowledgment: Google Test borrowed the idea of automatic test
- // registration from Barthelemy Dagenais' (barthelemy@prologique.com)
- // easyUnit framework.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_H_
- #include <cstddef>
- #include <limits>
- #include <memory>
- #include <ostream>
- #include <type_traits>
- #include <vector>
- // Copyright 2005, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // The Google C++ Testing and Mocking Framework (Google Test)
- //
- // This header file declares functions and macros used internally by
- // Google Test. They are subject to change without notice.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
- // Copyright 2005, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // Low-level types and utilities for porting Google Test to various
- // platforms. All macros ending with _ and symbols defined in an
- // internal namespace are subject to change without notice. Code
- // outside Google Test MUST NOT USE THEM DIRECTLY. Macros that don't
- // end with _ are part of Google Test's public API and can be used by
- // code outside Google Test.
- //
- // This file is fundamental to Google Test. All other Google Test source
- // files are expected to #include this. Therefore, it cannot #include
- // any other Google Test header.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
- // Environment-describing macros
- // -----------------------------
- //
- // Google Test can be used in many different environments. Macros in
- // this section tell Google Test what kind of environment it is being
- // used in, such that Google Test can provide environment-specific
- // features and implementations.
- //
- // Google Test tries to automatically detect the properties of its
- // environment, so users usually don't need to worry about these
- // macros. However, the automatic detection is not perfect.
- // Sometimes it's necessary for a user to define some of the following
- // macros in the build script to override Google Test's decisions.
- //
- // If the user doesn't define a macro in the list, Google Test will
- // provide a default definition. After this header is #included, all
- // macros in this list will be defined to either 1 or 0.
- //
- // Notes to maintainers:
- // - Each macro here is a user-tweakable knob; do not grow the list
- // lightly.
- // - Use #if to key off these macros. Don't use #ifdef or "#if
- // defined(...)", which will not work as these macros are ALWAYS
- // defined.
- //
- // GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2)
- // is/isn't available.
- // GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions
- // are enabled.
- // GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular
- // expressions are/aren't available.
- // GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h>
- // is/isn't available.
- // GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't
- // enabled.
- // GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that
- // std::wstring does/doesn't work (Google Test can
- // be used where std::wstring is unavailable).
- // GTEST_HAS_SEH - Define it to 1/0 to indicate whether the
- // compiler supports Microsoft's "Structured
- // Exception Handling".
- // GTEST_HAS_STREAM_REDIRECTION
- // - Define it to 1/0 to indicate whether the
- // platform supports I/O stream redirection using
- // dup() and dup2().
- // GTEST_LINKED_AS_SHARED_LIBRARY
- // - Define to 1 when compiling tests that use
- // Google Test as a shared library (known as
- // DLL on Windows).
- // GTEST_CREATE_SHARED_LIBRARY
- // - Define to 1 when compiling Google Test itself
- // as a shared library.
- // GTEST_DEFAULT_DEATH_TEST_STYLE
- // - The default value of --gtest_death_test_style.
- // The legacy default has been "fast" in the open
- // source version since 2008. The recommended value
- // is "threadsafe", and can be set in
- // custom/gtest-port.h.
- // Platform-indicating macros
- // --------------------------
- //
- // Macros indicating the platform on which Google Test is being used
- // (a macro is defined to 1 if compiled on the given platform;
- // otherwise UNDEFINED -- it's never defined to 0.). Google Test
- // defines these macros automatically. Code outside Google Test MUST
- // NOT define them.
- //
- // GTEST_OS_AIX - IBM AIX
- // GTEST_OS_CYGWIN - Cygwin
- // GTEST_OS_DRAGONFLY - DragonFlyBSD
- // GTEST_OS_FREEBSD - FreeBSD
- // GTEST_OS_FUCHSIA - Fuchsia
- // GTEST_OS_GNU_KFREEBSD - GNU/kFreeBSD
- // GTEST_OS_HAIKU - Haiku
- // GTEST_OS_HPUX - HP-UX
- // GTEST_OS_LINUX - Linux
- // GTEST_OS_LINUX_ANDROID - Google Android
- // GTEST_OS_MAC - Mac OS X
- // GTEST_OS_IOS - iOS
- // GTEST_OS_NACL - Google Native Client (NaCl)
- // GTEST_OS_NETBSD - NetBSD
- // GTEST_OS_OPENBSD - OpenBSD
- // GTEST_OS_OS2 - OS/2
- // GTEST_OS_QNX - QNX
- // GTEST_OS_SOLARIS - Sun Solaris
- // GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
- // GTEST_OS_WINDOWS_DESKTOP - Windows Desktop
- // GTEST_OS_WINDOWS_MINGW - MinGW
- // GTEST_OS_WINDOWS_MOBILE - Windows Mobile
- // GTEST_OS_WINDOWS_PHONE - Windows Phone
- // GTEST_OS_WINDOWS_RT - Windows Store App/WinRT
- // GTEST_OS_ZOS - z/OS
- //
- // Among the platforms, Cygwin, Linux, Mac OS X, and Windows have the
- // most stable support. Since core members of the Google Test project
- // don't have access to other platforms, support for them may be less
- // stable. If you notice any problems on your platform, please notify
- // googletestframework@googlegroups.com (patches for fixing them are
- // even more welcome!).
- //
- // It is possible that none of the GTEST_OS_* macros are defined.
- // Feature-indicating macros
- // -------------------------
- //
- // Macros indicating which Google Test features are available (a macro
- // is defined to 1 if the corresponding feature is supported;
- // otherwise UNDEFINED -- it's never defined to 0.). Google Test
- // defines these macros automatically. Code outside Google Test MUST
- // NOT define them.
- //
- // These macros are public so that portable tests can be written.
- // Such tests typically surround code using a feature with an #if
- // which controls that code. For example:
- //
- // #if GTEST_HAS_DEATH_TEST
- // EXPECT_DEATH(DoSomethingDeadly());
- // #endif
- //
- // GTEST_HAS_DEATH_TEST - death tests
- // GTEST_HAS_TYPED_TEST - typed tests
- // GTEST_HAS_TYPED_TEST_P - type-parameterized tests
- // GTEST_IS_THREADSAFE - Google Test is thread-safe.
- // GOOGLETEST_CM0007 DO NOT DELETE
- // GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with
- // GTEST_HAS_POSIX_RE (see above) which users can
- // define themselves.
- // GTEST_USES_SIMPLE_RE - our own simple regex is used;
- // the above RE\b(s) are mutually exclusive.
- // Misc public macros
- // ------------------
- //
- // GTEST_FLAG(flag_name) - references the variable corresponding to
- // the given Google Test flag.
- // Internal utilities
- // ------------------
- //
- // The following macros and utilities are for Google Test's INTERNAL
- // use only. Code outside Google Test MUST NOT USE THEM DIRECTLY.
- //
- // Macros for basic C++ coding:
- // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
- // GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a
- // variable don't have to be used.
- // GTEST_DISALLOW_ASSIGN_ - disables copy operator=.
- // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
- // GTEST_DISALLOW_MOVE_ASSIGN_ - disables move operator=.
- // GTEST_DISALLOW_MOVE_AND_ASSIGN_ - disables move ctor and operator=.
- // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used.
- // GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is
- // suppressed (constant conditional).
- // GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127
- // is suppressed.
- // GTEST_INTERNAL_HAS_ANY - for enabling UniversalPrinter<std::any> or
- // UniversalPrinter<absl::any> specializations.
- // GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional>
- // or
- // UniversalPrinter<absl::optional>
- // specializations.
- // GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or
- // Matcher<absl::string_view>
- // specializations.
- // GTEST_INTERNAL_HAS_VARIANT - for enabling UniversalPrinter<std::variant> or
- // UniversalPrinter<absl::variant>
- // specializations.
- //
- // Synchronization:
- // Mutex, MutexLock, ThreadLocal, GetThreadCount()
- // - synchronization primitives.
- //
- // Regular expressions:
- // RE - a simple regular expression class using the POSIX
- // Extended Regular Expression syntax on UNIX-like platforms
- // GOOGLETEST_CM0008 DO NOT DELETE
- // or a reduced regular exception syntax on other
- // platforms, including Windows.
- // Logging:
- // GTEST_LOG_() - logs messages at the specified severity level.
- // LogToStderr() - directs all log messages to stderr.
- // FlushInfoLog() - flushes informational log messages.
- //
- // Stdout and stderr capturing:
- // CaptureStdout() - starts capturing stdout.
- // GetCapturedStdout() - stops capturing stdout and returns the captured
- // string.
- // CaptureStderr() - starts capturing stderr.
- // GetCapturedStderr() - stops capturing stderr and returns the captured
- // string.
- //
- // Integer types:
- // TypeWithSize - maps an integer to a int type.
- // TimeInMillis - integers of known sizes.
- // BiggestInt - the biggest signed integer type.
- //
- // Command-line utilities:
- // GTEST_DECLARE_*() - declares a flag.
- // GTEST_DEFINE_*() - defines a flag.
- // GetInjectableArgvs() - returns the command line as a vector of strings.
- //
- // Environment variable utilities:
- // GetEnv() - gets the value of an environment variable.
- // BoolFromGTestEnv() - parses a bool environment variable.
- // Int32FromGTestEnv() - parses an int32_t environment variable.
- // StringFromGTestEnv() - parses a string environment variable.
- //
- // Deprecation warnings:
- // GTEST_INTERNAL_DEPRECATED(message) - attribute marking a function as
- // deprecated; calling a marked function
- // should generate a compiler warning
- #include <ctype.h> // for isspace, etc
- #include <stddef.h> // for ptrdiff_t
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <cerrno>
- #include <cstdint>
- #include <limits>
- #include <type_traits>
- #ifndef _WIN32_WCE
- # include <sys/types.h>
- # include <sys/stat.h>
- #endif // !_WIN32_WCE
- #if defined __APPLE__
- # include <AvailabilityMacros.h>
- # include <TargetConditionals.h>
- #endif
- #include <iostream> // NOLINT
- #include <locale>
- #include <memory>
- #include <string> // NOLINT
- #include <tuple>
- #include <vector> // NOLINT
- // Copyright 2015, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // Injection point for custom user configurations. See README for details
- //
- // ** Custom implementation starts here **
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
- // Copyright 2015, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // The Google C++ Testing and Mocking Framework (Google Test)
- //
- // This header file defines the GTEST_OS_* macro.
- // It is separate from gtest-port.h so that custom/gtest-port.h can include it.
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
- // Determines the platform on which Google Test is compiled.
- #ifdef __CYGWIN__
- # define GTEST_OS_CYGWIN 1
- # elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__)
- # define GTEST_OS_WINDOWS_MINGW 1
- # define GTEST_OS_WINDOWS 1
- #elif defined _WIN32
- # define GTEST_OS_WINDOWS 1
- # ifdef _WIN32_WCE
- # define GTEST_OS_WINDOWS_MOBILE 1
- # elif defined(WINAPI_FAMILY)
- # include <winapifamily.h>
- # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
- # define GTEST_OS_WINDOWS_DESKTOP 1
- # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
- # define GTEST_OS_WINDOWS_PHONE 1
- # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
- # define GTEST_OS_WINDOWS_RT 1
- # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE)
- # define GTEST_OS_WINDOWS_PHONE 1
- # define GTEST_OS_WINDOWS_TV_TITLE 1
- # else
- // WINAPI_FAMILY defined but no known partition matched.
- // Default to desktop.
- # define GTEST_OS_WINDOWS_DESKTOP 1
- # endif
- # else
- # define GTEST_OS_WINDOWS_DESKTOP 1
- # endif // _WIN32_WCE
- #elif defined __OS2__
- # define GTEST_OS_OS2 1
- #elif defined __APPLE__
- # define GTEST_OS_MAC 1
- # include <TargetConditionals.h>
- # if TARGET_OS_IPHONE
- # define GTEST_OS_IOS 1
- # endif
- #elif defined __DragonFly__
- # define GTEST_OS_DRAGONFLY 1
- #elif defined __FreeBSD__
- # define GTEST_OS_FREEBSD 1
- #elif defined __Fuchsia__
- # define GTEST_OS_FUCHSIA 1
- #elif defined(__GLIBC__) && defined(__FreeBSD_kernel__)
- # define GTEST_OS_GNU_KFREEBSD 1
- #elif defined __linux__
- # define GTEST_OS_LINUX 1
- # if defined __ANDROID__
- # define GTEST_OS_LINUX_ANDROID 1
- # endif
- #elif defined __MVS__
- # define GTEST_OS_ZOS 1
- #elif defined(__sun) && defined(__SVR4)
- # define GTEST_OS_SOLARIS 1
- #elif defined(_AIX)
- # define GTEST_OS_AIX 1
- #elif defined(__hpux)
- # define GTEST_OS_HPUX 1
- #elif defined __native_client__
- # define GTEST_OS_NACL 1
- #elif defined __NetBSD__
- # define GTEST_OS_NETBSD 1
- #elif defined __OpenBSD__
- # define GTEST_OS_OPENBSD 1
- #elif defined __QNX__
- # define GTEST_OS_QNX 1
- #elif defined(__HAIKU__)
- #define GTEST_OS_HAIKU 1
- #elif defined ESP8266
- #define GTEST_OS_ESP8266 1
- #elif defined ESP32
- #define GTEST_OS_ESP32 1
- #elif defined(__XTENSA__)
- #define GTEST_OS_XTENSA 1
- #endif // __CYGWIN__
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
- #if !defined(GTEST_DEV_EMAIL_)
- # define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
- # define GTEST_FLAG_PREFIX_ "gtest_"
- # define GTEST_FLAG_PREFIX_DASH_ "gtest-"
- # define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
- # define GTEST_NAME_ "Google Test"
- # define GTEST_PROJECT_URL_ "https://github.com/google/googletest/"
- #endif // !defined(GTEST_DEV_EMAIL_)
- #if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
- # define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest"
- #endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
- // Determines the version of gcc that is used to compile this.
- #ifdef __GNUC__
- // 40302 means version 4.3.2.
- # define GTEST_GCC_VER_ \
- (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
- #endif // __GNUC__
- // Macros for disabling Microsoft Visual C++ warnings.
- //
- // GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)
- // /* code that triggers warnings C4800 and C4385 */
- // GTEST_DISABLE_MSC_WARNINGS_POP_()
- #if defined(_MSC_VER)
- # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \
- __pragma(warning(push)) \
- __pragma(warning(disable: warnings))
- # define GTEST_DISABLE_MSC_WARNINGS_POP_() \
- __pragma(warning(pop))
- #else
- // Not all compilers are MSVC
- # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
- # define GTEST_DISABLE_MSC_WARNINGS_POP_()
- #endif
- // Clang on Windows does not understand MSVC's pragma warning.
- // We need clang-specific way to disable function deprecation warning.
- #ifdef __clang__
- # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \
- _Pragma("clang diagnostic push") \
- _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \
- _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"")
- #define GTEST_DISABLE_MSC_DEPRECATED_POP_() \
- _Pragma("clang diagnostic pop")
- #else
- # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996)
- # define GTEST_DISABLE_MSC_DEPRECATED_POP_() \
- GTEST_DISABLE_MSC_WARNINGS_POP_()
- #endif
- // Brings in definitions for functions used in the testing::internal::posix
- // namespace (read, write, close, chdir, isatty, stat). We do not currently
- // use them on Windows Mobile.
- #if GTEST_OS_WINDOWS
- # if !GTEST_OS_WINDOWS_MOBILE
- # include <direct.h>
- # include <io.h>
- # endif
- // In order to avoid having to include <windows.h>, use forward declaration
- #if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)
- // MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two
- // separate (equivalent) structs, instead of using typedef
- typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
- #else
- // Assume CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.
- // This assumption is verified by
- // WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.
- typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
- #endif
- #elif GTEST_OS_XTENSA
- #include <unistd.h>
- // Xtensa toolchains define strcasecmp in the string.h header instead of
- // strings.h. string.h is already included.
- #else
- // This assumes that non-Windows OSes provide unistd.h. For OSes where this
- // is not the case, we need to include headers that provide the functions
- // mentioned above.
- # include <unistd.h>
- # include <strings.h>
- #endif // GTEST_OS_WINDOWS
- #if GTEST_OS_LINUX_ANDROID
- // Used to define __ANDROID_API__ matching the target NDK API level.
- # include <android/api-level.h> // NOLINT
- #endif
- // Defines this to true if and only if Google Test can use POSIX regular
- // expressions.
- #ifndef GTEST_HAS_POSIX_RE
- # if GTEST_OS_LINUX_ANDROID
- // On Android, <regex.h> is only available starting with Gingerbread.
- # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
- # else
- #define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS && !GTEST_OS_XTENSA)
- # endif
- #endif
- #if GTEST_USES_PCRE
- // The appropriate headers have already been included.
- #elif GTEST_HAS_POSIX_RE
- // On some platforms, <regex.h> needs someone to define size_t, and
- // won't compile otherwise. We can #include it here as we already
- // included <stdlib.h>, which is guaranteed to define size_t through
- // <stddef.h>.
- # include <regex.h> // NOLINT
- # define GTEST_USES_POSIX_RE 1
- #elif GTEST_OS_WINDOWS
- // <regex.h> is not available on Windows. Use our own simple regex
- // implementation instead.
- # define GTEST_USES_SIMPLE_RE 1
- #else
- // <regex.h> may not be available on this platform. Use our own
- // simple regex implementation instead.
- # define GTEST_USES_SIMPLE_RE 1
- #endif // GTEST_USES_PCRE
- #ifndef GTEST_HAS_EXCEPTIONS
- // The user didn't tell us whether exceptions are enabled, so we need
- // to figure it out.
- # if defined(_MSC_VER) && defined(_CPPUNWIND)
- // MSVC defines _CPPUNWIND to 1 if and only if exceptions are enabled.
- # define GTEST_HAS_EXCEPTIONS 1
- # elif defined(__BORLANDC__)
- // C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS
- // macro to enable exceptions, so we'll do the same.
- // Assumes that exceptions are enabled by default.
- # ifndef _HAS_EXCEPTIONS
- # define _HAS_EXCEPTIONS 1
- # endif // _HAS_EXCEPTIONS
- # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
- # elif defined(__clang__)
- // clang defines __EXCEPTIONS if and only if exceptions are enabled before clang
- // 220714, but if and only if cleanups are enabled after that. In Obj-C++ files,
- // there can be cleanups for ObjC exceptions which also need cleanups, even if
- // C++ exceptions are disabled. clang has __has_feature(cxx_exceptions) which
- // checks for C++ exceptions starting at clang r206352, but which checked for
- // cleanups prior to that. To reliably check for C++ exception availability with
- // clang, check for
- // __EXCEPTIONS && __has_feature(cxx_exceptions).
- # define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))
- # elif defined(__GNUC__) && __EXCEPTIONS
- // gcc defines __EXCEPTIONS to 1 if and only if exceptions are enabled.
- # define GTEST_HAS_EXCEPTIONS 1
- # elif defined(__SUNPRO_CC)
- // Sun Pro CC supports exceptions. However, there is no compile-time way of
- // detecting whether they are enabled or not. Therefore, we assume that
- // they are enabled unless the user tells us otherwise.
- # define GTEST_HAS_EXCEPTIONS 1
- # elif defined(__IBMCPP__) && __EXCEPTIONS
- // xlC defines __EXCEPTIONS to 1 if and only if exceptions are enabled.
- # define GTEST_HAS_EXCEPTIONS 1
- # elif defined(__HP_aCC)
- // Exception handling is in effect by default in HP aCC compiler. It has to
- // be turned of by +noeh compiler option if desired.
- # define GTEST_HAS_EXCEPTIONS 1
- # else
- // For other compilers, we assume exceptions are disabled to be
- // conservative.
- # define GTEST_HAS_EXCEPTIONS 0
- # endif // defined(_MSC_VER) || defined(__BORLANDC__)
- #endif // GTEST_HAS_EXCEPTIONS
- #ifndef GTEST_HAS_STD_WSTRING
- // The user didn't tell us whether ::std::wstring is available, so we need
- // to figure it out.
- // Cygwin 1.7 and below doesn't support ::std::wstring.
- // Solaris' libc++ doesn't support it either. Android has
- // no support for it at least as recent as Froyo (2.2).
- #define GTEST_HAS_STD_WSTRING \
- (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
- GTEST_OS_HAIKU || GTEST_OS_ESP32 || GTEST_OS_ESP8266 || GTEST_OS_XTENSA))
- #endif // GTEST_HAS_STD_WSTRING
- // Determines whether RTTI is available.
- #ifndef GTEST_HAS_RTTI
- // The user didn't tell us whether RTTI is enabled, so we need to
- // figure it out.
- # ifdef _MSC_VER
- #ifdef _CPPRTTI // MSVC defines this macro if and only if RTTI is enabled.
- # define GTEST_HAS_RTTI 1
- # else
- # define GTEST_HAS_RTTI 0
- # endif
- // Starting with version 4.3.2, gcc defines __GXX_RTTI if and only if RTTI is
- // enabled.
- # elif defined(__GNUC__)
- # ifdef __GXX_RTTI
- // When building against STLport with the Android NDK and with
- // -frtti -fno-exceptions, the build fails at link time with undefined
- // references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
- // so disable RTTI when detected.
- # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
- !defined(__EXCEPTIONS)
- # define GTEST_HAS_RTTI 0
- # else
- # define GTEST_HAS_RTTI 1
- # endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
- # else
- # define GTEST_HAS_RTTI 0
- # endif // __GXX_RTTI
- // Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
- // using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
- // first version with C++ support.
- # elif defined(__clang__)
- # define GTEST_HAS_RTTI __has_feature(cxx_rtti)
- // Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
- // both the typeid and dynamic_cast features are present.
- # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
- # ifdef __RTTI_ALL__
- # define GTEST_HAS_RTTI 1
- # else
- # define GTEST_HAS_RTTI 0
- # endif
- # else
- // For all other compilers, we assume RTTI is enabled.
- # define GTEST_HAS_RTTI 1
- # endif // _MSC_VER
- #endif // GTEST_HAS_RTTI
- // It's this header's responsibility to #include <typeinfo> when RTTI
- // is enabled.
- #if GTEST_HAS_RTTI
- # include <typeinfo>
- #endif
- // Determines whether Google Test can use the pthreads library.
- #ifndef GTEST_HAS_PTHREAD
- // The user didn't tell us explicitly, so we make reasonable assumptions about
- // which platforms have pthreads support.
- //
- // To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
- // to your compiler flags.
- #define GTEST_HAS_PTHREAD \
- (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \
- GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \
- GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD || \
- GTEST_OS_HAIKU)
- #endif // GTEST_HAS_PTHREAD
- #if GTEST_HAS_PTHREAD
- // gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
- // true.
- # include <pthread.h> // NOLINT
- // For timespec and nanosleep, used below.
- # include <time.h> // NOLINT
- #endif
- // Determines whether clone(2) is supported.
- // Usually it will only be available on Linux, excluding
- // Linux on the Itanium architecture.
- // Also see http://linux.die.net/man/2/clone.
- #ifndef GTEST_HAS_CLONE
- // The user didn't tell us, so we need to figure it out.
- # if GTEST_OS_LINUX && !defined(__ia64__)
- # if GTEST_OS_LINUX_ANDROID
- // On Android, clone() became available at different API levels for each 32-bit
- // architecture.
- # if defined(__LP64__) || \
- (defined(__arm__) && __ANDROID_API__ >= 9) || \
- (defined(__mips__) && __ANDROID_API__ >= 12) || \
- (defined(__i386__) && __ANDROID_API__ >= 17)
- # define GTEST_HAS_CLONE 1
- # else
- # define GTEST_HAS_CLONE 0
- # endif
- # else
- # define GTEST_HAS_CLONE 1
- # endif
- # else
- # define GTEST_HAS_CLONE 0
- # endif // GTEST_OS_LINUX && !defined(__ia64__)
- #endif // GTEST_HAS_CLONE
- // Determines whether to support stream redirection. This is used to test
- // output correctness and to implement death tests.
- #ifndef GTEST_HAS_STREAM_REDIRECTION
- // By default, we assume that stream redirection is supported on all
- // platforms except known mobile ones.
- #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
- GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA
- # define GTEST_HAS_STREAM_REDIRECTION 0
- # else
- # define GTEST_HAS_STREAM_REDIRECTION 1
- # endif // !GTEST_OS_WINDOWS_MOBILE
- #endif // GTEST_HAS_STREAM_REDIRECTION
- // Determines whether to support death tests.
- // pops up a dialog window that cannot be suppressed programmatically.
- #if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
- (GTEST_OS_MAC && !GTEST_OS_IOS) || \
- (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW || \
- GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \
- GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \
- GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU)
- # define GTEST_HAS_DEATH_TEST 1
- #endif
- // Determines whether to support type-driven tests.
- // Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
- // Sun Pro CC, IBM Visual Age, and HP aCC support.
- #if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \
- defined(__IBMCPP__) || defined(__HP_aCC)
- # define GTEST_HAS_TYPED_TEST 1
- # define GTEST_HAS_TYPED_TEST_P 1
- #endif
- // Determines whether the system compiler uses UTF-16 for encoding wide strings.
- #define GTEST_WIDE_STRING_USES_UTF16_ \
- (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2)
- // Determines whether test results can be streamed to a socket.
- #if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \
- GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD
- # define GTEST_CAN_STREAM_RESULTS_ 1
- #endif
- // Defines some utility macros.
- // The GNU compiler emits a warning if nested "if" statements are followed by
- // an "else" statement and braces are not used to explicitly disambiguate the
- // "else" binding. This leads to problems with code like:
- //
- // if (gate)
- // ASSERT_*(condition) << "Some message";
- //
- // The "switch (0) case 0:" idiom is used to suppress this.
- #ifdef __INTEL_COMPILER
- # define GTEST_AMBIGUOUS_ELSE_BLOCKER_
- #else
- # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT
- #endif
- // Use this annotation at the end of a struct/class definition to
- // prevent the compiler from optimizing away instances that are never
- // used. This is useful when all interesting logic happens inside the
- // c'tor and / or d'tor. Example:
- //
- // struct Foo {
- // Foo() { ... }
- // } GTEST_ATTRIBUTE_UNUSED_;
- //
- // Also use it after a variable or parameter declaration to tell the
- // compiler the variable/parameter does not have to be used.
- #if defined(__GNUC__) && !defined(COMPILER_ICC)
- # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
- #elif defined(__clang__)
- # if __has_attribute(unused)
- # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
- # endif
- #endif
- #ifndef GTEST_ATTRIBUTE_UNUSED_
- # define GTEST_ATTRIBUTE_UNUSED_
- #endif
- // Use this annotation before a function that takes a printf format string.
- #if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)
- # if defined(__MINGW_PRINTF_FORMAT)
- // MinGW has two different printf implementations. Ensure the format macro
- // matches the selected implementation. See
- // https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/.
- # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
- __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \
- first_to_check)))
- # else
- # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
- __attribute__((__format__(__printf__, string_index, first_to_check)))
- # endif
- #else
- # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check)
- #endif
- // A macro to disallow copy operator=
- // This should be used in the private: declarations for a class.
- #define GTEST_DISALLOW_ASSIGN_(type) \
- type& operator=(type const &) = delete
- // A macro to disallow copy constructor and operator=
- // This should be used in the private: declarations for a class.
- #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
- type(type const&) = delete; \
- type& operator=(type const&) = delete
- // A macro to disallow move operator=
- // This should be used in the private: declarations for a class.
- #define GTEST_DISALLOW_MOVE_ASSIGN_(type) \
- type& operator=(type &&) noexcept = delete
- // A macro to disallow move constructor and operator=
- // This should be used in the private: declarations for a class.
- #define GTEST_DISALLOW_MOVE_AND_ASSIGN_(type) \
- type(type&&) noexcept = delete; \
- type& operator=(type&&) noexcept = delete
- // Tell the compiler to warn about unused return values for functions declared
- // with this macro. The macro should be used on function declarations
- // following the argument list:
- //
- // Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
- #if defined(__GNUC__) && !defined(COMPILER_ICC)
- # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
- #else
- # define GTEST_MUST_USE_RESULT_
- #endif // __GNUC__ && !COMPILER_ICC
- // MS C++ compiler emits warning when a conditional expression is compile time
- // constant. In some contexts this warning is false positive and needs to be
- // suppressed. Use the following two macros in such cases:
- //
- // GTEST_INTENTIONAL_CONST_COND_PUSH_()
- // while (true) {
- // GTEST_INTENTIONAL_CONST_COND_POP_()
- // }
- # define GTEST_INTENTIONAL_CONST_COND_PUSH_() \
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127)
- # define GTEST_INTENTIONAL_CONST_COND_POP_() \
- GTEST_DISABLE_MSC_WARNINGS_POP_()
- // Determine whether the compiler supports Microsoft's Structured Exception
- // Handling. This is supported by several Windows compilers but generally
- // does not exist on any other system.
- #ifndef GTEST_HAS_SEH
- // The user didn't tell us, so we need to figure it out.
- # if defined(_MSC_VER) || defined(__BORLANDC__)
- // These two compilers are known to support SEH.
- # define GTEST_HAS_SEH 1
- # else
- // Assume no SEH.
- # define GTEST_HAS_SEH 0
- # endif
- #endif // GTEST_HAS_SEH
- #ifndef GTEST_IS_THREADSAFE
- #define GTEST_IS_THREADSAFE \
- (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \
- (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \
- GTEST_HAS_PTHREAD)
- #endif // GTEST_IS_THREADSAFE
- // GTEST_API_ qualifies all symbols that must be exported. The definitions below
- // are guarded by #ifndef to give embedders a chance to define GTEST_API_ in
- // gtest/internal/custom/gtest-port.h
- #ifndef GTEST_API_
- #ifdef _MSC_VER
- # if GTEST_LINKED_AS_SHARED_LIBRARY
- # define GTEST_API_ __declspec(dllimport)
- # elif GTEST_CREATE_SHARED_LIBRARY
- # define GTEST_API_ __declspec(dllexport)
- # endif
- #elif __GNUC__ >= 4 || defined(__clang__)
- # define GTEST_API_ __attribute__((visibility ("default")))
- #endif // _MSC_VER
- #endif // GTEST_API_
- #ifndef GTEST_API_
- # define GTEST_API_
- #endif // GTEST_API_
- #ifndef GTEST_DEFAULT_DEATH_TEST_STYLE
- # define GTEST_DEFAULT_DEATH_TEST_STYLE "fast"
- #endif // GTEST_DEFAULT_DEATH_TEST_STYLE
- #ifdef __GNUC__
- // Ask the compiler to never inline a given function.
- # define GTEST_NO_INLINE_ __attribute__((noinline))
- #else
- # define GTEST_NO_INLINE_
- #endif
- // _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
- #if !defined(GTEST_HAS_CXXABI_H_)
- # if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER))
- # define GTEST_HAS_CXXABI_H_ 1
- # else
- # define GTEST_HAS_CXXABI_H_ 0
- # endif
- #endif
- // A function level attribute to disable checking for use of uninitialized
- // memory when built with MemorySanitizer.
- #if defined(__clang__)
- # if __has_feature(memory_sanitizer)
- # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \
- __attribute__((no_sanitize_memory))
- # else
- # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
- # endif // __has_feature(memory_sanitizer)
- #else
- # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
- #endif // __clang__
- // A function level attribute to disable AddressSanitizer instrumentation.
- #if defined(__clang__)
- # if __has_feature(address_sanitizer)
- # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \
- __attribute__((no_sanitize_address))
- # else
- # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
- # endif // __has_feature(address_sanitizer)
- #else
- # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
- #endif // __clang__
- // A function level attribute to disable HWAddressSanitizer instrumentation.
- #if defined(__clang__)
- # if __has_feature(hwaddress_sanitizer)
- # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ \
- __attribute__((no_sanitize("hwaddress")))
- # else
- # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
- # endif // __has_feature(hwaddress_sanitizer)
- #else
- # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
- #endif // __clang__
- // A function level attribute to disable ThreadSanitizer instrumentation.
- #if defined(__clang__)
- # if __has_feature(thread_sanitizer)
- # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \
- __attribute__((no_sanitize_thread))
- # else
- # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
- # endif // __has_feature(thread_sanitizer)
- #else
- # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
- #endif // __clang__
- namespace testing {
- class Message;
- // Legacy imports for backwards compatibility.
- // New code should use std:: names directly.
- using std::get;
- using std::make_tuple;
- using std::tuple;
- using std::tuple_element;
- using std::tuple_size;
- namespace internal {
- // A secret type that Google Test users don't know about. It has no
- // definition on purpose. Therefore it's impossible to create a
- // Secret object, which is what we want.
- class Secret;
- // The GTEST_COMPILE_ASSERT_ is a legacy macro used to verify that a compile
- // time expression is true (in new code, use static_assert instead). For
- // example, you could use it to verify the size of a static array:
- //
- // GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,
- // names_incorrect_size);
- //
- // The second argument to the macro must be a valid C++ identifier. If the
- // expression is false, compiler will issue an error containing this identifier.
- #define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
- // A helper for suppressing warnings on constant condition. It just
- // returns 'condition'.
- GTEST_API_ bool IsTrue(bool condition);
- // Defines RE.
- #if GTEST_USES_PCRE
- // if used, PCRE is injected by custom/gtest-port.h
- #elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE
- // A simple C++ wrapper for <regex.h>. It uses the POSIX Extended
- // Regular Expression syntax.
- class GTEST_API_ RE {
- public:
- // A copy constructor is required by the Standard to initialize object
- // references from r-values.
- RE(const RE& other) { Init(other.pattern()); }
- // Constructs an RE from a string.
- RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT
- RE(const char* regex) { Init(regex); } // NOLINT
- ~RE();
- // Returns the string representation of the regex.
- const char* pattern() const { return pattern_; }
- // FullMatch(str, re) returns true if and only if regular expression re
- // matches the entire str.
- // PartialMatch(str, re) returns true if and only if regular expression re
- // matches a substring of str (including str itself).
- static bool FullMatch(const ::std::string& str, const RE& re) {
- return FullMatch(str.c_str(), re);
- }
- static bool PartialMatch(const ::std::string& str, const RE& re) {
- return PartialMatch(str.c_str(), re);
- }
- static bool FullMatch(const char* str, const RE& re);
- static bool PartialMatch(const char* str, const RE& re);
- private:
- void Init(const char* regex);
- const char* pattern_;
- bool is_valid_;
- # if GTEST_USES_POSIX_RE
- regex_t full_regex_; // For FullMatch().
- regex_t partial_regex_; // For PartialMatch().
- # else // GTEST_USES_SIMPLE_RE
- const char* full_pattern_; // For FullMatch();
- # endif
- };
- #endif // GTEST_USES_PCRE
- // Formats a source file path and a line number as they would appear
- // in an error message from the compiler used to compile this code.
- GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
- // Formats a file location for compiler-independent XML output.
- // Although this function is not platform dependent, we put it next to
- // FormatFileLocation in order to contrast the two functions.
- GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
- int line);
- // Defines logging utilities:
- // GTEST_LOG_(severity) - logs messages at the specified severity level. The
- // message itself is streamed into the macro.
- // LogToStderr() - directs all log messages to stderr.
- // FlushInfoLog() - flushes informational log messages.
- enum GTestLogSeverity {
- GTEST_INFO,
- GTEST_WARNING,
- GTEST_ERROR,
- GTEST_FATAL
- };
- // Formats log entry severity, provides a stream object for streaming the
- // log message, and terminates the message with a newline when going out of
- // scope.
- class GTEST_API_ GTestLog {
- public:
- GTestLog(GTestLogSeverity severity, const char* file, int line);
- // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
- ~GTestLog();
- ::std::ostream& GetStream() { return ::std::cerr; }
- private:
- const GTestLogSeverity severity_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
- };
- #if !defined(GTEST_LOG_)
- # define GTEST_LOG_(severity) \
- ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
- __FILE__, __LINE__).GetStream()
- inline void LogToStderr() {}
- inline void FlushInfoLog() { fflush(nullptr); }
- #endif // !defined(GTEST_LOG_)
- #if !defined(GTEST_CHECK_)
- // INTERNAL IMPLEMENTATION - DO NOT USE.
- //
- // GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
- // is not satisfied.
- // Synopsys:
- // GTEST_CHECK_(boolean_condition);
- // or
- // GTEST_CHECK_(boolean_condition) << "Additional message";
- //
- // This checks the condition and if the condition is not satisfied
- // it prints message about the condition violation, including the
- // condition itself, plus additional message streamed into it, if any,
- // and then it aborts the program. It aborts the program irrespective of
- // whether it is built in the debug mode or not.
- # define GTEST_CHECK_(condition) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::IsTrue(condition)) \
- ; \
- else \
- GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
- #endif // !defined(GTEST_CHECK_)
- // An all-mode assert to verify that the given POSIX-style function
- // call returns 0 (indicating success). Known limitation: this
- // doesn't expand to a balanced 'if' statement, so enclose the macro
- // in {} if you need to use it as the only statement in an 'if'
- // branch.
- #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
- if (const int gtest_error = (posix_call)) \
- GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
- << gtest_error
- // Transforms "T" into "const T&" according to standard reference collapsing
- // rules (this is only needed as a backport for C++98 compilers that do not
- // support reference collapsing). Specifically, it transforms:
- //
- // char ==> const char&
- // const char ==> const char&
- // char& ==> char&
- // const char& ==> const char&
- //
- // Note that the non-const reference will not have "const" added. This is
- // standard, and necessary so that "T" can always bind to "const T&".
- template <typename T>
- struct ConstRef { typedef const T& type; };
- template <typename T>
- struct ConstRef<T&> { typedef T& type; };
- // The argument T must depend on some template parameters.
- #define GTEST_REFERENCE_TO_CONST_(T) \
- typename ::testing::internal::ConstRef<T>::type
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // Use ImplicitCast_ as a safe version of static_cast for upcasting in
- // the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
- // const Foo*). When you use ImplicitCast_, the compiler checks that
- // the cast is safe. Such explicit ImplicitCast_s are necessary in
- // surprisingly many situations where C++ demands an exact type match
- // instead of an argument type convertable to a target type.
- //
- // The syntax for using ImplicitCast_ is the same as for static_cast:
- //
- // ImplicitCast_<ToType>(expr)
- //
- // ImplicitCast_ would have been part of the C++ standard library,
- // but the proposal was submitted too late. It will probably make
- // its way into the language in the future.
- //
- // This relatively ugly name is intentional. It prevents clashes with
- // similar functions users may have (e.g., implicit_cast). The internal
- // namespace alone is not enough because the function can be found by ADL.
- template<typename To>
- inline To ImplicitCast_(To x) { return x; }
- // When you upcast (that is, cast a pointer from type Foo to type
- // SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
- // always succeed. When you downcast (that is, cast a pointer from
- // type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
- // how do you know the pointer is really of type SubclassOfFoo? It
- // could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,
- // when you downcast, you should use this macro. In debug mode, we
- // use dynamic_cast<> to double-check the downcast is legal (we die
- // if it's not). In normal mode, we do the efficient static_cast<>
- // instead. Thus, it's important to test in debug mode to make sure
- // the cast is legal!
- // This is the only place in the code we should use dynamic_cast<>.
- // In particular, you SHOULDN'T be using dynamic_cast<> in order to
- // do RTTI (eg code like this:
- // if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
- // if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
- // You should design the code some other way not to need this.
- //
- // This relatively ugly name is intentional. It prevents clashes with
- // similar functions users may have (e.g., down_cast). The internal
- // namespace alone is not enough because the function can be found by ADL.
- template<typename To, typename From> // use like this: DownCast_<T*>(foo);
- inline To DownCast_(From* f) { // so we only accept pointers
- // Ensures that To is a sub-type of From *. This test is here only
- // for compile-time type checking, and has no overhead in an
- // optimized build at run-time, as it will be optimized away
- // completely.
- GTEST_INTENTIONAL_CONST_COND_PUSH_()
- if (false) {
- GTEST_INTENTIONAL_CONST_COND_POP_()
- const To to = nullptr;
- ::testing::internal::ImplicitCast_<From*>(to);
- }
- #if GTEST_HAS_RTTI
- // RTTI: debug mode only!
- GTEST_CHECK_(f == nullptr || dynamic_cast<To>(f) != nullptr);
- #endif
- return static_cast<To>(f);
- }
- // Downcasts the pointer of type Base to Derived.
- // Derived must be a subclass of Base. The parameter MUST
- // point to a class of type Derived, not any subclass of it.
- // When RTTI is available, the function performs a runtime
- // check to enforce this.
- template <class Derived, class Base>
- Derived* CheckedDowncastToActualType(Base* base) {
- #if GTEST_HAS_RTTI
- GTEST_CHECK_(typeid(*base) == typeid(Derived));
- #endif
- #if GTEST_HAS_DOWNCAST_
- return ::down_cast<Derived*>(base);
- #elif GTEST_HAS_RTTI
- return dynamic_cast<Derived*>(base); // NOLINT
- #else
- return static_cast<Derived*>(base); // Poor man's downcast.
- #endif
- }
- #if GTEST_HAS_STREAM_REDIRECTION
- // Defines the stderr capturer:
- // CaptureStdout - starts capturing stdout.
- // GetCapturedStdout - stops capturing stdout and returns the captured string.
- // CaptureStderr - starts capturing stderr.
- // GetCapturedStderr - stops capturing stderr and returns the captured string.
- //
- GTEST_API_ void CaptureStdout();
- GTEST_API_ std::string GetCapturedStdout();
- GTEST_API_ void CaptureStderr();
- GTEST_API_ std::string GetCapturedStderr();
- #endif // GTEST_HAS_STREAM_REDIRECTION
- // Returns the size (in bytes) of a file.
- GTEST_API_ size_t GetFileSize(FILE* file);
- // Reads the entire content of a file as a string.
- GTEST_API_ std::string ReadEntireFile(FILE* file);
- // All command line arguments.
- GTEST_API_ std::vector<std::string> GetArgvs();
- #if GTEST_HAS_DEATH_TEST
- std::vector<std::string> GetInjectableArgvs();
- // Deprecated: pass the args vector by value instead.
- void SetInjectableArgvs(const std::vector<std::string>* new_argvs);
- void SetInjectableArgvs(const std::vector<std::string>& new_argvs);
- void ClearInjectableArgvs();
- #endif // GTEST_HAS_DEATH_TEST
- // Defines synchronization primitives.
- #if GTEST_IS_THREADSAFE
- # if GTEST_HAS_PTHREAD
- // Sleeps for (roughly) n milliseconds. This function is only for testing
- // Google Test's own constructs. Don't use it in user tests, either
- // directly or indirectly.
- inline void SleepMilliseconds(int n) {
- const timespec time = {
- 0, // 0 seconds.
- n * 1000L * 1000L, // And n ms.
- };
- nanosleep(&time, nullptr);
- }
- # endif // GTEST_HAS_PTHREAD
- # if GTEST_HAS_NOTIFICATION_
- // Notification has already been imported into the namespace.
- // Nothing to do here.
- # elif GTEST_HAS_PTHREAD
- // Allows a controller thread to pause execution of newly created
- // threads until notified. Instances of this class must be created
- // and destroyed in the controller thread.
- //
- // This class is only for testing Google Test's own constructs. Do not
- // use it in user tests, either directly or indirectly.
- class Notification {
- public:
- Notification() : notified_(false) {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr));
- }
- ~Notification() {
- pthread_mutex_destroy(&mutex_);
- }
- // Notifies all threads created with this notification to start. Must
- // be called from the controller thread.
- void Notify() {
- pthread_mutex_lock(&mutex_);
- notified_ = true;
- pthread_mutex_unlock(&mutex_);
- }
- // Blocks until the controller thread notifies. Must be called from a test
- // thread.
- void WaitForNotification() {
- for (;;) {
- pthread_mutex_lock(&mutex_);
- const bool notified = notified_;
- pthread_mutex_unlock(&mutex_);
- if (notified)
- break;
- SleepMilliseconds(10);
- }
- }
- private:
- pthread_mutex_t mutex_;
- bool notified_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
- };
- # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
- GTEST_API_ void SleepMilliseconds(int n);
- // Provides leak-safe Windows kernel handle ownership.
- // Used in death tests and in threading support.
- class GTEST_API_ AutoHandle {
- public:
- // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to
- // avoid including <windows.h> in this header file. Including <windows.h> is
- // undesirable because it defines a lot of symbols and macros that tend to
- // conflict with client code. This assumption is verified by
- // WindowsTypesTest.HANDLEIsVoidStar.
- typedef void* Handle;
- AutoHandle();
- explicit AutoHandle(Handle handle);
- ~AutoHandle();
- Handle Get() const;
- void Reset();
- void Reset(Handle handle);
- private:
- // Returns true if and only if the handle is a valid handle object that can be
- // closed.
- bool IsCloseable() const;
- Handle handle_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
- };
- // Allows a controller thread to pause execution of newly created
- // threads until notified. Instances of this class must be created
- // and destroyed in the controller thread.
- //
- // This class is only for testing Google Test's own constructs. Do not
- // use it in user tests, either directly or indirectly.
- class GTEST_API_ Notification {
- public:
- Notification();
- void Notify();
- void WaitForNotification();
- private:
- AutoHandle event_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
- };
- # endif // GTEST_HAS_NOTIFICATION_
- // On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD
- // defined, but we don't want to use MinGW's pthreads implementation, which
- // has conformance problems with some versions of the POSIX standard.
- # if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW
- // As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
- // Consequently, it cannot select a correct instantiation of ThreadWithParam
- // in order to call its Run(). Introducing ThreadWithParamBase as a
- // non-templated base class for ThreadWithParam allows us to bypass this
- // problem.
- class ThreadWithParamBase {
- public:
- virtual ~ThreadWithParamBase() {}
- virtual void Run() = 0;
- };
- // pthread_create() accepts a pointer to a function type with the C linkage.
- // According to the Standard (7.5/1), function types with different linkages
- // are different even if they are otherwise identical. Some compilers (for
- // example, SunStudio) treat them as different types. Since class methods
- // cannot be defined with C-linkage we need to define a free C-function to
- // pass into pthread_create().
- extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
- static_cast<ThreadWithParamBase*>(thread)->Run();
- return nullptr;
- }
- // Helper class for testing Google Test's multi-threading constructs.
- // To use it, write:
- //
- // void ThreadFunc(int param) { /* Do things with param */ }
- // Notification thread_can_start;
- // ...
- // // The thread_can_start parameter is optional; you can supply NULL.
- // ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
- // thread_can_start.Notify();
- //
- // These classes are only for testing Google Test's own constructs. Do
- // not use them in user tests, either directly or indirectly.
- template <typename T>
- class ThreadWithParam : public ThreadWithParamBase {
- public:
- typedef void UserThreadFunc(T);
- ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
- : func_(func),
- param_(param),
- thread_can_start_(thread_can_start),
- finished_(false) {
- ThreadWithParamBase* const base = this;
- // The thread can be created only after all fields except thread_
- // have been initialized.
- GTEST_CHECK_POSIX_SUCCESS_(
- pthread_create(&thread_, nullptr, &ThreadFuncWithCLinkage, base));
- }
- ~ThreadWithParam() override { Join(); }
- void Join() {
- if (!finished_) {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, nullptr));
- finished_ = true;
- }
- }
- void Run() override {
- if (thread_can_start_ != nullptr) thread_can_start_->WaitForNotification();
- func_(param_);
- }
- private:
- UserThreadFunc* const func_; // User-supplied thread function.
- const T param_; // User-supplied parameter to the thread function.
- // When non-NULL, used to block execution until the controller thread
- // notifies.
- Notification* const thread_can_start_;
- bool finished_; // true if and only if we know that the thread function has
- // finished.
- pthread_t thread_; // The native thread object.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
- };
- # endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD ||
- // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
- # if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
- // Mutex and ThreadLocal have already been imported into the namespace.
- // Nothing to do here.
- # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
- // Mutex implements mutex on Windows platforms. It is used in conjunction
- // with class MutexLock:
- //
- // Mutex mutex;
- // ...
- // MutexLock lock(&mutex); // Acquires the mutex and releases it at the
- // // end of the current scope.
- //
- // A static Mutex *must* be defined or declared using one of the following
- // macros:
- // GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
- // GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
- //
- // (A non-static Mutex is defined/declared in the usual way).
- class GTEST_API_ Mutex {
- public:
- enum MutexType { kStatic = 0, kDynamic = 1 };
- // We rely on kStaticMutex being 0 as it is to what the linker initializes
- // type_ in static mutexes. critical_section_ will be initialized lazily
- // in ThreadSafeLazyInit().
- enum StaticConstructorSelector { kStaticMutex = 0 };
- // This constructor intentionally does nothing. It relies on type_ being
- // statically initialized to 0 (effectively setting it to kStatic) and on
- // ThreadSafeLazyInit() to lazily initialize the rest of the members.
- explicit Mutex(StaticConstructorSelector /*dummy*/) {}
- Mutex();
- ~Mutex();
- void Lock();
- void Unlock();
- // Does nothing if the current thread holds the mutex. Otherwise, crashes
- // with high probability.
- void AssertHeld();
- private:
- // Initializes owner_thread_id_ and critical_section_ in static mutexes.
- void ThreadSafeLazyInit();
- // Per https://blogs.msdn.microsoft.com/oldnewthing/20040223-00/?p=40503,
- // we assume that 0 is an invalid value for thread IDs.
- unsigned int owner_thread_id_;
- // For static mutexes, we rely on these members being initialized to zeros
- // by the linker.
- MutexType type_;
- long critical_section_init_phase_; // NOLINT
- GTEST_CRITICAL_SECTION* critical_section_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
- };
- # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
- extern ::testing::internal::Mutex mutex
- # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
- ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex)
- // We cannot name this class MutexLock because the ctor declaration would
- // conflict with a macro named MutexLock, which is defined on some
- // platforms. That macro is used as a defensive measure to prevent against
- // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
- // "MutexLock l(&mu)". Hence the typedef trick below.
- class GTestMutexLock {
- public:
- explicit GTestMutexLock(Mutex* mutex)
- : mutex_(mutex) { mutex_->Lock(); }
- ~GTestMutexLock() { mutex_->Unlock(); }
- private:
- Mutex* const mutex_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
- };
- typedef GTestMutexLock MutexLock;
- // Base class for ValueHolder<T>. Allows a caller to hold and delete a value
- // without knowing its type.
- class ThreadLocalValueHolderBase {
- public:
- virtual ~ThreadLocalValueHolderBase() {}
- };
- // Provides a way for a thread to send notifications to a ThreadLocal
- // regardless of its parameter type.
- class ThreadLocalBase {
- public:
- // Creates a new ValueHolder<T> object holding a default value passed to
- // this ThreadLocal<T>'s constructor and returns it. It is the caller's
- // responsibility not to call this when the ThreadLocal<T> instance already
- // has a value on the current thread.
- virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const = 0;
- protected:
- ThreadLocalBase() {}
- virtual ~ThreadLocalBase() {}
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase);
- };
- // Maps a thread to a set of ThreadLocals that have values instantiated on that
- // thread and notifies them when the thread exits. A ThreadLocal instance is
- // expected to persist until all threads it has values on have terminated.
- class GTEST_API_ ThreadLocalRegistry {
- public:
- // Registers thread_local_instance as having value on the current thread.
- // Returns a value that can be used to identify the thread from other threads.
- static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
- const ThreadLocalBase* thread_local_instance);
- // Invoked when a ThreadLocal instance is destroyed.
- static void OnThreadLocalDestroyed(
- const ThreadLocalBase* thread_local_instance);
- };
- class GTEST_API_ ThreadWithParamBase {
- public:
- void Join();
- protected:
- class Runnable {
- public:
- virtual ~Runnable() {}
- virtual void Run() = 0;
- };
- ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);
- virtual ~ThreadWithParamBase();
- private:
- AutoHandle thread_;
- };
- // Helper class for testing Google Test's multi-threading constructs.
- template <typename T>
- class ThreadWithParam : public ThreadWithParamBase {
- public:
- typedef void UserThreadFunc(T);
- ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)
- : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) {
- }
- virtual ~ThreadWithParam() {}
- private:
- class RunnableImpl : public Runnable {
- public:
- RunnableImpl(UserThreadFunc* func, T param)
- : func_(func),
- param_(param) {
- }
- virtual ~RunnableImpl() {}
- virtual void Run() {
- func_(param_);
- }
- private:
- UserThreadFunc* const func_;
- const T param_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl);
- };
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
- };
- // Implements thread-local storage on Windows systems.
- //
- // // Thread 1
- // ThreadLocal<int> tl(100); // 100 is the default value for each thread.
- //
- // // Thread 2
- // tl.set(150); // Changes the value for thread 2 only.
- // EXPECT_EQ(150, tl.get());
- //
- // // Thread 1
- // EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value.
- // tl.set(200);
- // EXPECT_EQ(200, tl.get());
- //
- // The template type argument T must have a public copy constructor.
- // In addition, the default ThreadLocal constructor requires T to have
- // a public default constructor.
- //
- // The users of a TheadLocal instance have to make sure that all but one
- // threads (including the main one) using that instance have exited before
- // destroying it. Otherwise, the per-thread objects managed for them by the
- // ThreadLocal instance are not guaranteed to be destroyed on all platforms.
- //
- // Google Test only uses global ThreadLocal objects. That means they
- // will die after main() has returned. Therefore, no per-thread
- // object managed by Google Test will be leaked as long as all threads
- // using Google Test have exited when main() returns.
- template <typename T>
- class ThreadLocal : public ThreadLocalBase {
- public:
- ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {}
- explicit ThreadLocal(const T& value)
- : default_factory_(new InstanceValueHolderFactory(value)) {}
- ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); }
- T* pointer() { return GetOrCreateValue(); }
- const T* pointer() const { return GetOrCreateValue(); }
- const T& get() const { return *pointer(); }
- void set(const T& value) { *pointer() = value; }
- private:
- // Holds a value of T. Can be deleted via its base class without the caller
- // knowing the type of T.
- class ValueHolder : public ThreadLocalValueHolderBase {
- public:
- ValueHolder() : value_() {}
- explicit ValueHolder(const T& value) : value_(value) {}
- T* pointer() { return &value_; }
- private:
- T value_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
- };
- T* GetOrCreateValue() const {
- return static_cast<ValueHolder*>(
- ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer();
- }
- virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const {
- return default_factory_->MakeNewHolder();
- }
- class ValueHolderFactory {
- public:
- ValueHolderFactory() {}
- virtual ~ValueHolderFactory() {}
- virtual ValueHolder* MakeNewHolder() const = 0;
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
- };
- class DefaultValueHolderFactory : public ValueHolderFactory {
- public:
- DefaultValueHolderFactory() {}
- ValueHolder* MakeNewHolder() const override { return new ValueHolder(); }
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
- };
- class InstanceValueHolderFactory : public ValueHolderFactory {
- public:
- explicit InstanceValueHolderFactory(const T& value) : value_(value) {}
- ValueHolder* MakeNewHolder() const override {
- return new ValueHolder(value_);
- }
- private:
- const T value_; // The value for each thread.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
- };
- std::unique_ptr<ValueHolderFactory> default_factory_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
- };
- # elif GTEST_HAS_PTHREAD
- // MutexBase and Mutex implement mutex on pthreads-based platforms.
- class MutexBase {
- public:
- // Acquires this mutex.
- void Lock() {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
- owner_ = pthread_self();
- has_owner_ = true;
- }
- // Releases this mutex.
- void Unlock() {
- // Since the lock is being released the owner_ field should no longer be
- // considered valid. We don't protect writing to has_owner_ here, as it's
- // the caller's responsibility to ensure that the current thread holds the
- // mutex when this is called.
- has_owner_ = false;
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
- }
- // Does nothing if the current thread holds the mutex. Otherwise, crashes
- // with high probability.
- void AssertHeld() const {
- GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
- << "The current thread is not holding the mutex @" << this;
- }
- // A static mutex may be used before main() is entered. It may even
- // be used before the dynamic initialization stage. Therefore we
- // must be able to initialize a static mutex object at link time.
- // This means MutexBase has to be a POD and its member variables
- // have to be public.
- public:
- pthread_mutex_t mutex_; // The underlying pthread mutex.
- // has_owner_ indicates whether the owner_ field below contains a valid thread
- // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
- // accesses to the owner_ field should be protected by a check of this field.
- // An alternative might be to memset() owner_ to all zeros, but there's no
- // guarantee that a zero'd pthread_t is necessarily invalid or even different
- // from pthread_self().
- bool has_owner_;
- pthread_t owner_; // The thread holding the mutex.
- };
- // Forward-declares a static mutex.
- # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
- extern ::testing::internal::MutexBase mutex
- // Defines and statically (i.e. at link time) initializes a static mutex.
- // The initialization list here does not explicitly initialize each field,
- // instead relying on default initialization for the unspecified fields. In
- // particular, the owner_ field (a pthread_t) is not explicitly initialized.
- // This allows initialization to work whether pthread_t is a scalar or struct.
- // The flag -Wmissing-field-initializers must not be specified for this to work.
- #define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
- ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0}
- // The Mutex class can only be used for mutexes created at runtime. It
- // shares its API with MutexBase otherwise.
- class Mutex : public MutexBase {
- public:
- Mutex() {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr));
- has_owner_ = false;
- }
- ~Mutex() {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
- }
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
- };
- // We cannot name this class MutexLock because the ctor declaration would
- // conflict with a macro named MutexLock, which is defined on some
- // platforms. That macro is used as a defensive measure to prevent against
- // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
- // "MutexLock l(&mu)". Hence the typedef trick below.
- class GTestMutexLock {
- public:
- explicit GTestMutexLock(MutexBase* mutex)
- : mutex_(mutex) { mutex_->Lock(); }
- ~GTestMutexLock() { mutex_->Unlock(); }
- private:
- MutexBase* const mutex_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
- };
- typedef GTestMutexLock MutexLock;
- // Helpers for ThreadLocal.
- // pthread_key_create() requires DeleteThreadLocalValue() to have
- // C-linkage. Therefore it cannot be templatized to access
- // ThreadLocal<T>. Hence the need for class
- // ThreadLocalValueHolderBase.
- class ThreadLocalValueHolderBase {
- public:
- virtual ~ThreadLocalValueHolderBase() {}
- };
- // Called by pthread to delete thread-local data stored by
- // pthread_setspecific().
- extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
- delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
- }
- // Implements thread-local storage on pthreads-based systems.
- template <typename T>
- class GTEST_API_ ThreadLocal {
- public:
- ThreadLocal()
- : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}
- explicit ThreadLocal(const T& value)
- : key_(CreateKey()),
- default_factory_(new InstanceValueHolderFactory(value)) {}
- ~ThreadLocal() {
- // Destroys the managed object for the current thread, if any.
- DeleteThreadLocalValue(pthread_getspecific(key_));
- // Releases resources associated with the key. This will *not*
- // delete managed objects for other threads.
- GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
- }
- T* pointer() { return GetOrCreateValue(); }
- const T* pointer() const { return GetOrCreateValue(); }
- const T& get() const { return *pointer(); }
- void set(const T& value) { *pointer() = value; }
- private:
- // Holds a value of type T.
- class ValueHolder : public ThreadLocalValueHolderBase {
- public:
- ValueHolder() : value_() {}
- explicit ValueHolder(const T& value) : value_(value) {}
- T* pointer() { return &value_; }
- private:
- T value_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
- };
- static pthread_key_t CreateKey() {
- pthread_key_t key;
- // When a thread exits, DeleteThreadLocalValue() will be called on
- // the object managed for that thread.
- GTEST_CHECK_POSIX_SUCCESS_(
- pthread_key_create(&key, &DeleteThreadLocalValue));
- return key;
- }
- T* GetOrCreateValue() const {
- ThreadLocalValueHolderBase* const holder =
- static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
- if (holder != nullptr) {
- return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
- }
- ValueHolder* const new_holder = default_factory_->MakeNewHolder();
- ThreadLocalValueHolderBase* const holder_base = new_holder;
- GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
- return new_holder->pointer();
- }
- class ValueHolderFactory {
- public:
- ValueHolderFactory() {}
- virtual ~ValueHolderFactory() {}
- virtual ValueHolder* MakeNewHolder() const = 0;
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory);
- };
- class DefaultValueHolderFactory : public ValueHolderFactory {
- public:
- DefaultValueHolderFactory() {}
- ValueHolder* MakeNewHolder() const override { return new ValueHolder(); }
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory);
- };
- class InstanceValueHolderFactory : public ValueHolderFactory {
- public:
- explicit InstanceValueHolderFactory(const T& value) : value_(value) {}
- ValueHolder* MakeNewHolder() const override {
- return new ValueHolder(value_);
- }
- private:
- const T value_; // The value for each thread.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);
- };
- // A key pthreads uses for looking up per-thread values.
- const pthread_key_t key_;
- std::unique_ptr<ValueHolderFactory> default_factory_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
- };
- # endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
- #else // GTEST_IS_THREADSAFE
- // A dummy implementation of synchronization primitives (mutex, lock,
- // and thread-local variable). Necessary for compiling Google Test where
- // mutex is not supported - using Google Test in multiple threads is not
- // supported on such platforms.
- class Mutex {
- public:
- Mutex() {}
- void Lock() {}
- void Unlock() {}
- void AssertHeld() const {}
- };
- # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
- extern ::testing::internal::Mutex mutex
- # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
- // We cannot name this class MutexLock because the ctor declaration would
- // conflict with a macro named MutexLock, which is defined on some
- // platforms. That macro is used as a defensive measure to prevent against
- // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than
- // "MutexLock l(&mu)". Hence the typedef trick below.
- class GTestMutexLock {
- public:
- explicit GTestMutexLock(Mutex*) {} // NOLINT
- };
- typedef GTestMutexLock MutexLock;
- template <typename T>
- class GTEST_API_ ThreadLocal {
- public:
- ThreadLocal() : value_() {}
- explicit ThreadLocal(const T& value) : value_(value) {}
- T* pointer() { return &value_; }
- const T* pointer() const { return &value_; }
- const T& get() const { return value_; }
- void set(const T& value) { value_ = value; }
- private:
- T value_;
- };
- #endif // GTEST_IS_THREADSAFE
- // Returns the number of threads running in the process, or 0 to indicate that
- // we cannot detect it.
- GTEST_API_ size_t GetThreadCount();
- #if GTEST_OS_WINDOWS
- # define GTEST_PATH_SEP_ "\\"
- # define GTEST_HAS_ALT_PATH_SEP_ 1
- #else
- # define GTEST_PATH_SEP_ "/"
- # define GTEST_HAS_ALT_PATH_SEP_ 0
- #endif // GTEST_OS_WINDOWS
- // Utilities for char.
- // isspace(int ch) and friends accept an unsigned char or EOF. char
- // may be signed, depending on the compiler (or compiler flags).
- // Therefore we need to cast a char to unsigned char before calling
- // isspace(), etc.
- inline bool IsAlpha(char ch) {
- return isalpha(static_cast<unsigned char>(ch)) != 0;
- }
- inline bool IsAlNum(char ch) {
- return isalnum(static_cast<unsigned char>(ch)) != 0;
- }
- inline bool IsDigit(char ch) {
- return isdigit(static_cast<unsigned char>(ch)) != 0;
- }
- inline bool IsLower(char ch) {
- return islower(static_cast<unsigned char>(ch)) != 0;
- }
- inline bool IsSpace(char ch) {
- return isspace(static_cast<unsigned char>(ch)) != 0;
- }
- inline bool IsUpper(char ch) {
- return isupper(static_cast<unsigned char>(ch)) != 0;
- }
- inline bool IsXDigit(char ch) {
- return isxdigit(static_cast<unsigned char>(ch)) != 0;
- }
- #ifdef __cpp_char8_t
- inline bool IsXDigit(char8_t ch) {
- return isxdigit(static_cast<unsigned char>(ch)) != 0;
- }
- #endif
- inline bool IsXDigit(char16_t ch) {
- const unsigned char low_byte = static_cast<unsigned char>(ch);
- return ch == low_byte && isxdigit(low_byte) != 0;
- }
- inline bool IsXDigit(char32_t ch) {
- const unsigned char low_byte = static_cast<unsigned char>(ch);
- return ch == low_byte && isxdigit(low_byte) != 0;
- }
- inline bool IsXDigit(wchar_t ch) {
- const unsigned char low_byte = static_cast<unsigned char>(ch);
- return ch == low_byte && isxdigit(low_byte) != 0;
- }
- inline char ToLower(char ch) {
- return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
- }
- inline char ToUpper(char ch) {
- return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
- }
- inline std::string StripTrailingSpaces(std::string str) {
- std::string::iterator it = str.end();
- while (it != str.begin() && IsSpace(*--it))
- it = str.erase(it);
- return str;
- }
- // The testing::internal::posix namespace holds wrappers for common
- // POSIX functions. These wrappers hide the differences between
- // Windows/MSVC and POSIX systems. Since some compilers define these
- // standard functions as macros, the wrapper cannot have the same name
- // as the wrapped function.
- namespace posix {
- // Functions with a different name on Windows.
- #if GTEST_OS_WINDOWS
- typedef struct _stat StatStruct;
- # ifdef __BORLANDC__
- inline int DoIsATTY(int fd) { return isatty(fd); }
- inline int StrCaseCmp(const char* s1, const char* s2) {
- return stricmp(s1, s2);
- }
- inline char* StrDup(const char* src) { return strdup(src); }
- # else // !__BORLANDC__
- # if GTEST_OS_WINDOWS_MOBILE
- inline int DoIsATTY(int /* fd */) { return 0; }
- # else
- inline int DoIsATTY(int fd) { return _isatty(fd); }
- # endif // GTEST_OS_WINDOWS_MOBILE
- inline int StrCaseCmp(const char* s1, const char* s2) {
- return _stricmp(s1, s2);
- }
- inline char* StrDup(const char* src) { return _strdup(src); }
- # endif // __BORLANDC__
- # if GTEST_OS_WINDOWS_MOBILE
- inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
- // Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
- // time and thus not defined there.
- # else
- inline int FileNo(FILE* file) { return _fileno(file); }
- inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
- inline int RmDir(const char* dir) { return _rmdir(dir); }
- inline bool IsDir(const StatStruct& st) {
- return (_S_IFDIR & st.st_mode) != 0;
- }
- # endif // GTEST_OS_WINDOWS_MOBILE
- #elif GTEST_OS_ESP8266
- typedef struct stat StatStruct;
- inline int FileNo(FILE* file) { return fileno(file); }
- inline int DoIsATTY(int fd) { return isatty(fd); }
- inline int Stat(const char* path, StatStruct* buf) {
- // stat function not implemented on ESP8266
- return 0;
- }
- inline int StrCaseCmp(const char* s1, const char* s2) {
- return strcasecmp(s1, s2);
- }
- inline char* StrDup(const char* src) { return strdup(src); }
- inline int RmDir(const char* dir) { return rmdir(dir); }
- inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
- #else
- typedef struct stat StatStruct;
- inline int FileNo(FILE* file) { return fileno(file); }
- inline int DoIsATTY(int fd) { return isatty(fd); }
- inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
- inline int StrCaseCmp(const char* s1, const char* s2) {
- return strcasecmp(s1, s2);
- }
- inline char* StrDup(const char* src) { return strdup(src); }
- inline int RmDir(const char* dir) { return rmdir(dir); }
- inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
- #endif // GTEST_OS_WINDOWS
- inline int IsATTY(int fd) {
- // DoIsATTY might change errno (for example ENOTTY in case you redirect stdout
- // to a file on Linux), which is unexpected, so save the previous value, and
- // restore it after the call.
- int savedErrno = errno;
- int isAttyValue = DoIsATTY(fd);
- errno = savedErrno;
- return isAttyValue;
- }
- // Functions deprecated by MSVC 8.0.
- GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
- // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
- // StrError() aren't needed on Windows CE at this time and thus not
- // defined there.
- #if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && \
- !GTEST_OS_WINDOWS_RT && !GTEST_OS_ESP8266 && !GTEST_OS_XTENSA
- inline int ChDir(const char* dir) { return chdir(dir); }
- #endif
- inline FILE* FOpen(const char* path, const char* mode) {
- #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
- struct wchar_codecvt : public std::codecvt<wchar_t, char, std::mbstate_t> {};
- std::wstring_convert<wchar_codecvt> converter;
- std::wstring wide_path = converter.from_bytes(path);
- std::wstring wide_mode = converter.from_bytes(mode);
- return _wfopen(wide_path.c_str(), wide_mode.c_str());
- #else // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
- return fopen(path, mode);
- #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
- }
- #if !GTEST_OS_WINDOWS_MOBILE
- inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
- return freopen(path, mode, stream);
- }
- inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
- #endif
- inline int FClose(FILE* fp) { return fclose(fp); }
- #if !GTEST_OS_WINDOWS_MOBILE
- inline int Read(int fd, void* buf, unsigned int count) {
- return static_cast<int>(read(fd, buf, count));
- }
- inline int Write(int fd, const void* buf, unsigned int count) {
- return static_cast<int>(write(fd, buf, count));
- }
- inline int Close(int fd) { return close(fd); }
- inline const char* StrError(int errnum) { return strerror(errnum); }
- #endif
- inline const char* GetEnv(const char* name) {
- #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
- GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA
- // We are on an embedded platform, which has no environment variables.
- static_cast<void>(name); // To prevent 'unused argument' warning.
- return nullptr;
- #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
- // Environment variables which we programmatically clear will be set to the
- // empty string rather than unset (NULL). Handle that case.
- const char* const env = getenv(name);
- return (env != nullptr && env[0] != '\0') ? env : nullptr;
- #else
- return getenv(name);
- #endif
- }
- GTEST_DISABLE_MSC_DEPRECATED_POP_()
- #if GTEST_OS_WINDOWS_MOBILE
- // Windows CE has no C library. The abort() function is used in
- // several places in Google Test. This implementation provides a reasonable
- // imitation of standard behaviour.
- [[noreturn]] void Abort();
- #else
- [[noreturn]] inline void Abort() { abort(); }
- #endif // GTEST_OS_WINDOWS_MOBILE
- } // namespace posix
- // MSVC "deprecates" snprintf and issues warnings wherever it is used. In
- // order to avoid these warnings, we need to use _snprintf or _snprintf_s on
- // MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate
- // function in order to achieve that. We use macro definition here because
- // snprintf is a variadic function.
- #if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE
- // MSVC 2005 and above support variadic macros.
- # define GTEST_SNPRINTF_(buffer, size, format, ...) \
- _snprintf_s(buffer, size, size, format, __VA_ARGS__)
- #elif defined(_MSC_VER)
- // Windows CE does not define _snprintf_s
- # define GTEST_SNPRINTF_ _snprintf
- #else
- # define GTEST_SNPRINTF_ snprintf
- #endif
- // The biggest signed integer type the compiler supports.
- //
- // long long is guaranteed to be at least 64-bits in C++11.
- using BiggestInt = long long; // NOLINT
- // The maximum number a BiggestInt can represent.
- constexpr BiggestInt kMaxBiggestInt = (std::numeric_limits<BiggestInt>::max)();
- // This template class serves as a compile-time function from size to
- // type. It maps a size in bytes to a primitive type with that
- // size. e.g.
- //
- // TypeWithSize<4>::UInt
- //
- // is typedef-ed to be unsigned int (unsigned integer made up of 4
- // bytes).
- //
- // Such functionality should belong to STL, but I cannot find it
- // there.
- //
- // Google Test uses this class in the implementation of floating-point
- // comparison.
- //
- // For now it only handles UInt (unsigned int) as that's all Google Test
- // needs. Other types can be easily added in the future if need
- // arises.
- template <size_t size>
- class TypeWithSize {
- public:
- // This prevents the user from using TypeWithSize<N> with incorrect
- // values of N.
- using UInt = void;
- };
- // The specialization for size 4.
- template <>
- class TypeWithSize<4> {
- public:
- using Int = std::int32_t;
- using UInt = std::uint32_t;
- };
- // The specialization for size 8.
- template <>
- class TypeWithSize<8> {
- public:
- using Int = std::int64_t;
- using UInt = std::uint64_t;
- };
- // Integer types of known sizes.
- using TimeInMillis = int64_t; // Represents time in milliseconds.
- // Utilities for command line flags and environment variables.
- // Macro for referencing flags.
- #if !defined(GTEST_FLAG)
- # define GTEST_FLAG(name) FLAGS_gtest_##name
- #endif // !defined(GTEST_FLAG)
- #if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
- # define GTEST_USE_OWN_FLAGFILE_FLAG_ 1
- #endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)
- #if !defined(GTEST_DECLARE_bool_)
- # define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver
- // Macros for declaring flags.
- # define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
- # define GTEST_DECLARE_int32_(name) \
- GTEST_API_ extern std::int32_t GTEST_FLAG(name)
- # define GTEST_DECLARE_string_(name) \
- GTEST_API_ extern ::std::string GTEST_FLAG(name)
- // Macros for defining flags.
- # define GTEST_DEFINE_bool_(name, default_val, doc) \
- GTEST_API_ bool GTEST_FLAG(name) = (default_val)
- # define GTEST_DEFINE_int32_(name, default_val, doc) \
- GTEST_API_ std::int32_t GTEST_FLAG(name) = (default_val)
- # define GTEST_DEFINE_string_(name, default_val, doc) \
- GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
- #endif // !defined(GTEST_DECLARE_bool_)
- // Thread annotations
- #if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
- # define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
- # define GTEST_LOCK_EXCLUDED_(locks)
- #endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)
- // Parses 'str' for a 32-bit signed integer. If successful, writes the result
- // to *value and returns true; otherwise leaves *value unchanged and returns
- // false.
- GTEST_API_ bool ParseInt32(const Message& src_text, const char* str,
- int32_t* value);
- // Parses a bool/int32_t/string from the environment variable
- // corresponding to the given Google Test flag.
- bool BoolFromGTestEnv(const char* flag, bool default_val);
- GTEST_API_ int32_t Int32FromGTestEnv(const char* flag, int32_t default_val);
- std::string OutputFlagAlsoCheckEnvVar();
- const char* StringFromGTestEnv(const char* flag, const char* default_val);
- } // namespace internal
- } // namespace testing
- #if !defined(GTEST_INTERNAL_DEPRECATED)
- // Internal Macro to mark an API deprecated, for googletest usage only
- // Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or
- // GTEST_INTERNAL_DEPRECATED(message) <return_type> myFunction(); Every usage of
- // a deprecated entity will trigger a warning when compiled with
- // `-Wdeprecated-declarations` option (clang, gcc, any __GNUC__ compiler).
- // For msvc /W3 option will need to be used
- // Note that for 'other' compilers this macro evaluates to nothing to prevent
- // compilations errors.
- #if defined(_MSC_VER)
- #define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message))
- #elif defined(__GNUC__)
- #define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message)))
- #else
- #define GTEST_INTERNAL_DEPRECATED(message)
- #endif
- #endif // !defined(GTEST_INTERNAL_DEPRECATED)
- #if GTEST_HAS_ABSL
- // Always use absl::any for UniversalPrinter<> specializations if googletest
- // is built with absl support.
- #define GTEST_INTERNAL_HAS_ANY 1
- #include "absl/types/any.h"
- namespace testing {
- namespace internal {
- using Any = ::absl::any;
- } // namespace internal
- } // namespace testing
- #else
- #ifdef __has_include
- #if __has_include(<any>) && __cplusplus >= 201703L
- // Otherwise for C++17 and higher use std::any for UniversalPrinter<>
- // specializations.
- #define GTEST_INTERNAL_HAS_ANY 1
- #include <any>
- namespace testing {
- namespace internal {
- using Any = ::std::any;
- } // namespace internal
- } // namespace testing
- // The case where absl is configured NOT to alias std::any is not
- // supported.
- #endif // __has_include(<any>) && __cplusplus >= 201703L
- #endif // __has_include
- #endif // GTEST_HAS_ABSL
- #if GTEST_HAS_ABSL
- // Always use absl::optional for UniversalPrinter<> specializations if
- // googletest is built with absl support.
- #define GTEST_INTERNAL_HAS_OPTIONAL 1
- #include "absl/types/optional.h"
- namespace testing {
- namespace internal {
- template <typename T>
- using Optional = ::absl::optional<T>;
- } // namespace internal
- } // namespace testing
- #else
- #ifdef __has_include
- #if __has_include(<optional>) && __cplusplus >= 201703L
- // Otherwise for C++17 and higher use std::optional for UniversalPrinter<>
- // specializations.
- #define GTEST_INTERNAL_HAS_OPTIONAL 1
- #include <optional>
- namespace testing {
- namespace internal {
- template <typename T>
- using Optional = ::std::optional<T>;
- } // namespace internal
- } // namespace testing
- // The case where absl is configured NOT to alias std::optional is not
- // supported.
- #endif // __has_include(<optional>) && __cplusplus >= 201703L
- #endif // __has_include
- #endif // GTEST_HAS_ABSL
- #if GTEST_HAS_ABSL
- // Always use absl::string_view for Matcher<> specializations if googletest
- // is built with absl support.
- # define GTEST_INTERNAL_HAS_STRING_VIEW 1
- #include "absl/strings/string_view.h"
- namespace testing {
- namespace internal {
- using StringView = ::absl::string_view;
- } // namespace internal
- } // namespace testing
- #else
- # ifdef __has_include
- # if __has_include(<string_view>) && __cplusplus >= 201703L
- // Otherwise for C++17 and higher use std::string_view for Matcher<>
- // specializations.
- # define GTEST_INTERNAL_HAS_STRING_VIEW 1
- #include <string_view>
- namespace testing {
- namespace internal {
- using StringView = ::std::string_view;
- } // namespace internal
- } // namespace testing
- // The case where absl is configured NOT to alias std::string_view is not
- // supported.
- # endif // __has_include(<string_view>) && __cplusplus >= 201703L
- # endif // __has_include
- #endif // GTEST_HAS_ABSL
- #if GTEST_HAS_ABSL
- // Always use absl::variant for UniversalPrinter<> specializations if googletest
- // is built with absl support.
- #define GTEST_INTERNAL_HAS_VARIANT 1
- #include "absl/types/variant.h"
- namespace testing {
- namespace internal {
- template <typename... T>
- using Variant = ::absl::variant<T...>;
- } // namespace internal
- } // namespace testing
- #else
- #ifdef __has_include
- #if __has_include(<variant>) && __cplusplus >= 201703L
- // Otherwise for C++17 and higher use std::variant for UniversalPrinter<>
- // specializations.
- #define GTEST_INTERNAL_HAS_VARIANT 1
- #include <variant>
- namespace testing {
- namespace internal {
- template <typename... T>
- using Variant = ::std::variant<T...>;
- } // namespace internal
- } // namespace testing
- // The case where absl is configured NOT to alias std::variant is not supported.
- #endif // __has_include(<variant>) && __cplusplus >= 201703L
- #endif // __has_include
- #endif // GTEST_HAS_ABSL
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
- #if GTEST_OS_LINUX
- # include <stdlib.h>
- # include <sys/types.h>
- # include <sys/wait.h>
- # include <unistd.h>
- #endif // GTEST_OS_LINUX
- #if GTEST_HAS_EXCEPTIONS
- # include <stdexcept>
- #endif
- #include <ctype.h>
- #include <float.h>
- #include <string.h>
- #include <cstdint>
- #include <iomanip>
- #include <limits>
- #include <map>
- #include <set>
- #include <string>
- #include <type_traits>
- #include <vector>
- // Copyright 2005, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // The Google C++ Testing and Mocking Framework (Google Test)
- //
- // This header file defines the Message class.
- //
- // IMPORTANT NOTE: Due to limitation of the C++ language, we have to
- // leave some internal implementation details in this header file.
- // They are clearly marked by comments like this:
- //
- // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- //
- // Such code is NOT meant to be used by a user directly, and is subject
- // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
- // program!
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
- #include <limits>
- #include <memory>
- #include <sstream>
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
- /* class A needs to have dll-interface to be used by clients of class B */)
- // Ensures that there is at least one operator<< in the global namespace.
- // See Message& operator<<(...) below for why.
- void operator<<(const testing::internal::Secret&, int);
- namespace testing {
- // The Message class works like an ostream repeater.
- //
- // Typical usage:
- //
- // 1. You stream a bunch of values to a Message object.
- // It will remember the text in a stringstream.
- // 2. Then you stream the Message object to an ostream.
- // This causes the text in the Message to be streamed
- // to the ostream.
- //
- // For example;
- //
- // testing::Message foo;
- // foo << 1 << " != " << 2;
- // std::cout << foo;
- //
- // will print "1 != 2".
- //
- // Message is not intended to be inherited from. In particular, its
- // destructor is not virtual.
- //
- // Note that stringstream behaves differently in gcc and in MSVC. You
- // can stream a NULL char pointer to it in the former, but not in the
- // latter (it causes an access violation if you do). The Message
- // class hides this difference by treating a NULL char pointer as
- // "(null)".
- class GTEST_API_ Message {
- private:
- // The type of basic IO manipulators (endl, ends, and flush) for
- // narrow streams.
- typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
- public:
- // Constructs an empty Message.
- Message();
- // Copy constructor.
- Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT
- *ss_ << msg.GetString();
- }
- // Constructs a Message from a C-string.
- explicit Message(const char* str) : ss_(new ::std::stringstream) {
- *ss_ << str;
- }
- // Streams a non-pointer value to this object.
- template <typename T>
- inline Message& operator <<(const T& val) {
- // Some libraries overload << for STL containers. These
- // overloads are defined in the global namespace instead of ::std.
- //
- // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
- // overloads are visible in either the std namespace or the global
- // namespace, but not other namespaces, including the testing
- // namespace which Google Test's Message class is in.
- //
- // To allow STL containers (and other types that has a << operator
- // defined in the global namespace) to be used in Google Test
- // assertions, testing::Message must access the custom << operator
- // from the global namespace. With this using declaration,
- // overloads of << defined in the global namespace and those
- // visible via Koenig lookup are both exposed in this function.
- using ::operator <<;
- *ss_ << val;
- return *this;
- }
- // Streams a pointer value to this object.
- //
- // This function is an overload of the previous one. When you
- // stream a pointer to a Message, this definition will be used as it
- // is more specialized. (The C++ Standard, section
- // [temp.func.order].) If you stream a non-pointer, then the
- // previous definition will be used.
- //
- // The reason for this overload is that streaming a NULL pointer to
- // ostream is undefined behavior. Depending on the compiler, you
- // may get "0", "(nil)", "(null)", or an access violation. To
- // ensure consistent result across compilers, we always treat NULL
- // as "(null)".
- template <typename T>
- inline Message& operator <<(T* const& pointer) { // NOLINT
- if (pointer == nullptr) {
- *ss_ << "(null)";
- } else {
- *ss_ << pointer;
- }
- return *this;
- }
- // Since the basic IO manipulators are overloaded for both narrow
- // and wide streams, we have to provide this specialized definition
- // of operator <<, even though its body is the same as the
- // templatized version above. Without this definition, streaming
- // endl or other basic IO manipulators to Message will confuse the
- // compiler.
- Message& operator <<(BasicNarrowIoManip val) {
- *ss_ << val;
- return *this;
- }
- // Instead of 1/0, we want to see true/false for bool values.
- Message& operator <<(bool b) {
- return *this << (b ? "true" : "false");
- }
- // These two overloads allow streaming a wide C string to a Message
- // using the UTF-8 encoding.
- Message& operator <<(const wchar_t* wide_c_str);
- Message& operator <<(wchar_t* wide_c_str);
- #if GTEST_HAS_STD_WSTRING
- // Converts the given wide string to a narrow string using the UTF-8
- // encoding, and streams the result to this Message object.
- Message& operator <<(const ::std::wstring& wstr);
- #endif // GTEST_HAS_STD_WSTRING
- // Gets the text streamed to this object so far as an std::string.
- // Each '\0' character in the buffer is replaced with "\\0".
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- std::string GetString() const;
- private:
- // We'll hold the text streamed to this object here.
- const std::unique_ptr< ::std::stringstream> ss_;
- // We declare (but don't implement) this to prevent the compiler
- // from implementing the assignment operator.
- void operator=(const Message&);
- };
- // Streams a Message to an ostream.
- inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
- return os << sb.GetString();
- }
- namespace internal {
- // Converts a streamable value to an std::string. A NULL pointer is
- // converted to "(null)". When the input value is a ::string,
- // ::std::string, ::wstring, or ::std::wstring object, each NUL
- // character in it is replaced with "\\0".
- template <typename T>
- std::string StreamableToString(const T& streamable) {
- return (Message() << streamable).GetString();
- }
- } // namespace internal
- } // namespace testing
- GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
- // Copyright 2008, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // Google Test filepath utilities
- //
- // This header file declares classes and functions used internally by
- // Google Test. They are subject to change without notice.
- //
- // This file is #included in gtest/internal/gtest-internal.h.
- // Do not include this header file separately!
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
- // Copyright 2005, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // The Google C++ Testing and Mocking Framework (Google Test)
- //
- // This header file declares the String class and functions used internally by
- // Google Test. They are subject to change without notice. They should not used
- // by code external to Google Test.
- //
- // This header file is #included by gtest-internal.h.
- // It should not be #included by other files.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
- #ifdef __BORLANDC__
- // string.h is not guaranteed to provide strcpy on C++ Builder.
- # include <mem.h>
- #endif
- #include <string.h>
- #include <cstdint>
- #include <string>
- namespace testing {
- namespace internal {
- // String - an abstract class holding static string utilities.
- class GTEST_API_ String {
- public:
- // Static utility methods
- // Clones a 0-terminated C string, allocating memory using new. The
- // caller is responsible for deleting the return value using
- // delete[]. Returns the cloned string, or NULL if the input is
- // NULL.
- //
- // This is different from strdup() in string.h, which allocates
- // memory using malloc().
- static const char* CloneCString(const char* c_str);
- #if GTEST_OS_WINDOWS_MOBILE
- // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
- // able to pass strings to Win32 APIs on CE we need to convert them
- // to 'Unicode', UTF-16.
- // Creates a UTF-16 wide string from the given ANSI string, allocating
- // memory using new. The caller is responsible for deleting the return
- // value using delete[]. Returns the wide string, or NULL if the
- // input is NULL.
- //
- // The wide string is created using the ANSI codepage (CP_ACP) to
- // match the behaviour of the ANSI versions of Win32 calls and the
- // C runtime.
- static LPCWSTR AnsiToUtf16(const char* c_str);
- // Creates an ANSI string from the given wide string, allocating
- // memory using new. The caller is responsible for deleting the return
- // value using delete[]. Returns the ANSI string, or NULL if the
- // input is NULL.
- //
- // The returned string is created using the ANSI codepage (CP_ACP) to
- // match the behaviour of the ANSI versions of Win32 calls and the
- // C runtime.
- static const char* Utf16ToAnsi(LPCWSTR utf16_str);
- #endif
- // Compares two C strings. Returns true if and only if they have the same
- // content.
- //
- // Unlike strcmp(), this function can handle NULL argument(s). A
- // NULL C string is considered different to any non-NULL C string,
- // including the empty string.
- static bool CStringEquals(const char* lhs, const char* rhs);
- // Converts a wide C string to a String using the UTF-8 encoding.
- // NULL will be converted to "(null)". If an error occurred during
- // the conversion, "(failed to convert from wide string)" is
- // returned.
- static std::string ShowWideCString(const wchar_t* wide_c_str);
- // Compares two wide C strings. Returns true if and only if they have the
- // same content.
- //
- // Unlike wcscmp(), this function can handle NULL argument(s). A
- // NULL C string is considered different to any non-NULL C string,
- // including the empty string.
- static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
- // Compares two C strings, ignoring case. Returns true if and only if
- // they have the same content.
- //
- // Unlike strcasecmp(), this function can handle NULL argument(s).
- // A NULL C string is considered different to any non-NULL C string,
- // including the empty string.
- static bool CaseInsensitiveCStringEquals(const char* lhs,
- const char* rhs);
- // Compares two wide C strings, ignoring case. Returns true if and only if
- // they have the same content.
- //
- // Unlike wcscasecmp(), this function can handle NULL argument(s).
- // A NULL C string is considered different to any non-NULL wide C string,
- // including the empty string.
- // NB: The implementations on different platforms slightly differ.
- // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
- // environment variable. On GNU platform this method uses wcscasecmp
- // which compares according to LC_CTYPE category of the current locale.
- // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
- // current locale.
- static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
- const wchar_t* rhs);
- // Returns true if and only if the given string ends with the given suffix,
- // ignoring case. Any string is considered to end with an empty suffix.
- static bool EndsWithCaseInsensitive(
- const std::string& str, const std::string& suffix);
- // Formats an int value as "%02d".
- static std::string FormatIntWidth2(int value); // "%02d" for width == 2
- // Formats an int value to given width with leading zeros.
- static std::string FormatIntWidthN(int value, int width);
- // Formats an int value as "%X".
- static std::string FormatHexInt(int value);
- // Formats an int value as "%X".
- static std::string FormatHexUInt32(uint32_t value);
- // Formats a byte as "%02X".
- static std::string FormatByte(unsigned char value);
- private:
- String(); // Not meant to be instantiated.
- }; // class String
- // Gets the content of the stringstream's buffer as an std::string. Each '\0'
- // character in the buffer is replaced with "\\0".
- GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
- } // namespace internal
- } // namespace testing
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
- /* class A needs to have dll-interface to be used by clients of class B */)
- namespace testing {
- namespace internal {
- // FilePath - a class for file and directory pathname manipulation which
- // handles platform-specific conventions (like the pathname separator).
- // Used for helper functions for naming files in a directory for xml output.
- // Except for Set methods, all methods are const or static, which provides an
- // "immutable value object" -- useful for peace of mind.
- // A FilePath with a value ending in a path separator ("like/this/") represents
- // a directory, otherwise it is assumed to represent a file. In either case,
- // it may or may not represent an actual file or directory in the file system.
- // Names are NOT checked for syntax correctness -- no checking for illegal
- // characters, malformed paths, etc.
- class GTEST_API_ FilePath {
- public:
- FilePath() : pathname_("") { }
- FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
- explicit FilePath(const std::string& pathname) : pathname_(pathname) {
- Normalize();
- }
- FilePath& operator=(const FilePath& rhs) {
- Set(rhs);
- return *this;
- }
- void Set(const FilePath& rhs) {
- pathname_ = rhs.pathname_;
- }
- const std::string& string() const { return pathname_; }
- const char* c_str() const { return pathname_.c_str(); }
- // Returns the current working directory, or "" if unsuccessful.
- static FilePath GetCurrentDir();
- // Given directory = "dir", base_name = "test", number = 0,
- // extension = "xml", returns "dir/test.xml". If number is greater
- // than zero (e.g., 12), returns "dir/test_12.xml".
- // On Windows platform, uses \ as the separator rather than /.
- static FilePath MakeFileName(const FilePath& directory,
- const FilePath& base_name,
- int number,
- const char* extension);
- // Given directory = "dir", relative_path = "test.xml",
- // returns "dir/test.xml".
- // On Windows, uses \ as the separator rather than /.
- static FilePath ConcatPaths(const FilePath& directory,
- const FilePath& relative_path);
- // Returns a pathname for a file that does not currently exist. The pathname
- // will be directory/base_name.extension or
- // directory/base_name_<number>.extension if directory/base_name.extension
- // already exists. The number will be incremented until a pathname is found
- // that does not already exist.
- // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
- // There could be a race condition if two or more processes are calling this
- // function at the same time -- they could both pick the same filename.
- static FilePath GenerateUniqueFileName(const FilePath& directory,
- const FilePath& base_name,
- const char* extension);
- // Returns true if and only if the path is "".
- bool IsEmpty() const { return pathname_.empty(); }
- // If input name has a trailing separator character, removes it and returns
- // the name, otherwise return the name string unmodified.
- // On Windows platform, uses \ as the separator, other platforms use /.
- FilePath RemoveTrailingPathSeparator() const;
- // Returns a copy of the FilePath with the directory part removed.
- // Example: FilePath("path/to/file").RemoveDirectoryName() returns
- // FilePath("file"). If there is no directory part ("just_a_file"), it returns
- // the FilePath unmodified. If there is no file part ("just_a_dir/") it
- // returns an empty FilePath ("").
- // On Windows platform, '\' is the path separator, otherwise it is '/'.
- FilePath RemoveDirectoryName() const;
- // RemoveFileName returns the directory path with the filename removed.
- // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
- // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
- // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
- // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
- // On Windows platform, '\' is the path separator, otherwise it is '/'.
- FilePath RemoveFileName() const;
- // Returns a copy of the FilePath with the case-insensitive extension removed.
- // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
- // FilePath("dir/file"). If a case-insensitive extension is not
- // found, returns a copy of the original FilePath.
- FilePath RemoveExtension(const char* extension) const;
- // Creates directories so that path exists. Returns true if successful or if
- // the directories already exist; returns false if unable to create
- // directories for any reason. Will also return false if the FilePath does
- // not represent a directory (that is, it doesn't end with a path separator).
- bool CreateDirectoriesRecursively() const;
- // Create the directory so that path exists. Returns true if successful or
- // if the directory already exists; returns false if unable to create the
- // directory for any reason, including if the parent directory does not
- // exist. Not named "CreateDirectory" because that's a macro on Windows.
- bool CreateFolder() const;
- // Returns true if FilePath describes something in the file-system,
- // either a file, directory, or whatever, and that something exists.
- bool FileOrDirectoryExists() const;
- // Returns true if pathname describes a directory in the file-system
- // that exists.
- bool DirectoryExists() const;
- // Returns true if FilePath ends with a path separator, which indicates that
- // it is intended to represent a directory. Returns false otherwise.
- // This does NOT check that a directory (or file) actually exists.
- bool IsDirectory() const;
- // Returns true if pathname describes a root directory. (Windows has one
- // root directory per disk drive.)
- bool IsRootDirectory() const;
- // Returns true if pathname describes an absolute path.
- bool IsAbsolutePath() const;
- private:
- // Replaces multiple consecutive separators with a single separator.
- // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
- // redundancies that might be in a pathname involving "." or "..".
- //
- // A pathname with multiple consecutive separators may occur either through
- // user error or as a result of some scripts or APIs that generate a pathname
- // with a trailing separator. On other platforms the same API or script
- // may NOT generate a pathname with a trailing "/". Then elsewhere that
- // pathname may have another "/" and pathname components added to it,
- // without checking for the separator already being there.
- // The script language and operating system may allow paths like "foo//bar"
- // but some of the functions in FilePath will not handle that correctly. In
- // particular, RemoveTrailingPathSeparator() only removes one separator, and
- // it is called in CreateDirectoriesRecursively() assuming that it will change
- // a pathname from directory syntax (trailing separator) to filename syntax.
- //
- // On Windows this method also replaces the alternate path separator '/' with
- // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
- // "bar\\foo".
- void Normalize();
- // Returns a pointer to the last occurrence of a valid path separator in
- // the FilePath. On Windows, for example, both '/' and '\' are valid path
- // separators. Returns NULL if no path separator was found.
- const char* FindLastPathSeparator() const;
- std::string pathname_;
- }; // class FilePath
- } // namespace internal
- } // namespace testing
- GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
- // Copyright 2008 Google Inc.
- // All Rights Reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- // Type utilities needed for implementing typed and type-parameterized
- // tests.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
- // #ifdef __GNUC__ is too general here. It is possible to use gcc without using
- // libstdc++ (which is where cxxabi.h comes from).
- # if GTEST_HAS_CXXABI_H_
- # include <cxxabi.h>
- # elif defined(__HP_aCC)
- # include <acxx_demangle.h>
- # endif // GTEST_HASH_CXXABI_H_
- namespace testing {
- namespace internal {
- // Canonicalizes a given name with respect to the Standard C++ Library.
- // This handles removing the inline namespace within `std` that is
- // used by various standard libraries (e.g., `std::__1`). Names outside
- // of namespace std are returned unmodified.
- inline std::string CanonicalizeForStdLibVersioning(std::string s) {
- static const char prefix[] = "std::__";
- if (s.compare(0, strlen(prefix), prefix) == 0) {
- std::string::size_type end = s.find("::", strlen(prefix));
- if (end != s.npos) {
- // Erase everything between the initial `std` and the second `::`.
- s.erase(strlen("std"), end - strlen("std"));
- }
- }
- return s;
- }
- #if GTEST_HAS_RTTI
- // GetTypeName(const std::type_info&) returns a human-readable name of type T.
- inline std::string GetTypeName(const std::type_info& type) {
- const char* const name = type.name();
- #if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
- int status = 0;
- // gcc's implementation of typeid(T).name() mangles the type name,
- // so we have to demangle it.
- #if GTEST_HAS_CXXABI_H_
- using abi::__cxa_demangle;
- #endif // GTEST_HAS_CXXABI_H_
- char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status);
- const std::string name_str(status == 0 ? readable_name : name);
- free(readable_name);
- return CanonicalizeForStdLibVersioning(name_str);
- #else
- return name;
- #endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
- }
- #endif // GTEST_HAS_RTTI
- // GetTypeName<T>() returns a human-readable name of type T if and only if
- // RTTI is enabled, otherwise it returns a dummy type name.
- // NB: This function is also used in Google Mock, so don't move it inside of
- // the typed-test-only section below.
- template <typename T>
- std::string GetTypeName() {
- #if GTEST_HAS_RTTI
- return GetTypeName(typeid(T));
- #else
- return "<type>";
- #endif // GTEST_HAS_RTTI
- }
- // A unique type indicating an empty node
- struct None {};
- # define GTEST_TEMPLATE_ template <typename T> class
- // The template "selector" struct TemplateSel<Tmpl> is used to
- // represent Tmpl, which must be a class template with one type
- // parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
- // as the type Tmpl<T>. This allows us to actually instantiate the
- // template "selected" by TemplateSel<Tmpl>.
- //
- // This trick is necessary for simulating typedef for class templates,
- // which C++ doesn't support directly.
- template <GTEST_TEMPLATE_ Tmpl>
- struct TemplateSel {
- template <typename T>
- struct Bind {
- typedef Tmpl<T> type;
- };
- };
- # define GTEST_BIND_(TmplSel, T) \
- TmplSel::template Bind<T>::type
- template <GTEST_TEMPLATE_ Head_, GTEST_TEMPLATE_... Tail_>
- struct Templates {
- using Head = TemplateSel<Head_>;
- using Tail = Templates<Tail_...>;
- };
- template <GTEST_TEMPLATE_ Head_>
- struct Templates<Head_> {
- using Head = TemplateSel<Head_>;
- using Tail = None;
- };
- // Tuple-like type lists
- template <typename Head_, typename... Tail_>
- struct Types {
- using Head = Head_;
- using Tail = Types<Tail_...>;
- };
- template <typename Head_>
- struct Types<Head_> {
- using Head = Head_;
- using Tail = None;
- };
- // Helper metafunctions to tell apart a single type from types
- // generated by ::testing::Types
- template <typename... Ts>
- struct ProxyTypeList {
- using type = Types<Ts...>;
- };
- template <typename>
- struct is_proxy_type_list : std::false_type {};
- template <typename... Ts>
- struct is_proxy_type_list<ProxyTypeList<Ts...>> : std::true_type {};
- // Generator which conditionally creates type lists.
- // It recognizes if a requested type list should be created
- // and prevents creating a new type list nested within another one.
- template <typename T>
- struct GenerateTypeList {
- private:
- using proxy = typename std::conditional<is_proxy_type_list<T>::value, T,
- ProxyTypeList<T>>::type;
- public:
- using type = typename proxy::type;
- };
- } // namespace internal
- template <typename... Ts>
- using Types = internal::ProxyTypeList<Ts...>;
- } // namespace testing
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
- // Due to C++ preprocessor weirdness, we need double indirection to
- // concatenate two tokens when one of them is __LINE__. Writing
- //
- // foo ## __LINE__
- //
- // will result in the token foo__LINE__, instead of foo followed by
- // the current line number. For more details, see
- // http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
- #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
- #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
- // Stringifies its argument.
- // Work around a bug in visual studio which doesn't accept code like this:
- //
- // #define GTEST_STRINGIFY_(name) #name
- // #define MACRO(a, b, c) ... GTEST_STRINGIFY_(a) ...
- // MACRO(, x, y)
- //
- // Complaining about the argument to GTEST_STRINGIFY_ being empty.
- // This is allowed by the spec.
- #define GTEST_STRINGIFY_HELPER_(name, ...) #name
- #define GTEST_STRINGIFY_(...) GTEST_STRINGIFY_HELPER_(__VA_ARGS__, )
- namespace proto2 {
- class MessageLite;
- }
- namespace testing {
- // Forward declarations.
- class AssertionResult; // Result of an assertion.
- class Message; // Represents a failure message.
- class Test; // Represents a test.
- class TestInfo; // Information about a test.
- class TestPartResult; // Result of a test part.
- class UnitTest; // A collection of test suites.
- template <typename T>
- ::std::string PrintToString(const T& value);
- namespace internal {
- struct TraceInfo; // Information about a trace point.
- class TestInfoImpl; // Opaque implementation of TestInfo
- class UnitTestImpl; // Opaque implementation of UnitTest
- // The text used in failure messages to indicate the start of the
- // stack trace.
- GTEST_API_ extern const char kStackTraceMarker[];
- // An IgnoredValue object can be implicitly constructed from ANY value.
- class IgnoredValue {
- struct Sink {};
- public:
- // This constructor template allows any value to be implicitly
- // converted to IgnoredValue. The object has no data member and
- // doesn't try to remember anything about the argument. We
- // deliberately omit the 'explicit' keyword in order to allow the
- // conversion to be implicit.
- // Disable the conversion if T already has a magical conversion operator.
- // Otherwise we get ambiguity.
- template <typename T,
- typename std::enable_if<!std::is_convertible<T, Sink>::value,
- int>::type = 0>
- IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit)
- };
- // Appends the user-supplied message to the Google-Test-generated message.
- GTEST_API_ std::string AppendUserMessage(
- const std::string& gtest_msg, const Message& user_msg);
- #if GTEST_HAS_EXCEPTIONS
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4275 \
- /* an exported class was derived from a class that was not exported */)
- // This exception is thrown by (and only by) a failed Google Test
- // assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
- // are enabled). We derive it from std::runtime_error, which is for
- // errors presumably detectable only at run time. Since
- // std::runtime_error inherits from std::exception, many testing
- // frameworks know how to extract and print the message inside it.
- class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
- public:
- explicit GoogleTestFailureException(const TestPartResult& failure);
- };
- GTEST_DISABLE_MSC_WARNINGS_POP_() // 4275
- #endif // GTEST_HAS_EXCEPTIONS
- namespace edit_distance {
- // Returns the optimal edits to go from 'left' to 'right'.
- // All edits cost the same, with replace having lower priority than
- // add/remove.
- // Simple implementation of the Wagner-Fischer algorithm.
- // See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm
- enum EditType { kMatch, kAdd, kRemove, kReplace };
- GTEST_API_ std::vector<EditType> CalculateOptimalEdits(
- const std::vector<size_t>& left, const std::vector<size_t>& right);
- // Same as above, but the input is represented as strings.
- GTEST_API_ std::vector<EditType> CalculateOptimalEdits(
- const std::vector<std::string>& left,
- const std::vector<std::string>& right);
- // Create a diff of the input strings in Unified diff format.
- GTEST_API_ std::string CreateUnifiedDiff(const std::vector<std::string>& left,
- const std::vector<std::string>& right,
- size_t context = 2);
- } // namespace edit_distance
- // Calculate the diff between 'left' and 'right' and return it in unified diff
- // format.
- // If not null, stores in 'total_line_count' the total number of lines found
- // in left + right.
- GTEST_API_ std::string DiffStrings(const std::string& left,
- const std::string& right,
- size_t* total_line_count);
- // Constructs and returns the message for an equality assertion
- // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
- //
- // The first four parameters are the expressions used in the assertion
- // and their values, as strings. For example, for ASSERT_EQ(foo, bar)
- // where foo is 5 and bar is 6, we have:
- //
- // expected_expression: "foo"
- // actual_expression: "bar"
- // expected_value: "5"
- // actual_value: "6"
- //
- // The ignoring_case parameter is true if and only if the assertion is a
- // *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
- // be inserted into the message.
- GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
- const char* actual_expression,
- const std::string& expected_value,
- const std::string& actual_value,
- bool ignoring_case);
- // Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
- GTEST_API_ std::string GetBoolAssertionFailureMessage(
- const AssertionResult& assertion_result,
- const char* expression_text,
- const char* actual_predicate_value,
- const char* expected_predicate_value);
- // This template class represents an IEEE floating-point number
- // (either single-precision or double-precision, depending on the
- // template parameters).
- //
- // The purpose of this class is to do more sophisticated number
- // comparison. (Due to round-off error, etc, it's very unlikely that
- // two floating-points will be equal exactly. Hence a naive
- // comparison by the == operation often doesn't work.)
- //
- // Format of IEEE floating-point:
- //
- // The most-significant bit being the leftmost, an IEEE
- // floating-point looks like
- //
- // sign_bit exponent_bits fraction_bits
- //
- // Here, sign_bit is a single bit that designates the sign of the
- // number.
- //
- // For float, there are 8 exponent bits and 23 fraction bits.
- //
- // For double, there are 11 exponent bits and 52 fraction bits.
- //
- // More details can be found at
- // http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
- //
- // Template parameter:
- //
- // RawType: the raw floating-point type (either float or double)
- template <typename RawType>
- class FloatingPoint {
- public:
- // Defines the unsigned integer type that has the same size as the
- // floating point number.
- typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
- // Constants.
- // # of bits in a number.
- static const size_t kBitCount = 8*sizeof(RawType);
- // # of fraction bits in a number.
- static const size_t kFractionBitCount =
- std::numeric_limits<RawType>::digits - 1;
- // # of exponent bits in a number.
- static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
- // The mask for the sign bit.
- static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
- // The mask for the fraction bits.
- static const Bits kFractionBitMask =
- ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
- // The mask for the exponent bits.
- static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
- // How many ULP's (Units in the Last Place) we want to tolerate when
- // comparing two numbers. The larger the value, the more error we
- // allow. A 0 value means that two numbers must be exactly the same
- // to be considered equal.
- //
- // The maximum error of a single floating-point operation is 0.5
- // units in the last place. On Intel CPU's, all floating-point
- // calculations are done with 80-bit precision, while double has 64
- // bits. Therefore, 4 should be enough for ordinary use.
- //
- // See the following article for more details on ULP:
- // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
- static const uint32_t kMaxUlps = 4;
- // Constructs a FloatingPoint from a raw floating-point number.
- //
- // On an Intel CPU, passing a non-normalized NAN (Not a Number)
- // around may change its bits, although the new value is guaranteed
- // to be also a NAN. Therefore, don't expect this constructor to
- // preserve the bits in x when x is a NAN.
- explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
- // Static methods
- // Reinterprets a bit pattern as a floating-point number.
- //
- // This function is needed to test the AlmostEquals() method.
- static RawType ReinterpretBits(const Bits bits) {
- FloatingPoint fp(0);
- fp.u_.bits_ = bits;
- return fp.u_.value_;
- }
- // Returns the floating-point number that represent positive infinity.
- static RawType Infinity() {
- return ReinterpretBits(kExponentBitMask);
- }
- // Returns the maximum representable finite floating-point number.
- static RawType Max();
- // Non-static methods
- // Returns the bits that represents this number.
- const Bits &bits() const { return u_.bits_; }
- // Returns the exponent bits of this number.
- Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
- // Returns the fraction bits of this number.
- Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
- // Returns the sign bit of this number.
- Bits sign_bit() const { return kSignBitMask & u_.bits_; }
- // Returns true if and only if this is NAN (not a number).
- bool is_nan() const {
- // It's a NAN if the exponent bits are all ones and the fraction
- // bits are not entirely zeros.
- return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
- }
- // Returns true if and only if this number is at most kMaxUlps ULP's away
- // from rhs. In particular, this function:
- //
- // - returns false if either number is (or both are) NAN.
- // - treats really large numbers as almost equal to infinity.
- // - thinks +0.0 and -0.0 are 0 DLP's apart.
- bool AlmostEquals(const FloatingPoint& rhs) const {
- // The IEEE standard says that any comparison operation involving
- // a NAN must return false.
- if (is_nan() || rhs.is_nan()) return false;
- return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
- <= kMaxUlps;
- }
- private:
- // The data type used to store the actual floating-point number.
- union FloatingPointUnion {
- RawType value_; // The raw floating-point number.
- Bits bits_; // The bits that represent the number.
- };
- // Converts an integer from the sign-and-magnitude representation to
- // the biased representation. More precisely, let N be 2 to the
- // power of (kBitCount - 1), an integer x is represented by the
- // unsigned number x + N.
- //
- // For instance,
- //
- // -N + 1 (the most negative number representable using
- // sign-and-magnitude) is represented by 1;
- // 0 is represented by N; and
- // N - 1 (the biggest number representable using
- // sign-and-magnitude) is represented by 2N - 1.
- //
- // Read http://en.wikipedia.org/wiki/Signed_number_representations
- // for more details on signed number representations.
- static Bits SignAndMagnitudeToBiased(const Bits &sam) {
- if (kSignBitMask & sam) {
- // sam represents a negative number.
- return ~sam + 1;
- } else {
- // sam represents a positive number.
- return kSignBitMask | sam;
- }
- }
- // Given two numbers in the sign-and-magnitude representation,
- // returns the distance between them as an unsigned number.
- static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
- const Bits &sam2) {
- const Bits biased1 = SignAndMagnitudeToBiased(sam1);
- const Bits biased2 = SignAndMagnitudeToBiased(sam2);
- return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
- }
- FloatingPointUnion u_;
- };
- // We cannot use std::numeric_limits<T>::max() as it clashes with the max()
- // macro defined by <windows.h>.
- template <>
- inline float FloatingPoint<float>::Max() { return FLT_MAX; }
- template <>
- inline double FloatingPoint<double>::Max() { return DBL_MAX; }
- // Typedefs the instances of the FloatingPoint template class that we
- // care to use.
- typedef FloatingPoint<float> Float;
- typedef FloatingPoint<double> Double;
- // In order to catch the mistake of putting tests that use different
- // test fixture classes in the same test suite, we need to assign
- // unique IDs to fixture classes and compare them. The TypeId type is
- // used to hold such IDs. The user should treat TypeId as an opaque
- // type: the only operation allowed on TypeId values is to compare
- // them for equality using the == operator.
- typedef const void* TypeId;
- template <typename T>
- class TypeIdHelper {
- public:
- // dummy_ must not have a const type. Otherwise an overly eager
- // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
- // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
- static bool dummy_;
- };
- template <typename T>
- bool TypeIdHelper<T>::dummy_ = false;
- // GetTypeId<T>() returns the ID of type T. Different values will be
- // returned for different types. Calling the function twice with the
- // same type argument is guaranteed to return the same ID.
- template <typename T>
- TypeId GetTypeId() {
- // The compiler is required to allocate a different
- // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
- // the template. Therefore, the address of dummy_ is guaranteed to
- // be unique.
- return &(TypeIdHelper<T>::dummy_);
- }
- // Returns the type ID of ::testing::Test. Always call this instead
- // of GetTypeId< ::testing::Test>() to get the type ID of
- // ::testing::Test, as the latter may give the wrong result due to a
- // suspected linker bug when compiling Google Test as a Mac OS X
- // framework.
- GTEST_API_ TypeId GetTestTypeId();
- // Defines the abstract factory interface that creates instances
- // of a Test object.
- class TestFactoryBase {
- public:
- virtual ~TestFactoryBase() {}
- // Creates a test instance to run. The instance is both created and destroyed
- // within TestInfoImpl::Run()
- virtual Test* CreateTest() = 0;
- protected:
- TestFactoryBase() {}
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
- };
- // This class provides implementation of TeastFactoryBase interface.
- // It is used in TEST and TEST_F macros.
- template <class TestClass>
- class TestFactoryImpl : public TestFactoryBase {
- public:
- Test* CreateTest() override { return new TestClass; }
- };
- #if GTEST_OS_WINDOWS
- // Predicate-formatters for implementing the HRESULT checking macros
- // {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
- // We pass a long instead of HRESULT to avoid causing an
- // include dependency for the HRESULT type.
- GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
- long hr); // NOLINT
- GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
- long hr); // NOLINT
- #endif // GTEST_OS_WINDOWS
- // Types of SetUpTestSuite() and TearDownTestSuite() functions.
- using SetUpTestSuiteFunc = void (*)();
- using TearDownTestSuiteFunc = void (*)();
- struct CodeLocation {
- CodeLocation(const std::string& a_file, int a_line)
- : file(a_file), line(a_line) {}
- std::string file;
- int line;
- };
- // Helper to identify which setup function for TestCase / TestSuite to call.
- // Only one function is allowed, either TestCase or TestSute but not both.
- // Utility functions to help SuiteApiResolver
- using SetUpTearDownSuiteFuncType = void (*)();
- inline SetUpTearDownSuiteFuncType GetNotDefaultOrNull(
- SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) {
- return a == def ? nullptr : a;
- }
- template <typename T>
- // Note that SuiteApiResolver inherits from T because
- // SetUpTestSuite()/TearDownTestSuite() could be protected. Ths way
- // SuiteApiResolver can access them.
- struct SuiteApiResolver : T {
- // testing::Test is only forward declared at this point. So we make it a
- // dependend class for the compiler to be OK with it.
- using Test =
- typename std::conditional<sizeof(T) != 0, ::testing::Test, void>::type;
- static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char* filename,
- int line_num) {
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- SetUpTearDownSuiteFuncType test_case_fp =
- GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase);
- SetUpTearDownSuiteFuncType test_suite_fp =
- GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite);
- GTEST_CHECK_(!test_case_fp || !test_suite_fp)
- << "Test can not provide both SetUpTestSuite and SetUpTestCase, please "
- "make sure there is only one present at "
- << filename << ":" << line_num;
- return test_case_fp != nullptr ? test_case_fp : test_suite_fp;
- #else
- (void)(filename);
- (void)(line_num);
- return &T::SetUpTestSuite;
- #endif
- }
- static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char* filename,
- int line_num) {
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- SetUpTearDownSuiteFuncType test_case_fp =
- GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase);
- SetUpTearDownSuiteFuncType test_suite_fp =
- GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite);
- GTEST_CHECK_(!test_case_fp || !test_suite_fp)
- << "Test can not provide both TearDownTestSuite and TearDownTestCase,"
- " please make sure there is only one present at"
- << filename << ":" << line_num;
- return test_case_fp != nullptr ? test_case_fp : test_suite_fp;
- #else
- (void)(filename);
- (void)(line_num);
- return &T::TearDownTestSuite;
- #endif
- }
- };
- // Creates a new TestInfo object and registers it with Google Test;
- // returns the created object.
- //
- // Arguments:
- //
- // test_suite_name: name of the test suite
- // name: name of the test
- // type_param: the name of the test's type parameter, or NULL if
- // this is not a typed or a type-parameterized test.
- // value_param: text representation of the test's value parameter,
- // or NULL if this is not a type-parameterized test.
- // code_location: code location where the test is defined
- // fixture_class_id: ID of the test fixture class
- // set_up_tc: pointer to the function that sets up the test suite
- // tear_down_tc: pointer to the function that tears down the test suite
- // factory: pointer to the factory that creates a test object.
- // The newly created TestInfo instance will assume
- // ownership of the factory object.
- GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
- const char* test_suite_name, const char* name, const char* type_param,
- const char* value_param, CodeLocation code_location,
- TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,
- TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory);
- // If *pstr starts with the given prefix, modifies *pstr to be right
- // past the prefix and returns true; otherwise leaves *pstr unchanged
- // and returns false. None of pstr, *pstr, and prefix can be NULL.
- GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
- /* class A needs to have dll-interface to be used by clients of class B */)
- // State of the definition of a type-parameterized test suite.
- class GTEST_API_ TypedTestSuitePState {
- public:
- TypedTestSuitePState() : registered_(false) {}
- // Adds the given test name to defined_test_names_ and return true
- // if the test suite hasn't been registered; otherwise aborts the
- // program.
- bool AddTestName(const char* file, int line, const char* case_name,
- const char* test_name) {
- if (registered_) {
- fprintf(stderr,
- "%s Test %s must be defined before "
- "REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n",
- FormatFileLocation(file, line).c_str(), test_name, case_name);
- fflush(stderr);
- posix::Abort();
- }
- registered_tests_.insert(
- ::std::make_pair(test_name, CodeLocation(file, line)));
- return true;
- }
- bool TestExists(const std::string& test_name) const {
- return registered_tests_.count(test_name) > 0;
- }
- const CodeLocation& GetCodeLocation(const std::string& test_name) const {
- RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name);
- GTEST_CHECK_(it != registered_tests_.end());
- return it->second;
- }
- // Verifies that registered_tests match the test names in
- // defined_test_names_; returns registered_tests if successful, or
- // aborts the program otherwise.
- const char* VerifyRegisteredTestNames(const char* test_suite_name,
- const char* file, int line,
- const char* registered_tests);
- private:
- typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap;
- bool registered_;
- RegisteredTestsMap registered_tests_;
- };
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- using TypedTestCasePState = TypedTestSuitePState;
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
- // Skips to the first non-space char after the first comma in 'str';
- // returns NULL if no comma is found in 'str'.
- inline const char* SkipComma(const char* str) {
- const char* comma = strchr(str, ',');
- if (comma == nullptr) {
- return nullptr;
- }
- while (IsSpace(*(++comma))) {}
- return comma;
- }
- // Returns the prefix of 'str' before the first comma in it; returns
- // the entire string if it contains no comma.
- inline std::string GetPrefixUntilComma(const char* str) {
- const char* comma = strchr(str, ',');
- return comma == nullptr ? str : std::string(str, comma);
- }
- // Splits a given string on a given delimiter, populating a given
- // vector with the fields.
- void SplitString(const ::std::string& str, char delimiter,
- ::std::vector< ::std::string>* dest);
- // The default argument to the template below for the case when the user does
- // not provide a name generator.
- struct DefaultNameGenerator {
- template <typename T>
- static std::string GetName(int i) {
- return StreamableToString(i);
- }
- };
- template <typename Provided = DefaultNameGenerator>
- struct NameGeneratorSelector {
- typedef Provided type;
- };
- template <typename NameGenerator>
- void GenerateNamesRecursively(internal::None, std::vector<std::string>*, int) {}
- template <typename NameGenerator, typename Types>
- void GenerateNamesRecursively(Types, std::vector<std::string>* result, int i) {
- result->push_back(NameGenerator::template GetName<typename Types::Head>(i));
- GenerateNamesRecursively<NameGenerator>(typename Types::Tail(), result,
- i + 1);
- }
- template <typename NameGenerator, typename Types>
- std::vector<std::string> GenerateNames() {
- std::vector<std::string> result;
- GenerateNamesRecursively<NameGenerator>(Types(), &result, 0);
- return result;
- }
- // TypeParameterizedTest<Fixture, TestSel, Types>::Register()
- // registers a list of type-parameterized tests with Google Test. The
- // return value is insignificant - we just need to return something
- // such that we can call this function in a namespace scope.
- //
- // Implementation note: The GTEST_TEMPLATE_ macro declares a template
- // template parameter. It's defined in gtest-type-util.h.
- template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
- class TypeParameterizedTest {
- public:
- // 'index' is the index of the test in the type list 'Types'
- // specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite,
- // Types). Valid values for 'index' are [0, N - 1] where N is the
- // length of Types.
- static bool Register(const char* prefix, const CodeLocation& code_location,
- const char* case_name, const char* test_names, int index,
- const std::vector<std::string>& type_names =
- GenerateNames<DefaultNameGenerator, Types>()) {
- typedef typename Types::Head Type;
- typedef Fixture<Type> FixtureClass;
- typedef typename GTEST_BIND_(TestSel, Type) TestClass;
- // First, registers the first type-parameterized test in the type
- // list.
- MakeAndRegisterTestInfo(
- (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name +
- "/" + type_names[static_cast<size_t>(index)])
- .c_str(),
- StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),
- GetTypeName<Type>().c_str(),
- nullptr, // No value parameter.
- code_location, GetTypeId<FixtureClass>(),
- SuiteApiResolver<TestClass>::GetSetUpCaseOrSuite(
- code_location.file.c_str(), code_location.line),
- SuiteApiResolver<TestClass>::GetTearDownCaseOrSuite(
- code_location.file.c_str(), code_location.line),
- new TestFactoryImpl<TestClass>);
- // Next, recurses (at compile time) with the tail of the type list.
- return TypeParameterizedTest<Fixture, TestSel,
- typename Types::Tail>::Register(prefix,
- code_location,
- case_name,
- test_names,
- index + 1,
- type_names);
- }
- };
- // The base case for the compile time recursion.
- template <GTEST_TEMPLATE_ Fixture, class TestSel>
- class TypeParameterizedTest<Fixture, TestSel, internal::None> {
- public:
- static bool Register(const char* /*prefix*/, const CodeLocation&,
- const char* /*case_name*/, const char* /*test_names*/,
- int /*index*/,
- const std::vector<std::string>& =
- std::vector<std::string>() /*type_names*/) {
- return true;
- }
- };
- GTEST_API_ void RegisterTypeParameterizedTestSuite(const char* test_suite_name,
- CodeLocation code_location);
- GTEST_API_ void RegisterTypeParameterizedTestSuiteInstantiation(
- const char* case_name);
- // TypeParameterizedTestSuite<Fixture, Tests, Types>::Register()
- // registers *all combinations* of 'Tests' and 'Types' with Google
- // Test. The return value is insignificant - we just need to return
- // something such that we can call this function in a namespace scope.
- template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
- class TypeParameterizedTestSuite {
- public:
- static bool Register(const char* prefix, CodeLocation code_location,
- const TypedTestSuitePState* state, const char* case_name,
- const char* test_names,
- const std::vector<std::string>& type_names =
- GenerateNames<DefaultNameGenerator, Types>()) {
- RegisterTypeParameterizedTestSuiteInstantiation(case_name);
- std::string test_name = StripTrailingSpaces(
- GetPrefixUntilComma(test_names));
- if (!state->TestExists(test_name)) {
- fprintf(stderr, "Failed to get code location for test %s.%s at %s.",
- case_name, test_name.c_str(),
- FormatFileLocation(code_location.file.c_str(),
- code_location.line).c_str());
- fflush(stderr);
- posix::Abort();
- }
- const CodeLocation& test_location = state->GetCodeLocation(test_name);
- typedef typename Tests::Head Head;
- // First, register the first test in 'Test' for each type in 'Types'.
- TypeParameterizedTest<Fixture, Head, Types>::Register(
- prefix, test_location, case_name, test_names, 0, type_names);
- // Next, recurses (at compile time) with the tail of the test list.
- return TypeParameterizedTestSuite<Fixture, typename Tests::Tail,
- Types>::Register(prefix, code_location,
- state, case_name,
- SkipComma(test_names),
- type_names);
- }
- };
- // The base case for the compile time recursion.
- template <GTEST_TEMPLATE_ Fixture, typename Types>
- class TypeParameterizedTestSuite<Fixture, internal::None, Types> {
- public:
- static bool Register(const char* /*prefix*/, const CodeLocation&,
- const TypedTestSuitePState* /*state*/,
- const char* /*case_name*/, const char* /*test_names*/,
- const std::vector<std::string>& =
- std::vector<std::string>() /*type_names*/) {
- return true;
- }
- };
- // Returns the current OS stack trace as an std::string.
- //
- // The maximum number of stack frames to be included is specified by
- // the gtest_stack_trace_depth flag. The skip_count parameter
- // specifies the number of top frames to be skipped, which doesn't
- // count against the number of frames to be included.
- //
- // For example, if Foo() calls Bar(), which in turn calls
- // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
- // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
- GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
- UnitTest* unit_test, int skip_count);
- // Helpers for suppressing warnings on unreachable code or constant
- // condition.
- // Always returns true.
- GTEST_API_ bool AlwaysTrue();
- // Always returns false.
- inline bool AlwaysFalse() { return !AlwaysTrue(); }
- // Helper for suppressing false warning from Clang on a const char*
- // variable declared in a conditional expression always being NULL in
- // the else branch.
- struct GTEST_API_ ConstCharPtr {
- ConstCharPtr(const char* str) : value(str) {}
- operator bool() const { return true; }
- const char* value;
- };
- // Helper for declaring std::string within 'if' statement
- // in pre C++17 build environment.
- struct TrueWithString {
- TrueWithString() = default;
- explicit TrueWithString(const char* str) : value(str) {}
- explicit TrueWithString(const std::string& str) : value(str) {}
- explicit operator bool() const { return true; }
- std::string value;
- };
- // A simple Linear Congruential Generator for generating random
- // numbers with a uniform distribution. Unlike rand() and srand(), it
- // doesn't use global state (and therefore can't interfere with user
- // code). Unlike rand_r(), it's portable. An LCG isn't very random,
- // but it's good enough for our purposes.
- class GTEST_API_ Random {
- public:
- static const uint32_t kMaxRange = 1u << 31;
- explicit Random(uint32_t seed) : state_(seed) {}
- void Reseed(uint32_t seed) { state_ = seed; }
- // Generates a random number from [0, range). Crashes if 'range' is
- // 0 or greater than kMaxRange.
- uint32_t Generate(uint32_t range);
- private:
- uint32_t state_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
- };
- // Turns const U&, U&, const U, and U all into U.
- #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
- typename std::remove_const<typename std::remove_reference<T>::type>::type
- // HasDebugStringAndShortDebugString<T>::value is a compile-time bool constant
- // that's true if and only if T has methods DebugString() and ShortDebugString()
- // that return std::string.
- template <typename T>
- class HasDebugStringAndShortDebugString {
- private:
- template <typename C>
- static auto CheckDebugString(C*) -> typename std::is_same<
- std::string, decltype(std::declval<const C>().DebugString())>::type;
- template <typename>
- static std::false_type CheckDebugString(...);
- template <typename C>
- static auto CheckShortDebugString(C*) -> typename std::is_same<
- std::string, decltype(std::declval<const C>().ShortDebugString())>::type;
- template <typename>
- static std::false_type CheckShortDebugString(...);
- using HasDebugStringType = decltype(CheckDebugString<T>(nullptr));
- using HasShortDebugStringType = decltype(CheckShortDebugString<T>(nullptr));
- public:
- static constexpr bool value =
- HasDebugStringType::value && HasShortDebugStringType::value;
- };
- template <typename T>
- constexpr bool HasDebugStringAndShortDebugString<T>::value;
- // When the compiler sees expression IsContainerTest<C>(0), if C is an
- // STL-style container class, the first overload of IsContainerTest
- // will be viable (since both C::iterator* and C::const_iterator* are
- // valid types and NULL can be implicitly converted to them). It will
- // be picked over the second overload as 'int' is a perfect match for
- // the type of argument 0. If C::iterator or C::const_iterator is not
- // a valid type, the first overload is not viable, and the second
- // overload will be picked. Therefore, we can determine whether C is
- // a container class by checking the type of IsContainerTest<C>(0).
- // The value of the expression is insignificant.
- //
- // In C++11 mode we check the existence of a const_iterator and that an
- // iterator is properly implemented for the container.
- //
- // For pre-C++11 that we look for both C::iterator and C::const_iterator.
- // The reason is that C++ injects the name of a class as a member of the
- // class itself (e.g. you can refer to class iterator as either
- // 'iterator' or 'iterator::iterator'). If we look for C::iterator
- // only, for example, we would mistakenly think that a class named
- // iterator is an STL container.
- //
- // Also note that the simpler approach of overloading
- // IsContainerTest(typename C::const_iterator*) and
- // IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
- typedef int IsContainer;
- template <class C,
- class Iterator = decltype(::std::declval<const C&>().begin()),
- class = decltype(::std::declval<const C&>().end()),
- class = decltype(++::std::declval<Iterator&>()),
- class = decltype(*::std::declval<Iterator>()),
- class = typename C::const_iterator>
- IsContainer IsContainerTest(int /* dummy */) {
- return 0;
- }
- typedef char IsNotContainer;
- template <class C>
- IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
- // Trait to detect whether a type T is a hash table.
- // The heuristic used is that the type contains an inner type `hasher` and does
- // not contain an inner type `reverse_iterator`.
- // If the container is iterable in reverse, then order might actually matter.
- template <typename T>
- struct IsHashTable {
- private:
- template <typename U>
- static char test(typename U::hasher*, typename U::reverse_iterator*);
- template <typename U>
- static int test(typename U::hasher*, ...);
- template <typename U>
- static char test(...);
- public:
- static const bool value = sizeof(test<T>(nullptr, nullptr)) == sizeof(int);
- };
- template <typename T>
- const bool IsHashTable<T>::value;
- template <typename C,
- bool = sizeof(IsContainerTest<C>(0)) == sizeof(IsContainer)>
- struct IsRecursiveContainerImpl;
- template <typename C>
- struct IsRecursiveContainerImpl<C, false> : public std::false_type {};
- // Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to
- // obey the same inconsistencies as the IsContainerTest, namely check if
- // something is a container is relying on only const_iterator in C++11 and
- // is relying on both const_iterator and iterator otherwise
- template <typename C>
- struct IsRecursiveContainerImpl<C, true> {
- using value_type = decltype(*std::declval<typename C::const_iterator>());
- using type =
- std::is_same<typename std::remove_const<
- typename std::remove_reference<value_type>::type>::type,
- C>;
- };
- // IsRecursiveContainer<Type> is a unary compile-time predicate that
- // evaluates whether C is a recursive container type. A recursive container
- // type is a container type whose value_type is equal to the container type
- // itself. An example for a recursive container type is
- // boost::filesystem::path, whose iterator has a value_type that is equal to
- // boost::filesystem::path.
- template <typename C>
- struct IsRecursiveContainer : public IsRecursiveContainerImpl<C>::type {};
- // Utilities for native arrays.
- // ArrayEq() compares two k-dimensional native arrays using the
- // elements' operator==, where k can be any integer >= 0. When k is
- // 0, ArrayEq() degenerates into comparing a single pair of values.
- template <typename T, typename U>
- bool ArrayEq(const T* lhs, size_t size, const U* rhs);
- // This generic version is used when k is 0.
- template <typename T, typename U>
- inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
- // This overload is used when k >= 1.
- template <typename T, typename U, size_t N>
- inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
- return internal::ArrayEq(lhs, N, rhs);
- }
- // This helper reduces code bloat. If we instead put its logic inside
- // the previous ArrayEq() function, arrays with different sizes would
- // lead to different copies of the template code.
- template <typename T, typename U>
- bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
- for (size_t i = 0; i != size; i++) {
- if (!internal::ArrayEq(lhs[i], rhs[i]))
- return false;
- }
- return true;
- }
- // Finds the first element in the iterator range [begin, end) that
- // equals elem. Element may be a native array type itself.
- template <typename Iter, typename Element>
- Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
- for (Iter it = begin; it != end; ++it) {
- if (internal::ArrayEq(*it, elem))
- return it;
- }
- return end;
- }
- // CopyArray() copies a k-dimensional native array using the elements'
- // operator=, where k can be any integer >= 0. When k is 0,
- // CopyArray() degenerates into copying a single value.
- template <typename T, typename U>
- void CopyArray(const T* from, size_t size, U* to);
- // This generic version is used when k is 0.
- template <typename T, typename U>
- inline void CopyArray(const T& from, U* to) { *to = from; }
- // This overload is used when k >= 1.
- template <typename T, typename U, size_t N>
- inline void CopyArray(const T(&from)[N], U(*to)[N]) {
- internal::CopyArray(from, N, *to);
- }
- // This helper reduces code bloat. If we instead put its logic inside
- // the previous CopyArray() function, arrays with different sizes
- // would lead to different copies of the template code.
- template <typename T, typename U>
- void CopyArray(const T* from, size_t size, U* to) {
- for (size_t i = 0; i != size; i++) {
- internal::CopyArray(from[i], to + i);
- }
- }
- // The relation between an NativeArray object (see below) and the
- // native array it represents.
- // We use 2 different structs to allow non-copyable types to be used, as long
- // as RelationToSourceReference() is passed.
- struct RelationToSourceReference {};
- struct RelationToSourceCopy {};
- // Adapts a native array to a read-only STL-style container. Instead
- // of the complete STL container concept, this adaptor only implements
- // members useful for Google Mock's container matchers. New members
- // should be added as needed. To simplify the implementation, we only
- // support Element being a raw type (i.e. having no top-level const or
- // reference modifier). It's the client's responsibility to satisfy
- // this requirement. Element can be an array type itself (hence
- // multi-dimensional arrays are supported).
- template <typename Element>
- class NativeArray {
- public:
- // STL-style container typedefs.
- typedef Element value_type;
- typedef Element* iterator;
- typedef const Element* const_iterator;
- // Constructs from a native array. References the source.
- NativeArray(const Element* array, size_t count, RelationToSourceReference) {
- InitRef(array, count);
- }
- // Constructs from a native array. Copies the source.
- NativeArray(const Element* array, size_t count, RelationToSourceCopy) {
- InitCopy(array, count);
- }
- // Copy constructor.
- NativeArray(const NativeArray& rhs) {
- (this->*rhs.clone_)(rhs.array_, rhs.size_);
- }
- ~NativeArray() {
- if (clone_ != &NativeArray::InitRef)
- delete[] array_;
- }
- // STL-style container methods.
- size_t size() const { return size_; }
- const_iterator begin() const { return array_; }
- const_iterator end() const { return array_ + size_; }
- bool operator==(const NativeArray& rhs) const {
- return size() == rhs.size() &&
- ArrayEq(begin(), size(), rhs.begin());
- }
- private:
- static_assert(!std::is_const<Element>::value, "Type must not be const");
- static_assert(!std::is_reference<Element>::value,
- "Type must not be a reference");
- // Initializes this object with a copy of the input.
- void InitCopy(const Element* array, size_t a_size) {
- Element* const copy = new Element[a_size];
- CopyArray(array, a_size, copy);
- array_ = copy;
- size_ = a_size;
- clone_ = &NativeArray::InitCopy;
- }
- // Initializes this object with a reference of the input.
- void InitRef(const Element* array, size_t a_size) {
- array_ = array;
- size_ = a_size;
- clone_ = &NativeArray::InitRef;
- }
- const Element* array_;
- size_t size_;
- void (NativeArray::*clone_)(const Element*, size_t);
- };
- // Backport of std::index_sequence.
- template <size_t... Is>
- struct IndexSequence {
- using type = IndexSequence;
- };
- // Double the IndexSequence, and one if plus_one is true.
- template <bool plus_one, typename T, size_t sizeofT>
- struct DoubleSequence;
- template <size_t... I, size_t sizeofT>
- struct DoubleSequence<true, IndexSequence<I...>, sizeofT> {
- using type = IndexSequence<I..., (sizeofT + I)..., 2 * sizeofT>;
- };
- template <size_t... I, size_t sizeofT>
- struct DoubleSequence<false, IndexSequence<I...>, sizeofT> {
- using type = IndexSequence<I..., (sizeofT + I)...>;
- };
- // Backport of std::make_index_sequence.
- // It uses O(ln(N)) instantiation depth.
- template <size_t N>
- struct MakeIndexSequenceImpl
- : DoubleSequence<N % 2 == 1, typename MakeIndexSequenceImpl<N / 2>::type,
- N / 2>::type {};
- template <>
- struct MakeIndexSequenceImpl<0> : IndexSequence<> {};
- template <size_t N>
- using MakeIndexSequence = typename MakeIndexSequenceImpl<N>::type;
- template <typename... T>
- using IndexSequenceFor = typename MakeIndexSequence<sizeof...(T)>::type;
- template <size_t>
- struct Ignore {
- Ignore(...); // NOLINT
- };
- template <typename>
- struct ElemFromListImpl;
- template <size_t... I>
- struct ElemFromListImpl<IndexSequence<I...>> {
- // We make Ignore a template to solve a problem with MSVC.
- // A non-template Ignore would work fine with `decltype(Ignore(I))...`, but
- // MSVC doesn't understand how to deal with that pack expansion.
- // Use `0 * I` to have a single instantiation of Ignore.
- template <typename R>
- static R Apply(Ignore<0 * I>..., R (*)(), ...);
- };
- template <size_t N, typename... T>
- struct ElemFromList {
- using type =
- decltype(ElemFromListImpl<typename MakeIndexSequence<N>::type>::Apply(
- static_cast<T (*)()>(nullptr)...));
- };
- struct FlatTupleConstructTag {};
- template <typename... T>
- class FlatTuple;
- template <typename Derived, size_t I>
- struct FlatTupleElemBase;
- template <typename... T, size_t I>
- struct FlatTupleElemBase<FlatTuple<T...>, I> {
- using value_type = typename ElemFromList<I, T...>::type;
- FlatTupleElemBase() = default;
- template <typename Arg>
- explicit FlatTupleElemBase(FlatTupleConstructTag, Arg&& t)
- : value(std::forward<Arg>(t)) {}
- value_type value;
- };
- template <typename Derived, typename Idx>
- struct FlatTupleBase;
- template <size_t... Idx, typename... T>
- struct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>>
- : FlatTupleElemBase<FlatTuple<T...>, Idx>... {
- using Indices = IndexSequence<Idx...>;
- FlatTupleBase() = default;
- template <typename... Args>
- explicit FlatTupleBase(FlatTupleConstructTag, Args&&... args)
- : FlatTupleElemBase<FlatTuple<T...>, Idx>(FlatTupleConstructTag{},
- std::forward<Args>(args))... {}
- template <size_t I>
- const typename ElemFromList<I, T...>::type& Get() const {
- return FlatTupleElemBase<FlatTuple<T...>, I>::value;
- }
- template <size_t I>
- typename ElemFromList<I, T...>::type& Get() {
- return FlatTupleElemBase<FlatTuple<T...>, I>::value;
- }
- template <typename F>
- auto Apply(F&& f) -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) {
- return std::forward<F>(f)(Get<Idx>()...);
- }
- template <typename F>
- auto Apply(F&& f) const -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) {
- return std::forward<F>(f)(Get<Idx>()...);
- }
- };
- // Analog to std::tuple but with different tradeoffs.
- // This class minimizes the template instantiation depth, thus allowing more
- // elements than std::tuple would. std::tuple has been seen to require an
- // instantiation depth of more than 10x the number of elements in some
- // implementations.
- // FlatTuple and ElemFromList are not recursive and have a fixed depth
- // regardless of T...
- // MakeIndexSequence, on the other hand, it is recursive but with an
- // instantiation depth of O(ln(N)).
- template <typename... T>
- class FlatTuple
- : private FlatTupleBase<FlatTuple<T...>,
- typename MakeIndexSequence<sizeof...(T)>::type> {
- using Indices = typename FlatTupleBase<
- FlatTuple<T...>, typename MakeIndexSequence<sizeof...(T)>::type>::Indices;
- public:
- FlatTuple() = default;
- template <typename... Args>
- explicit FlatTuple(FlatTupleConstructTag tag, Args&&... args)
- : FlatTuple::FlatTupleBase(tag, std::forward<Args>(args)...) {}
- using FlatTuple::FlatTupleBase::Apply;
- using FlatTuple::FlatTupleBase::Get;
- };
- // Utility functions to be called with static_assert to induce deprecation
- // warnings.
- GTEST_INTERNAL_DEPRECATED(
- "INSTANTIATE_TEST_CASE_P is deprecated, please use "
- "INSTANTIATE_TEST_SUITE_P")
- constexpr bool InstantiateTestCase_P_IsDeprecated() { return true; }
- GTEST_INTERNAL_DEPRECATED(
- "TYPED_TEST_CASE_P is deprecated, please use "
- "TYPED_TEST_SUITE_P")
- constexpr bool TypedTestCase_P_IsDeprecated() { return true; }
- GTEST_INTERNAL_DEPRECATED(
- "TYPED_TEST_CASE is deprecated, please use "
- "TYPED_TEST_SUITE")
- constexpr bool TypedTestCaseIsDeprecated() { return true; }
- GTEST_INTERNAL_DEPRECATED(
- "REGISTER_TYPED_TEST_CASE_P is deprecated, please use "
- "REGISTER_TYPED_TEST_SUITE_P")
- constexpr bool RegisterTypedTestCase_P_IsDeprecated() { return true; }
- GTEST_INTERNAL_DEPRECATED(
- "INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use "
- "INSTANTIATE_TYPED_TEST_SUITE_P")
- constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; }
- } // namespace internal
- } // namespace testing
- namespace std {
- // Some standard library implementations use `struct tuple_size` and some use
- // `class tuple_size`. Clang warns about the mismatch.
- // https://reviews.llvm.org/D55466
- #ifdef __clang__
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wmismatched-tags"
- #endif
- template <typename... Ts>
- struct tuple_size<testing::internal::FlatTuple<Ts...>>
- : std::integral_constant<size_t, sizeof...(Ts)> {};
- #ifdef __clang__
- #pragma clang diagnostic pop
- #endif
- } // namespace std
- #define GTEST_MESSAGE_AT_(file, line, message, result_type) \
- ::testing::internal::AssertHelper(result_type, file, line, message) \
- = ::testing::Message()
- #define GTEST_MESSAGE_(message, result_type) \
- GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
- #define GTEST_FATAL_FAILURE_(message) \
- return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
- #define GTEST_NONFATAL_FAILURE_(message) \
- GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
- #define GTEST_SUCCESS_(message) \
- GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
- #define GTEST_SKIP_(message) \
- return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip)
- // Suppress MSVC warning 4072 (unreachable code) for the code following
- // statement if it returns or throws (or doesn't return or throw in some
- // situations).
- // NOTE: The "else" is important to keep this expansion to prevent a top-level
- // "else" from attaching to our "if".
- #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
- if (::testing::internal::AlwaysTrue()) { \
- statement; \
- } else /* NOLINT */ \
- static_assert(true, "") // User must have a semicolon after expansion.
- #if GTEST_HAS_EXCEPTIONS
- namespace testing {
- namespace internal {
- class NeverThrown {
- public:
- const char* what() const noexcept {
- return "this exception should never be thrown";
- }
- };
- } // namespace internal
- } // namespace testing
- #if GTEST_HAS_RTTI
- #define GTEST_EXCEPTION_TYPE_(e) ::testing::internal::GetTypeName(typeid(e))
- #else // GTEST_HAS_RTTI
- #define GTEST_EXCEPTION_TYPE_(e) \
- std::string { "an std::exception-derived error" }
- #endif // GTEST_HAS_RTTI
- #define GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception) \
- catch (typename std::conditional< \
- std::is_same<typename std::remove_cv<typename std::remove_reference< \
- expected_exception>::type>::type, \
- std::exception>::value, \
- const ::testing::internal::NeverThrown&, const std::exception&>::type \
- e) { \
- gtest_msg.value = "Expected: " #statement \
- " throws an exception of type " #expected_exception \
- ".\n Actual: it throws "; \
- gtest_msg.value += GTEST_EXCEPTION_TYPE_(e); \
- gtest_msg.value += " with description \""; \
- gtest_msg.value += e.what(); \
- gtest_msg.value += "\"."; \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
- }
- #else // GTEST_HAS_EXCEPTIONS
- #define GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception)
- #endif // GTEST_HAS_EXCEPTIONS
- #define GTEST_TEST_THROW_(statement, expected_exception, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::TrueWithString gtest_msg{}) { \
- bool gtest_caught_expected = false; \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } catch (expected_exception const&) { \
- gtest_caught_expected = true; \
- } \
- GTEST_TEST_THROW_CATCH_STD_EXCEPTION_(statement, expected_exception) \
- catch (...) { \
- gtest_msg.value = "Expected: " #statement \
- " throws an exception of type " #expected_exception \
- ".\n Actual: it throws a different type."; \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
- } \
- if (!gtest_caught_expected) { \
- gtest_msg.value = "Expected: " #statement \
- " throws an exception of type " #expected_exception \
- ".\n Actual: it throws nothing."; \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
- } \
- } else /*NOLINT*/ \
- GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__) \
- : fail(gtest_msg.value.c_str())
- #if GTEST_HAS_EXCEPTIONS
- #define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() \
- catch (std::exception const& e) { \
- gtest_msg.value = "it throws "; \
- gtest_msg.value += GTEST_EXCEPTION_TYPE_(e); \
- gtest_msg.value += " with description \""; \
- gtest_msg.value += e.what(); \
- gtest_msg.value += "\"."; \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
- }
- #else // GTEST_HAS_EXCEPTIONS
- #define GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_()
- #endif // GTEST_HAS_EXCEPTIONS
- #define GTEST_TEST_NO_THROW_(statement, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::TrueWithString gtest_msg{}) { \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } \
- GTEST_TEST_NO_THROW_CATCH_STD_EXCEPTION_() \
- catch (...) { \
- gtest_msg.value = "it throws."; \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
- fail(("Expected: " #statement " doesn't throw an exception.\n" \
- " Actual: " + gtest_msg.value).c_str())
- #define GTEST_TEST_ANY_THROW_(statement, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- bool gtest_caught_any = false; \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } \
- catch (...) { \
- gtest_caught_any = true; \
- } \
- if (!gtest_caught_any) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
- fail("Expected: " #statement " throws an exception.\n" \
- " Actual: it doesn't.")
- // Implements Boolean test assertions such as EXPECT_TRUE. expression can be
- // either a boolean expression or an AssertionResult. text is a textual
- // representation of expression as it was passed into the EXPECT_TRUE.
- #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (const ::testing::AssertionResult gtest_ar_ = \
- ::testing::AssertionResult(expression)) \
- ; \
- else \
- fail(::testing::internal::GetBoolAssertionFailureMessage(\
- gtest_ar_, text, #actual, #expected).c_str())
- #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
- fail("Expected: " #statement " doesn't generate new fatal " \
- "failures in the current thread.\n" \
- " Actual: it does.")
- // Expands to the name of the class that implements the given test.
- #define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \
- test_suite_name##_##test_name##_Test
- // Helper macro for defining tests.
- #define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id) \
- static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \
- "test_suite_name must not be empty"); \
- static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1, \
- "test_name must not be empty"); \
- class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \
- : public parent_class { \
- public: \
- GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() = default; \
- ~GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() override = default; \
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
- test_name)); \
- GTEST_DISALLOW_MOVE_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
- test_name)); \
- \
- private: \
- void TestBody() override; \
- static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \
- }; \
- \
- ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \
- test_name)::test_info_ = \
- ::testing::internal::MakeAndRegisterTestInfo( \
- #test_suite_name, #test_name, nullptr, nullptr, \
- ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \
- ::testing::internal::SuiteApiResolver< \
- parent_class>::GetSetUpCaseOrSuite(__FILE__, __LINE__), \
- ::testing::internal::SuiteApiResolver< \
- parent_class>::GetTearDownCaseOrSuite(__FILE__, __LINE__), \
- new ::testing::internal::TestFactoryImpl<GTEST_TEST_CLASS_NAME_( \
- test_suite_name, test_name)>); \
- void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
- // Copyright 2005, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // The Google C++ Testing and Mocking Framework (Google Test)
- //
- // This header file defines the public API for death tests. It is
- // #included by gtest.h so a user doesn't need to include this
- // directly.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
- // Copyright 2005, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // The Google C++ Testing and Mocking Framework (Google Test)
- //
- // This header file defines internal utilities needed for implementing
- // death tests. They are subject to change without notice.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
- // Copyright 2007, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- // The Google C++ Testing and Mocking Framework (Google Test)
- //
- // This file implements just enough of the matcher interface to allow
- // EXPECT_DEATH and friends to accept a matcher argument.
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
- #include <atomic>
- #include <memory>
- #include <ostream>
- #include <string>
- #include <type_traits>
- // Copyright 2007, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- // Google Test - The Google C++ Testing and Mocking Framework
- //
- // This file implements a universal value printer that can print a
- // value of any type T:
- //
- // void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
- //
- // A user can teach this function how to print a class type T by
- // defining either operator<<() or PrintTo() in the namespace that
- // defines T. More specifically, the FIRST defined function in the
- // following list will be used (assuming T is defined in namespace
- // foo):
- //
- // 1. foo::PrintTo(const T&, ostream*)
- // 2. operator<<(ostream&, const T&) defined in either foo or the
- // global namespace.
- //
- // However if T is an STL-style container then it is printed element-wise
- // unless foo::PrintTo(const T&, ostream*) is defined. Note that
- // operator<<() is ignored for container types.
- //
- // If none of the above is defined, it will print the debug string of
- // the value if it is a protocol buffer, or print the raw bytes in the
- // value otherwise.
- //
- // To aid debugging: when T is a reference type, the address of the
- // value is also printed; when T is a (const) char pointer, both the
- // pointer value and the NUL-terminated string it points to are
- // printed.
- //
- // We also provide some convenient wrappers:
- //
- // // Prints a value to a string. For a (const or not) char
- // // pointer, the NUL-terminated string (but not the pointer) is
- // // printed.
- // std::string ::testing::PrintToString(const T& value);
- //
- // // Prints a value tersely: for a reference type, the referenced
- // // value (but not the address) is printed; for a (const or not) char
- // // pointer, the NUL-terminated string (but not the pointer) is
- // // printed.
- // void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
- //
- // // Prints value using the type inferred by the compiler. The difference
- // // from UniversalTersePrint() is that this function prints both the
- // // pointer and the NUL-terminated string for a (const or not) char pointer.
- // void ::testing::internal::UniversalPrint(const T& value, ostream*);
- //
- // // Prints the fields of a tuple tersely to a string vector, one
- // // element for each field. Tuple support must be enabled in
- // // gtest-port.h.
- // std::vector<string> UniversalTersePrintTupleFieldsToStrings(
- // const Tuple& value);
- //
- // Known limitation:
- //
- // The print primitives print the elements of an STL-style container
- // using the compiler-inferred type of *iter where iter is a
- // const_iterator of the container. When const_iterator is an input
- // iterator but not a forward iterator, this inferred type may not
- // match value_type, and the print output may be incorrect. In
- // practice, this is rarely a problem as for most containers
- // const_iterator is a forward iterator. We'll fix this if there's an
- // actual need for it. Note that this fix cannot rely on value_type
- // being defined as many user-defined container types don't have
- // value_type.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
- #include <functional>
- #include <memory>
- #include <ostream> // NOLINT
- #include <sstream>
- #include <string>
- #include <tuple>
- #include <type_traits>
- #include <utility>
- #include <vector>
- namespace testing {
- // Definitions in the internal* namespaces are subject to change without notice.
- // DO NOT USE THEM IN USER CODE!
- namespace internal {
- template <typename T>
- void UniversalPrint(const T& value, ::std::ostream* os);
- // Used to print an STL-style container when the user doesn't define
- // a PrintTo() for it.
- struct ContainerPrinter {
- template <typename T,
- typename = typename std::enable_if<
- (sizeof(IsContainerTest<T>(0)) == sizeof(IsContainer)) &&
- !IsRecursiveContainer<T>::value>::type>
- static void PrintValue(const T& container, std::ostream* os) {
- const size_t kMaxCount = 32; // The maximum number of elements to print.
- *os << '{';
- size_t count = 0;
- for (auto&& elem : container) {
- if (count > 0) {
- *os << ',';
- if (count == kMaxCount) { // Enough has been printed.
- *os << " ...";
- break;
- }
- }
- *os << ' ';
- // We cannot call PrintTo(elem, os) here as PrintTo() doesn't
- // handle `elem` being a native array.
- internal::UniversalPrint(elem, os);
- ++count;
- }
- if (count > 0) {
- *os << ' ';
- }
- *os << '}';
- }
- };
- // Used to print a pointer that is neither a char pointer nor a member
- // pointer, when the user doesn't define PrintTo() for it. (A member
- // variable pointer or member function pointer doesn't really point to
- // a location in the address space. Their representation is
- // implementation-defined. Therefore they will be printed as raw
- // bytes.)
- struct FunctionPointerPrinter {
- template <typename T, typename = typename std::enable_if<
- std::is_function<T>::value>::type>
- static void PrintValue(T* p, ::std::ostream* os) {
- if (p == nullptr) {
- *os << "NULL";
- } else {
- // T is a function type, so '*os << p' doesn't do what we want
- // (it just prints p as bool). We want to print p as a const
- // void*.
- *os << reinterpret_cast<const void*>(p);
- }
- }
- };
- struct PointerPrinter {
- template <typename T>
- static void PrintValue(T* p, ::std::ostream* os) {
- if (p == nullptr) {
- *os << "NULL";
- } else {
- // T is not a function type. We just call << to print p,
- // relying on ADL to pick up user-defined << for their pointer
- // types, if any.
- *os << p;
- }
- }
- };
- namespace internal_stream_operator_without_lexical_name_lookup {
- // The presence of an operator<< here will terminate lexical scope lookup
- // straight away (even though it cannot be a match because of its argument
- // types). Thus, the two operator<< calls in StreamPrinter will find only ADL
- // candidates.
- struct LookupBlocker {};
- void operator<<(LookupBlocker, LookupBlocker);
- struct StreamPrinter {
- template <typename T,
- // Don't accept member pointers here. We'd print them via implicit
- // conversion to bool, which isn't useful.
- typename = typename std::enable_if<
- !std::is_member_pointer<T>::value>::type,
- // Only accept types for which we can find a streaming operator via
- // ADL (possibly involving implicit conversions).
- typename = decltype(std::declval<std::ostream&>()
- << std::declval<const T&>())>
- static void PrintValue(const T& value, ::std::ostream* os) {
- // Call streaming operator found by ADL, possibly with implicit conversions
- // of the arguments.
- *os << value;
- }
- };
- } // namespace internal_stream_operator_without_lexical_name_lookup
- struct ProtobufPrinter {
- // We print a protobuf using its ShortDebugString() when the string
- // doesn't exceed this many characters; otherwise we print it using
- // DebugString() for better readability.
- static const size_t kProtobufOneLinerMaxLength = 50;
- template <typename T,
- typename = typename std::enable_if<
- internal::HasDebugStringAndShortDebugString<T>::value>::type>
- static void PrintValue(const T& value, ::std::ostream* os) {
- std::string pretty_str = value.ShortDebugString();
- if (pretty_str.length() > kProtobufOneLinerMaxLength) {
- pretty_str = "\n" + value.DebugString();
- }
- *os << ("<" + pretty_str + ">");
- }
- };
- struct ConvertibleToIntegerPrinter {
- // Since T has no << operator or PrintTo() but can be implicitly
- // converted to BiggestInt, we print it as a BiggestInt.
- //
- // Most likely T is an enum type (either named or unnamed), in which
- // case printing it as an integer is the desired behavior. In case
- // T is not an enum, printing it as an integer is the best we can do
- // given that it has no user-defined printer.
- static void PrintValue(internal::BiggestInt value, ::std::ostream* os) {
- *os << value;
- }
- };
- struct ConvertibleToStringViewPrinter {
- #if GTEST_INTERNAL_HAS_STRING_VIEW
- static void PrintValue(internal::StringView value, ::std::ostream* os) {
- internal::UniversalPrint(value, os);
- }
- #endif
- };
- // Prints the given number of bytes in the given object to the given
- // ostream.
- GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
- size_t count,
- ::std::ostream* os);
- struct RawBytesPrinter {
- // SFINAE on `sizeof` to make sure we have a complete type.
- template <typename T, size_t = sizeof(T)>
- static void PrintValue(const T& value, ::std::ostream* os) {
- PrintBytesInObjectTo(
- static_cast<const unsigned char*>(
- // Load bearing cast to void* to support iOS
- reinterpret_cast<const void*>(std::addressof(value))),
- sizeof(value), os);
- }
- };
- struct FallbackPrinter {
- template <typename T>
- static void PrintValue(const T&, ::std::ostream* os) {
- *os << "(incomplete type)";
- }
- };
- // Try every printer in order and return the first one that works.
- template <typename T, typename E, typename Printer, typename... Printers>
- struct FindFirstPrinter : FindFirstPrinter<T, E, Printers...> {};
- template <typename T, typename Printer, typename... Printers>
- struct FindFirstPrinter<
- T, decltype(Printer::PrintValue(std::declval<const T&>(), nullptr)),
- Printer, Printers...> {
- using type = Printer;
- };
- // Select the best printer in the following order:
- // - Print containers (they have begin/end/etc).
- // - Print function pointers.
- // - Print object pointers.
- // - Use the stream operator, if available.
- // - Print protocol buffers.
- // - Print types convertible to BiggestInt.
- // - Print types convertible to StringView, if available.
- // - Fallback to printing the raw bytes of the object.
- template <typename T>
- void PrintWithFallback(const T& value, ::std::ostream* os) {
- using Printer = typename FindFirstPrinter<
- T, void, ContainerPrinter, FunctionPointerPrinter, PointerPrinter,
- internal_stream_operator_without_lexical_name_lookup::StreamPrinter,
- ProtobufPrinter, ConvertibleToIntegerPrinter,
- ConvertibleToStringViewPrinter, RawBytesPrinter, FallbackPrinter>::type;
- Printer::PrintValue(value, os);
- }
- // FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
- // value of type ToPrint that is an operand of a comparison assertion
- // (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in
- // the comparison, and is used to help determine the best way to
- // format the value. In particular, when the value is a C string
- // (char pointer) and the other operand is an STL string object, we
- // want to format the C string as a string, since we know it is
- // compared by value with the string object. If the value is a char
- // pointer but the other operand is not an STL string object, we don't
- // know whether the pointer is supposed to point to a NUL-terminated
- // string, and thus want to print it as a pointer to be safe.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- // The default case.
- template <typename ToPrint, typename OtherOperand>
- class FormatForComparison {
- public:
- static ::std::string Format(const ToPrint& value) {
- return ::testing::PrintToString(value);
- }
- };
- // Array.
- template <typename ToPrint, size_t N, typename OtherOperand>
- class FormatForComparison<ToPrint[N], OtherOperand> {
- public:
- static ::std::string Format(const ToPrint* value) {
- return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
- }
- };
- // By default, print C string as pointers to be safe, as we don't know
- // whether they actually point to a NUL-terminated string.
- #define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \
- template <typename OtherOperand> \
- class FormatForComparison<CharType*, OtherOperand> { \
- public: \
- static ::std::string Format(CharType* value) { \
- return ::testing::PrintToString(static_cast<const void*>(value)); \
- } \
- }
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
- #ifdef __cpp_char8_t
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char8_t);
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char8_t);
- #endif
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char16_t);
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char16_t);
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char32_t);
- GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char32_t);
- #undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
- // If a C string is compared with an STL string object, we know it's meant
- // to point to a NUL-terminated string, and thus can print it as a string.
- #define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
- template <> \
- class FormatForComparison<CharType*, OtherStringType> { \
- public: \
- static ::std::string Format(CharType* value) { \
- return ::testing::PrintToString(value); \
- } \
- }
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
- #ifdef __cpp_char8_t
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char8_t, ::std::u8string);
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char8_t, ::std::u8string);
- #endif
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char16_t, ::std::u16string);
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char16_t, ::std::u16string);
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char32_t, ::std::u32string);
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char32_t, ::std::u32string);
- #if GTEST_HAS_STD_WSTRING
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
- GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
- #endif
- #undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
- // Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
- // operand to be used in a failure message. The type (but not value)
- // of the other operand may affect the format. This allows us to
- // print a char* as a raw pointer when it is compared against another
- // char* or void*, and print it as a C string when it is compared
- // against an std::string object, for example.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- template <typename T1, typename T2>
- std::string FormatForComparisonFailureMessage(
- const T1& value, const T2& /* other_operand */) {
- return FormatForComparison<T1, T2>::Format(value);
- }
- // UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
- // value to the given ostream. The caller must ensure that
- // 'ostream_ptr' is not NULL, or the behavior is undefined.
- //
- // We define UniversalPrinter as a class template (as opposed to a
- // function template), as we need to partially specialize it for
- // reference types, which cannot be done with function templates.
- template <typename T>
- class UniversalPrinter;
- // Prints the given value using the << operator if it has one;
- // otherwise prints the bytes in it. This is what
- // UniversalPrinter<T>::Print() does when PrintTo() is not specialized
- // or overloaded for type T.
- //
- // A user can override this behavior for a class type Foo by defining
- // an overload of PrintTo() in the namespace where Foo is defined. We
- // give the user this option as sometimes defining a << operator for
- // Foo is not desirable (e.g. the coding style may prevent doing it,
- // or there is already a << operator but it doesn't do what the user
- // wants).
- template <typename T>
- void PrintTo(const T& value, ::std::ostream* os) {
- internal::PrintWithFallback(value, os);
- }
- // The following list of PrintTo() overloads tells
- // UniversalPrinter<T>::Print() how to print standard types (built-in
- // types, strings, plain arrays, and pointers).
- // Overloads for various char types.
- GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
- GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
- inline void PrintTo(char c, ::std::ostream* os) {
- // When printing a plain char, we always treat it as unsigned. This
- // way, the output won't be affected by whether the compiler thinks
- // char is signed or not.
- PrintTo(static_cast<unsigned char>(c), os);
- }
- // Overloads for other simple built-in types.
- inline void PrintTo(bool x, ::std::ostream* os) {
- *os << (x ? "true" : "false");
- }
- // Overload for wchar_t type.
- // Prints a wchar_t as a symbol if it is printable or as its internal
- // code otherwise and also as its decimal code (except for L'\0').
- // The L'\0' char is printed as "L'\\0'". The decimal code is printed
- // as signed integer when wchar_t is implemented by the compiler
- // as a signed type and is printed as an unsigned integer when wchar_t
- // is implemented as an unsigned type.
- GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
- GTEST_API_ void PrintTo(char32_t c, ::std::ostream* os);
- inline void PrintTo(char16_t c, ::std::ostream* os) {
- PrintTo(ImplicitCast_<char32_t>(c), os);
- }
- #ifdef __cpp_char8_t
- inline void PrintTo(char8_t c, ::std::ostream* os) {
- PrintTo(ImplicitCast_<char32_t>(c), os);
- }
- #endif
- // Overloads for C strings.
- GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
- inline void PrintTo(char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const char*>(s), os);
- }
- // signed/unsigned char is often used for representing binary data, so
- // we print pointers to it as void* to be safe.
- inline void PrintTo(const signed char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
- }
- inline void PrintTo(signed char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
- }
- inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
- }
- inline void PrintTo(unsigned char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
- }
- #ifdef __cpp_char8_t
- // Overloads for u8 strings.
- GTEST_API_ void PrintTo(const char8_t* s, ::std::ostream* os);
- inline void PrintTo(char8_t* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const char8_t*>(s), os);
- }
- #endif
- // Overloads for u16 strings.
- GTEST_API_ void PrintTo(const char16_t* s, ::std::ostream* os);
- inline void PrintTo(char16_t* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const char16_t*>(s), os);
- }
- // Overloads for u32 strings.
- GTEST_API_ void PrintTo(const char32_t* s, ::std::ostream* os);
- inline void PrintTo(char32_t* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const char32_t*>(s), os);
- }
- // MSVC can be configured to define wchar_t as a typedef of unsigned
- // short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
- // type. When wchar_t is a typedef, defining an overload for const
- // wchar_t* would cause unsigned short* be printed as a wide string,
- // possibly causing invalid memory accesses.
- #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
- // Overloads for wide C strings
- GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
- inline void PrintTo(wchar_t* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const wchar_t*>(s), os);
- }
- #endif
- // Overload for C arrays. Multi-dimensional arrays are printed
- // properly.
- // Prints the given number of elements in an array, without printing
- // the curly braces.
- template <typename T>
- void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
- UniversalPrint(a[0], os);
- for (size_t i = 1; i != count; i++) {
- *os << ", ";
- UniversalPrint(a[i], os);
- }
- }
- // Overloads for ::std::string.
- GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
- inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
- PrintStringTo(s, os);
- }
- // Overloads for ::std::u8string
- #ifdef __cpp_char8_t
- GTEST_API_ void PrintU8StringTo(const ::std::u8string& s, ::std::ostream* os);
- inline void PrintTo(const ::std::u8string& s, ::std::ostream* os) {
- PrintU8StringTo(s, os);
- }
- #endif
- // Overloads for ::std::u16string
- GTEST_API_ void PrintU16StringTo(const ::std::u16string& s, ::std::ostream* os);
- inline void PrintTo(const ::std::u16string& s, ::std::ostream* os) {
- PrintU16StringTo(s, os);
- }
- // Overloads for ::std::u32string
- GTEST_API_ void PrintU32StringTo(const ::std::u32string& s, ::std::ostream* os);
- inline void PrintTo(const ::std::u32string& s, ::std::ostream* os) {
- PrintU32StringTo(s, os);
- }
- // Overloads for ::std::wstring.
- #if GTEST_HAS_STD_WSTRING
- GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
- inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
- PrintWideStringTo(s, os);
- }
- #endif // GTEST_HAS_STD_WSTRING
- #if GTEST_INTERNAL_HAS_STRING_VIEW
- // Overload for internal::StringView.
- inline void PrintTo(internal::StringView sp, ::std::ostream* os) {
- PrintTo(::std::string(sp), os);
- }
- #endif // GTEST_INTERNAL_HAS_STRING_VIEW
- inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; }
- template <typename T>
- void PrintTo(std::reference_wrapper<T> ref, ::std::ostream* os) {
- UniversalPrinter<T&>::Print(ref.get(), os);
- }
- inline const void* VoidifyPointer(const void* p) { return p; }
- inline const void* VoidifyPointer(volatile const void* p) {
- return const_cast<const void*>(p);
- }
- template <typename T, typename Ptr>
- void PrintSmartPointer(const Ptr& ptr, std::ostream* os, char) {
- if (ptr == nullptr) {
- *os << "(nullptr)";
- } else {
- // We can't print the value. Just print the pointer..
- *os << "(" << (VoidifyPointer)(ptr.get()) << ")";
- }
- }
- template <typename T, typename Ptr,
- typename = typename std::enable_if<!std::is_void<T>::value &&
- !std::is_array<T>::value>::type>
- void PrintSmartPointer(const Ptr& ptr, std::ostream* os, int) {
- if (ptr == nullptr) {
- *os << "(nullptr)";
- } else {
- *os << "(ptr = " << (VoidifyPointer)(ptr.get()) << ", value = ";
- UniversalPrinter<T>::Print(*ptr, os);
- *os << ")";
- }
- }
- template <typename T, typename D>
- void PrintTo(const std::unique_ptr<T, D>& ptr, std::ostream* os) {
- (PrintSmartPointer<T>)(ptr, os, 0);
- }
- template <typename T>
- void PrintTo(const std::shared_ptr<T>& ptr, std::ostream* os) {
- (PrintSmartPointer<T>)(ptr, os, 0);
- }
- // Helper function for printing a tuple. T must be instantiated with
- // a tuple type.
- template <typename T>
- void PrintTupleTo(const T&, std::integral_constant<size_t, 0>,
- ::std::ostream*) {}
- template <typename T, size_t I>
- void PrintTupleTo(const T& t, std::integral_constant<size_t, I>,
- ::std::ostream* os) {
- PrintTupleTo(t, std::integral_constant<size_t, I - 1>(), os);
- GTEST_INTENTIONAL_CONST_COND_PUSH_()
- if (I > 1) {
- GTEST_INTENTIONAL_CONST_COND_POP_()
- *os << ", ";
- }
- UniversalPrinter<typename std::tuple_element<I - 1, T>::type>::Print(
- std::get<I - 1>(t), os);
- }
- template <typename... Types>
- void PrintTo(const ::std::tuple<Types...>& t, ::std::ostream* os) {
- *os << "(";
- PrintTupleTo(t, std::integral_constant<size_t, sizeof...(Types)>(), os);
- *os << ")";
- }
- // Overload for std::pair.
- template <typename T1, typename T2>
- void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
- *os << '(';
- // We cannot use UniversalPrint(value.first, os) here, as T1 may be
- // a reference type. The same for printing value.second.
- UniversalPrinter<T1>::Print(value.first, os);
- *os << ", ";
- UniversalPrinter<T2>::Print(value.second, os);
- *os << ')';
- }
- // Implements printing a non-reference type T by letting the compiler
- // pick the right overload of PrintTo() for T.
- template <typename T>
- class UniversalPrinter {
- public:
- // MSVC warns about adding const to a function type, so we want to
- // disable the warning.
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
- // Note: we deliberately don't call this PrintTo(), as that name
- // conflicts with ::testing::internal::PrintTo in the body of the
- // function.
- static void Print(const T& value, ::std::ostream* os) {
- // By default, ::testing::internal::PrintTo() is used for printing
- // the value.
- //
- // Thanks to Koenig look-up, if T is a class and has its own
- // PrintTo() function defined in its namespace, that function will
- // be visible here. Since it is more specific than the generic ones
- // in ::testing::internal, it will be picked by the compiler in the
- // following statement - exactly what we want.
- PrintTo(value, os);
- }
- GTEST_DISABLE_MSC_WARNINGS_POP_()
- };
- // Remove any const-qualifiers before passing a type to UniversalPrinter.
- template <typename T>
- class UniversalPrinter<const T> : public UniversalPrinter<T> {};
- #if GTEST_INTERNAL_HAS_ANY
- // Printer for std::any / absl::any
- template <>
- class UniversalPrinter<Any> {
- public:
- static void Print(const Any& value, ::std::ostream* os) {
- if (value.has_value()) {
- *os << "value of type " << GetTypeName(value);
- } else {
- *os << "no value";
- }
- }
- private:
- static std::string GetTypeName(const Any& value) {
- #if GTEST_HAS_RTTI
- return internal::GetTypeName(value.type());
- #else
- static_cast<void>(value); // possibly unused
- return "<unknown_type>";
- #endif // GTEST_HAS_RTTI
- }
- };
- #endif // GTEST_INTERNAL_HAS_ANY
- #if GTEST_INTERNAL_HAS_OPTIONAL
- // Printer for std::optional / absl::optional
- template <typename T>
- class UniversalPrinter<Optional<T>> {
- public:
- static void Print(const Optional<T>& value, ::std::ostream* os) {
- *os << '(';
- if (!value) {
- *os << "nullopt";
- } else {
- UniversalPrint(*value, os);
- }
- *os << ')';
- }
- };
- #endif // GTEST_INTERNAL_HAS_OPTIONAL
- #if GTEST_INTERNAL_HAS_VARIANT
- // Printer for std::variant / absl::variant
- template <typename... T>
- class UniversalPrinter<Variant<T...>> {
- public:
- static void Print(const Variant<T...>& value, ::std::ostream* os) {
- *os << '(';
- #if GTEST_HAS_ABSL
- absl::visit(Visitor{os, value.index()}, value);
- #else
- std::visit(Visitor{os, value.index()}, value);
- #endif // GTEST_HAS_ABSL
- *os << ')';
- }
- private:
- struct Visitor {
- template <typename U>
- void operator()(const U& u) const {
- *os << "'" << GetTypeName<U>() << "(index = " << index
- << ")' with value ";
- UniversalPrint(u, os);
- }
- ::std::ostream* os;
- std::size_t index;
- };
- };
- #endif // GTEST_INTERNAL_HAS_VARIANT
- // UniversalPrintArray(begin, len, os) prints an array of 'len'
- // elements, starting at address 'begin'.
- template <typename T>
- void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
- if (len == 0) {
- *os << "{}";
- } else {
- *os << "{ ";
- const size_t kThreshold = 18;
- const size_t kChunkSize = 8;
- // If the array has more than kThreshold elements, we'll have to
- // omit some details by printing only the first and the last
- // kChunkSize elements.
- if (len <= kThreshold) {
- PrintRawArrayTo(begin, len, os);
- } else {
- PrintRawArrayTo(begin, kChunkSize, os);
- *os << ", ..., ";
- PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
- }
- *os << " }";
- }
- }
- // This overload prints a (const) char array compactly.
- GTEST_API_ void UniversalPrintArray(
- const char* begin, size_t len, ::std::ostream* os);
- #ifdef __cpp_char8_t
- // This overload prints a (const) char8_t array compactly.
- GTEST_API_ void UniversalPrintArray(const char8_t* begin, size_t len,
- ::std::ostream* os);
- #endif
- // This overload prints a (const) char16_t array compactly.
- GTEST_API_ void UniversalPrintArray(const char16_t* begin, size_t len,
- ::std::ostream* os);
- // This overload prints a (const) char32_t array compactly.
- GTEST_API_ void UniversalPrintArray(const char32_t* begin, size_t len,
- ::std::ostream* os);
- // This overload prints a (const) wchar_t array compactly.
- GTEST_API_ void UniversalPrintArray(
- const wchar_t* begin, size_t len, ::std::ostream* os);
- // Implements printing an array type T[N].
- template <typename T, size_t N>
- class UniversalPrinter<T[N]> {
- public:
- // Prints the given array, omitting some elements when there are too
- // many.
- static void Print(const T (&a)[N], ::std::ostream* os) {
- UniversalPrintArray(a, N, os);
- }
- };
- // Implements printing a reference type T&.
- template <typename T>
- class UniversalPrinter<T&> {
- public:
- // MSVC warns about adding const to a function type, so we want to
- // disable the warning.
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
- static void Print(const T& value, ::std::ostream* os) {
- // Prints the address of the value. We use reinterpret_cast here
- // as static_cast doesn't compile when T is a function type.
- *os << "@" << reinterpret_cast<const void*>(&value) << " ";
- // Then prints the value itself.
- UniversalPrint(value, os);
- }
- GTEST_DISABLE_MSC_WARNINGS_POP_()
- };
- // Prints a value tersely: for a reference type, the referenced value
- // (but not the address) is printed; for a (const) char pointer, the
- // NUL-terminated string (but not the pointer) is printed.
- template <typename T>
- class UniversalTersePrinter {
- public:
- static void Print(const T& value, ::std::ostream* os) {
- UniversalPrint(value, os);
- }
- };
- template <typename T>
- class UniversalTersePrinter<T&> {
- public:
- static void Print(const T& value, ::std::ostream* os) {
- UniversalPrint(value, os);
- }
- };
- template <typename T, size_t N>
- class UniversalTersePrinter<T[N]> {
- public:
- static void Print(const T (&value)[N], ::std::ostream* os) {
- UniversalPrinter<T[N]>::Print(value, os);
- }
- };
- template <>
- class UniversalTersePrinter<const char*> {
- public:
- static void Print(const char* str, ::std::ostream* os) {
- if (str == nullptr) {
- *os << "NULL";
- } else {
- UniversalPrint(std::string(str), os);
- }
- }
- };
- template <>
- class UniversalTersePrinter<char*> : public UniversalTersePrinter<const char*> {
- };
- #ifdef __cpp_char8_t
- template <>
- class UniversalTersePrinter<const char8_t*> {
- public:
- static void Print(const char8_t* str, ::std::ostream* os) {
- if (str == nullptr) {
- *os << "NULL";
- } else {
- UniversalPrint(::std::u8string(str), os);
- }
- }
- };
- template <>
- class UniversalTersePrinter<char8_t*>
- : public UniversalTersePrinter<const char8_t*> {};
- #endif
- template <>
- class UniversalTersePrinter<const char16_t*> {
- public:
- static void Print(const char16_t* str, ::std::ostream* os) {
- if (str == nullptr) {
- *os << "NULL";
- } else {
- UniversalPrint(::std::u16string(str), os);
- }
- }
- };
- template <>
- class UniversalTersePrinter<char16_t*>
- : public UniversalTersePrinter<const char16_t*> {};
- template <>
- class UniversalTersePrinter<const char32_t*> {
- public:
- static void Print(const char32_t* str, ::std::ostream* os) {
- if (str == nullptr) {
- *os << "NULL";
- } else {
- UniversalPrint(::std::u32string(str), os);
- }
- }
- };
- template <>
- class UniversalTersePrinter<char32_t*>
- : public UniversalTersePrinter<const char32_t*> {};
- #if GTEST_HAS_STD_WSTRING
- template <>
- class UniversalTersePrinter<const wchar_t*> {
- public:
- static void Print(const wchar_t* str, ::std::ostream* os) {
- if (str == nullptr) {
- *os << "NULL";
- } else {
- UniversalPrint(::std::wstring(str), os);
- }
- }
- };
- #endif
- template <>
- class UniversalTersePrinter<wchar_t*> {
- public:
- static void Print(wchar_t* str, ::std::ostream* os) {
- UniversalTersePrinter<const wchar_t*>::Print(str, os);
- }
- };
- template <typename T>
- void UniversalTersePrint(const T& value, ::std::ostream* os) {
- UniversalTersePrinter<T>::Print(value, os);
- }
- // Prints a value using the type inferred by the compiler. The
- // difference between this and UniversalTersePrint() is that for a
- // (const) char pointer, this prints both the pointer and the
- // NUL-terminated string.
- template <typename T>
- void UniversalPrint(const T& value, ::std::ostream* os) {
- // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
- // UniversalPrinter with T directly.
- typedef T T1;
- UniversalPrinter<T1>::Print(value, os);
- }
- typedef ::std::vector< ::std::string> Strings;
- // Tersely prints the first N fields of a tuple to a string vector,
- // one element for each field.
- template <typename Tuple>
- void TersePrintPrefixToStrings(const Tuple&, std::integral_constant<size_t, 0>,
- Strings*) {}
- template <typename Tuple, size_t I>
- void TersePrintPrefixToStrings(const Tuple& t,
- std::integral_constant<size_t, I>,
- Strings* strings) {
- TersePrintPrefixToStrings(t, std::integral_constant<size_t, I - 1>(),
- strings);
- ::std::stringstream ss;
- UniversalTersePrint(std::get<I - 1>(t), &ss);
- strings->push_back(ss.str());
- }
- // Prints the fields of a tuple tersely to a string vector, one
- // element for each field. See the comment before
- // UniversalTersePrint() for how we define "tersely".
- template <typename Tuple>
- Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
- Strings result;
- TersePrintPrefixToStrings(
- value, std::integral_constant<size_t, std::tuple_size<Tuple>::value>(),
- &result);
- return result;
- }
- } // namespace internal
- template <typename T>
- ::std::string PrintToString(const T& value) {
- ::std::stringstream ss;
- internal::UniversalTersePrinter<T>::Print(value, &ss);
- return ss.str();
- }
- } // namespace testing
- // Include any custom printer added by the local installation.
- // We must include this header at the end to make sure it can use the
- // declarations from this file.
- // Copyright 2015, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // This file provides an injection point for custom printers in a local
- // installation of gTest.
- // It will be included from gtest-printers.h and the overrides in this file
- // will be visible to everyone.
- //
- // Injection point for custom user configurations. See README for details
- //
- // ** Custom implementation starts here **
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
- // MSVC warning C5046 is new as of VS2017 version 15.8.
- #if defined(_MSC_VER) && _MSC_VER >= 1915
- #define GTEST_MAYBE_5046_ 5046
- #else
- #define GTEST_MAYBE_5046_
- #endif
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(
- 4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used by
- clients of class B */
- /* Symbol involving type with internal linkage not defined */)
- namespace testing {
- // To implement a matcher Foo for type T, define:
- // 1. a class FooMatcherMatcher that implements the matcher interface:
- // using is_gtest_matcher = void;
- // bool MatchAndExplain(const T&, std::ostream*);
- // (MatchResultListener* can also be used instead of std::ostream*)
- // void DescribeTo(std::ostream*);
- // void DescribeNegationTo(std::ostream*);
- //
- // 2. a factory function that creates a Matcher<T> object from a
- // FooMatcherMatcher.
- class MatchResultListener {
- public:
- // Creates a listener object with the given underlying ostream. The
- // listener does not own the ostream, and does not dereference it
- // in the constructor or destructor.
- explicit MatchResultListener(::std::ostream* os) : stream_(os) {}
- virtual ~MatchResultListener() = 0; // Makes this class abstract.
- // Streams x to the underlying ostream; does nothing if the ostream
- // is NULL.
- template <typename T>
- MatchResultListener& operator<<(const T& x) {
- if (stream_ != nullptr) *stream_ << x;
- return *this;
- }
- // Returns the underlying ostream.
- ::std::ostream* stream() { return stream_; }
- // Returns true if and only if the listener is interested in an explanation
- // of the match result. A matcher's MatchAndExplain() method can use
- // this information to avoid generating the explanation when no one
- // intends to hear it.
- bool IsInterested() const { return stream_ != nullptr; }
- private:
- ::std::ostream* const stream_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);
- };
- inline MatchResultListener::~MatchResultListener() {
- }
- // An instance of a subclass of this knows how to describe itself as a
- // matcher.
- class GTEST_API_ MatcherDescriberInterface {
- public:
- virtual ~MatcherDescriberInterface() {}
- // Describes this matcher to an ostream. The function should print
- // a verb phrase that describes the property a value matching this
- // matcher should have. The subject of the verb phrase is the value
- // being matched. For example, the DescribeTo() method of the Gt(7)
- // matcher prints "is greater than 7".
- virtual void DescribeTo(::std::ostream* os) const = 0;
- // Describes the negation of this matcher to an ostream. For
- // example, if the description of this matcher is "is greater than
- // 7", the negated description could be "is not greater than 7".
- // You are not required to override this when implementing
- // MatcherInterface, but it is highly advised so that your matcher
- // can produce good error messages.
- virtual void DescribeNegationTo(::std::ostream* os) const {
- *os << "not (";
- DescribeTo(os);
- *os << ")";
- }
- };
- // The implementation of a matcher.
- template <typename T>
- class MatcherInterface : public MatcherDescriberInterface {
- public:
- // Returns true if and only if the matcher matches x; also explains the
- // match result to 'listener' if necessary (see the next paragraph), in
- // the form of a non-restrictive relative clause ("which ...",
- // "whose ...", etc) that describes x. For example, the
- // MatchAndExplain() method of the Pointee(...) matcher should
- // generate an explanation like "which points to ...".
- //
- // Implementations of MatchAndExplain() should add an explanation of
- // the match result *if and only if* they can provide additional
- // information that's not already present (or not obvious) in the
- // print-out of x and the matcher's description. Whether the match
- // succeeds is not a factor in deciding whether an explanation is
- // needed, as sometimes the caller needs to print a failure message
- // when the match succeeds (e.g. when the matcher is used inside
- // Not()).
- //
- // For example, a "has at least 10 elements" matcher should explain
- // what the actual element count is, regardless of the match result,
- // as it is useful information to the reader; on the other hand, an
- // "is empty" matcher probably only needs to explain what the actual
- // size is when the match fails, as it's redundant to say that the
- // size is 0 when the value is already known to be empty.
- //
- // You should override this method when defining a new matcher.
- //
- // It's the responsibility of the caller (Google Test) to guarantee
- // that 'listener' is not NULL. This helps to simplify a matcher's
- // implementation when it doesn't care about the performance, as it
- // can talk to 'listener' without checking its validity first.
- // However, in order to implement dummy listeners efficiently,
- // listener->stream() may be NULL.
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;
- // Inherits these methods from MatcherDescriberInterface:
- // virtual void DescribeTo(::std::ostream* os) const = 0;
- // virtual void DescribeNegationTo(::std::ostream* os) const;
- };
- namespace internal {
- struct AnyEq {
- template <typename A, typename B>
- bool operator()(const A& a, const B& b) const { return a == b; }
- };
- struct AnyNe {
- template <typename A, typename B>
- bool operator()(const A& a, const B& b) const { return a != b; }
- };
- struct AnyLt {
- template <typename A, typename B>
- bool operator()(const A& a, const B& b) const { return a < b; }
- };
- struct AnyGt {
- template <typename A, typename B>
- bool operator()(const A& a, const B& b) const { return a > b; }
- };
- struct AnyLe {
- template <typename A, typename B>
- bool operator()(const A& a, const B& b) const { return a <= b; }
- };
- struct AnyGe {
- template <typename A, typename B>
- bool operator()(const A& a, const B& b) const { return a >= b; }
- };
- // A match result listener that ignores the explanation.
- class DummyMatchResultListener : public MatchResultListener {
- public:
- DummyMatchResultListener() : MatchResultListener(nullptr) {}
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);
- };
- // A match result listener that forwards the explanation to a given
- // ostream. The difference between this and MatchResultListener is
- // that the former is concrete.
- class StreamMatchResultListener : public MatchResultListener {
- public:
- explicit StreamMatchResultListener(::std::ostream* os)
- : MatchResultListener(os) {}
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);
- };
- struct SharedPayloadBase {
- std::atomic<int> ref{1};
- void Ref() { ref.fetch_add(1, std::memory_order_relaxed); }
- bool Unref() { return ref.fetch_sub(1, std::memory_order_acq_rel) == 1; }
- };
- template <typename T>
- struct SharedPayload : SharedPayloadBase {
- explicit SharedPayload(const T& v) : value(v) {}
- explicit SharedPayload(T&& v) : value(std::move(v)) {}
- static void Destroy(SharedPayloadBase* shared) {
- delete static_cast<SharedPayload*>(shared);
- }
- T value;
- };
- // An internal class for implementing Matcher<T>, which will derive
- // from it. We put functionalities common to all Matcher<T>
- // specializations here to avoid code duplication.
- template <typename T>
- class MatcherBase : private MatcherDescriberInterface {
- public:
- // Returns true if and only if the matcher matches x; also explains the
- // match result to 'listener'.
- bool MatchAndExplain(const T& x, MatchResultListener* listener) const {
- GTEST_CHECK_(vtable_ != nullptr);
- return vtable_->match_and_explain(*this, x, listener);
- }
- // Returns true if and only if this matcher matches x.
- bool Matches(const T& x) const {
- DummyMatchResultListener dummy;
- return MatchAndExplain(x, &dummy);
- }
- // Describes this matcher to an ostream.
- void DescribeTo(::std::ostream* os) const final {
- GTEST_CHECK_(vtable_ != nullptr);
- vtable_->describe(*this, os, false);
- }
- // Describes the negation of this matcher to an ostream.
- void DescribeNegationTo(::std::ostream* os) const final {
- GTEST_CHECK_(vtable_ != nullptr);
- vtable_->describe(*this, os, true);
- }
- // Explains why x matches, or doesn't match, the matcher.
- void ExplainMatchResultTo(const T& x, ::std::ostream* os) const {
- StreamMatchResultListener listener(os);
- MatchAndExplain(x, &listener);
- }
- // Returns the describer for this matcher object; retains ownership
- // of the describer, which is only guaranteed to be alive when
- // this matcher object is alive.
- const MatcherDescriberInterface* GetDescriber() const {
- if (vtable_ == nullptr) return nullptr;
- return vtable_->get_describer(*this);
- }
- protected:
- MatcherBase() : vtable_(nullptr) {}
- // Constructs a matcher from its implementation.
- template <typename U>
- explicit MatcherBase(const MatcherInterface<U>* impl) {
- Init(impl);
- }
- template <typename M, typename = typename std::remove_reference<
- M>::type::is_gtest_matcher>
- MatcherBase(M&& m) { // NOLINT
- Init(std::forward<M>(m));
- }
- MatcherBase(const MatcherBase& other)
- : vtable_(other.vtable_), buffer_(other.buffer_) {
- if (IsShared()) buffer_.shared->Ref();
- }
- MatcherBase& operator=(const MatcherBase& other) {
- if (this == &other) return *this;
- Destroy();
- vtable_ = other.vtable_;
- buffer_ = other.buffer_;
- if (IsShared()) buffer_.shared->Ref();
- return *this;
- }
- MatcherBase(MatcherBase&& other)
- : vtable_(other.vtable_), buffer_(other.buffer_) {
- other.vtable_ = nullptr;
- }
- MatcherBase& operator=(MatcherBase&& other) {
- if (this == &other) return *this;
- Destroy();
- vtable_ = other.vtable_;
- buffer_ = other.buffer_;
- other.vtable_ = nullptr;
- return *this;
- }
- ~MatcherBase() override { Destroy(); }
- private:
- struct VTable {
- bool (*match_and_explain)(const MatcherBase&, const T&,
- MatchResultListener*);
- void (*describe)(const MatcherBase&, std::ostream*, bool negation);
- // Returns the captured object if it implements the interface, otherwise
- // returns the MatcherBase itself.
- const MatcherDescriberInterface* (*get_describer)(const MatcherBase&);
- // Called on shared instances when the reference count reaches 0.
- void (*shared_destroy)(SharedPayloadBase*);
- };
- bool IsShared() const {
- return vtable_ != nullptr && vtable_->shared_destroy != nullptr;
- }
- // If the implementation uses a listener, call that.
- template <typename P>
- static auto MatchAndExplainImpl(const MatcherBase& m, const T& value,
- MatchResultListener* listener)
- -> decltype(P::Get(m).MatchAndExplain(value, listener->stream())) {
- return P::Get(m).MatchAndExplain(value, listener->stream());
- }
- template <typename P>
- static auto MatchAndExplainImpl(const MatcherBase& m, const T& value,
- MatchResultListener* listener)
- -> decltype(P::Get(m).MatchAndExplain(value, listener)) {
- return P::Get(m).MatchAndExplain(value, listener);
- }
- template <typename P>
- static void DescribeImpl(const MatcherBase& m, std::ostream* os,
- bool negation) {
- if (negation) {
- P::Get(m).DescribeNegationTo(os);
- } else {
- P::Get(m).DescribeTo(os);
- }
- }
- template <typename P>
- static const MatcherDescriberInterface* GetDescriberImpl(
- const MatcherBase& m) {
- // If the impl is a MatcherDescriberInterface, then return it.
- // Otherwise use MatcherBase itself.
- // This allows us to implement the GetDescriber() function without support
- // from the impl, but some users really want to get their impl back when
- // they call GetDescriber().
- // We use std::get on a tuple as a workaround of not having `if constexpr`.
- return std::get<(
- std::is_convertible<decltype(&P::Get(m)),
- const MatcherDescriberInterface*>::value
- ? 1
- : 0)>(std::make_tuple(&m, &P::Get(m)));
- }
- template <typename P>
- const VTable* GetVTable() {
- static constexpr VTable kVTable = {&MatchAndExplainImpl<P>,
- &DescribeImpl<P>, &GetDescriberImpl<P>,
- P::shared_destroy};
- return &kVTable;
- }
- union Buffer {
- // Add some types to give Buffer some common alignment/size use cases.
- void* ptr;
- double d;
- int64_t i;
- // And add one for the out-of-line cases.
- SharedPayloadBase* shared;
- };
- void Destroy() {
- if (IsShared() && buffer_.shared->Unref()) {
- vtable_->shared_destroy(buffer_.shared);
- }
- }
- template <typename M>
- static constexpr bool IsInlined() {
- return sizeof(M) <= sizeof(Buffer) && alignof(M) <= alignof(Buffer) &&
- std::is_trivially_copy_constructible<M>::value &&
- std::is_trivially_destructible<M>::value;
- }
- template <typename M, bool = MatcherBase::IsInlined<M>()>
- struct ValuePolicy {
- static const M& Get(const MatcherBase& m) {
- // When inlined along with Init, need to be explicit to avoid violating
- // strict aliasing rules.
- const M *ptr = static_cast<const M*>(
- static_cast<const void*>(&m.buffer_));
- return *ptr;
- }
- static void Init(MatcherBase& m, M impl) {
- ::new (static_cast<void*>(&m.buffer_)) M(impl);
- }
- static constexpr auto shared_destroy = nullptr;
- };
- template <typename M>
- struct ValuePolicy<M, false> {
- using Shared = SharedPayload<M>;
- static const M& Get(const MatcherBase& m) {
- return static_cast<Shared*>(m.buffer_.shared)->value;
- }
- template <typename Arg>
- static void Init(MatcherBase& m, Arg&& arg) {
- m.buffer_.shared = new Shared(std::forward<Arg>(arg));
- }
- static constexpr auto shared_destroy = &Shared::Destroy;
- };
- template <typename U, bool B>
- struct ValuePolicy<const MatcherInterface<U>*, B> {
- using M = const MatcherInterface<U>;
- using Shared = SharedPayload<std::unique_ptr<M>>;
- static const M& Get(const MatcherBase& m) {
- return *static_cast<Shared*>(m.buffer_.shared)->value;
- }
- static void Init(MatcherBase& m, M* impl) {
- m.buffer_.shared = new Shared(std::unique_ptr<M>(impl));
- }
- static constexpr auto shared_destroy = &Shared::Destroy;
- };
- template <typename M>
- void Init(M&& m) {
- using MM = typename std::decay<M>::type;
- using Policy = ValuePolicy<MM>;
- vtable_ = GetVTable<Policy>();
- Policy::Init(*this, std::forward<M>(m));
- }
- const VTable* vtable_;
- Buffer buffer_;
- };
- } // namespace internal
- // A Matcher<T> is a copyable and IMMUTABLE (except by assignment)
- // object that can check whether a value of type T matches. The
- // implementation of Matcher<T> is just a std::shared_ptr to const
- // MatcherInterface<T>. Don't inherit from Matcher!
- template <typename T>
- class Matcher : public internal::MatcherBase<T> {
- public:
- // Constructs a null matcher. Needed for storing Matcher objects in STL
- // containers. A default-constructed matcher is not yet initialized. You
- // cannot use it until a valid value has been assigned to it.
- explicit Matcher() {} // NOLINT
- // Constructs a matcher from its implementation.
- explicit Matcher(const MatcherInterface<const T&>* impl)
- : internal::MatcherBase<T>(impl) {}
- template <typename U>
- explicit Matcher(
- const MatcherInterface<U>* impl,
- typename std::enable_if<!std::is_same<U, const U&>::value>::type* =
- nullptr)
- : internal::MatcherBase<T>(impl) {}
- template <typename M, typename = typename std::remove_reference<
- M>::type::is_gtest_matcher>
- Matcher(M&& m) : internal::MatcherBase<T>(std::forward<M>(m)) {} // NOLINT
- // Implicit constructor here allows people to write
- // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes
- Matcher(T value); // NOLINT
- };
- // The following two specializations allow the user to write str
- // instead of Eq(str) and "foo" instead of Eq("foo") when a std::string
- // matcher is expected.
- template <>
- class GTEST_API_ Matcher<const std::string&>
- : public internal::MatcherBase<const std::string&> {
- public:
- Matcher() {}
- explicit Matcher(const MatcherInterface<const std::string&>* impl)
- : internal::MatcherBase<const std::string&>(impl) {}
- template <typename M, typename = typename std::remove_reference<
- M>::type::is_gtest_matcher>
- Matcher(M&& m) // NOLINT
- : internal::MatcherBase<const std::string&>(std::forward<M>(m)) {}
- // Allows the user to write str instead of Eq(str) sometimes, where
- // str is a std::string object.
- Matcher(const std::string& s); // NOLINT
- // Allows the user to write "foo" instead of Eq("foo") sometimes.
- Matcher(const char* s); // NOLINT
- };
- template <>
- class GTEST_API_ Matcher<std::string>
- : public internal::MatcherBase<std::string> {
- public:
- Matcher() {}
- explicit Matcher(const MatcherInterface<const std::string&>* impl)
- : internal::MatcherBase<std::string>(impl) {}
- explicit Matcher(const MatcherInterface<std::string>* impl)
- : internal::MatcherBase<std::string>(impl) {}
- template <typename M, typename = typename std::remove_reference<
- M>::type::is_gtest_matcher>
- Matcher(M&& m) // NOLINT
- : internal::MatcherBase<std::string>(std::forward<M>(m)) {}
- // Allows the user to write str instead of Eq(str) sometimes, where
- // str is a string object.
- Matcher(const std::string& s); // NOLINT
- // Allows the user to write "foo" instead of Eq("foo") sometimes.
- Matcher(const char* s); // NOLINT
- };
- #if GTEST_INTERNAL_HAS_STRING_VIEW
- // The following two specializations allow the user to write str
- // instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view
- // matcher is expected.
- template <>
- class GTEST_API_ Matcher<const internal::StringView&>
- : public internal::MatcherBase<const internal::StringView&> {
- public:
- Matcher() {}
- explicit Matcher(const MatcherInterface<const internal::StringView&>* impl)
- : internal::MatcherBase<const internal::StringView&>(impl) {}
- template <typename M, typename = typename std::remove_reference<
- M>::type::is_gtest_matcher>
- Matcher(M&& m) // NOLINT
- : internal::MatcherBase<const internal::StringView&>(std::forward<M>(m)) {
- }
- // Allows the user to write str instead of Eq(str) sometimes, where
- // str is a std::string object.
- Matcher(const std::string& s); // NOLINT
- // Allows the user to write "foo" instead of Eq("foo") sometimes.
- Matcher(const char* s); // NOLINT
- // Allows the user to pass absl::string_views or std::string_views directly.
- Matcher(internal::StringView s); // NOLINT
- };
- template <>
- class GTEST_API_ Matcher<internal::StringView>
- : public internal::MatcherBase<internal::StringView> {
- public:
- Matcher() {}
- explicit Matcher(const MatcherInterface<const internal::StringView&>* impl)
- : internal::MatcherBase<internal::StringView>(impl) {}
- explicit Matcher(const MatcherInterface<internal::StringView>* impl)
- : internal::MatcherBase<internal::StringView>(impl) {}
- template <typename M, typename = typename std::remove_reference<
- M>::type::is_gtest_matcher>
- Matcher(M&& m) // NOLINT
- : internal::MatcherBase<internal::StringView>(std::forward<M>(m)) {}
- // Allows the user to write str instead of Eq(str) sometimes, where
- // str is a std::string object.
- Matcher(const std::string& s); // NOLINT
- // Allows the user to write "foo" instead of Eq("foo") sometimes.
- Matcher(const char* s); // NOLINT
- // Allows the user to pass absl::string_views or std::string_views directly.
- Matcher(internal::StringView s); // NOLINT
- };
- #endif // GTEST_INTERNAL_HAS_STRING_VIEW
- // Prints a matcher in a human-readable format.
- template <typename T>
- std::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) {
- matcher.DescribeTo(&os);
- return os;
- }
- // The PolymorphicMatcher class template makes it easy to implement a
- // polymorphic matcher (i.e. a matcher that can match values of more
- // than one type, e.g. Eq(n) and NotNull()).
- //
- // To define a polymorphic matcher, a user should provide an Impl
- // class that has a DescribeTo() method and a DescribeNegationTo()
- // method, and define a member function (or member function template)
- //
- // bool MatchAndExplain(const Value& value,
- // MatchResultListener* listener) const;
- //
- // See the definition of NotNull() for a complete example.
- template <class Impl>
- class PolymorphicMatcher {
- public:
- explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}
- // Returns a mutable reference to the underlying matcher
- // implementation object.
- Impl& mutable_impl() { return impl_; }
- // Returns an immutable reference to the underlying matcher
- // implementation object.
- const Impl& impl() const { return impl_; }
- template <typename T>
- operator Matcher<T>() const {
- return Matcher<T>(new MonomorphicImpl<const T&>(impl_));
- }
- private:
- template <typename T>
- class MonomorphicImpl : public MatcherInterface<T> {
- public:
- explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}
- void DescribeTo(::std::ostream* os) const override { impl_.DescribeTo(os); }
- void DescribeNegationTo(::std::ostream* os) const override {
- impl_.DescribeNegationTo(os);
- }
- bool MatchAndExplain(T x, MatchResultListener* listener) const override {
- return impl_.MatchAndExplain(x, listener);
- }
- private:
- const Impl impl_;
- };
- Impl impl_;
- };
- // Creates a matcher from its implementation.
- // DEPRECATED: Especially in the generic code, prefer:
- // Matcher<T>(new MyMatcherImpl<const T&>(...));
- //
- // MakeMatcher may create a Matcher that accepts its argument by value, which
- // leads to unnecessary copies & lack of support for non-copyable types.
- template <typename T>
- inline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {
- return Matcher<T>(impl);
- }
- // Creates a polymorphic matcher from its implementation. This is
- // easier to use than the PolymorphicMatcher<Impl> constructor as it
- // doesn't require you to explicitly write the template argument, e.g.
- //
- // MakePolymorphicMatcher(foo);
- // vs
- // PolymorphicMatcher<TypeOfFoo>(foo);
- template <class Impl>
- inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {
- return PolymorphicMatcher<Impl>(impl);
- }
- namespace internal {
- // Implements a matcher that compares a given value with a
- // pre-supplied value using one of the ==, <=, <, etc, operators. The
- // two values being compared don't have to have the same type.
- //
- // The matcher defined here is polymorphic (for example, Eq(5) can be
- // used to match an int, a short, a double, etc). Therefore we use
- // a template type conversion operator in the implementation.
- //
- // The following template definition assumes that the Rhs parameter is
- // a "bare" type (i.e. neither 'const T' nor 'T&').
- template <typename D, typename Rhs, typename Op>
- class ComparisonBase {
- public:
- explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {}
- using is_gtest_matcher = void;
- template <typename Lhs>
- bool MatchAndExplain(const Lhs& lhs, std::ostream*) const {
- return Op()(lhs, Unwrap(rhs_));
- }
- void DescribeTo(std::ostream* os) const {
- *os << D::Desc() << " ";
- UniversalPrint(Unwrap(rhs_), os);
- }
- void DescribeNegationTo(std::ostream* os) const {
- *os << D::NegatedDesc() << " ";
- UniversalPrint(Unwrap(rhs_), os);
- }
- private:
- template <typename T>
- static const T& Unwrap(const T& v) {
- return v;
- }
- template <typename T>
- static const T& Unwrap(std::reference_wrapper<T> v) {
- return v;
- }
- Rhs rhs_;
- };
- template <typename Rhs>
- class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {
- public:
- explicit EqMatcher(const Rhs& rhs)
- : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { }
- static const char* Desc() { return "is equal to"; }
- static const char* NegatedDesc() { return "isn't equal to"; }
- };
- template <typename Rhs>
- class NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {
- public:
- explicit NeMatcher(const Rhs& rhs)
- : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { }
- static const char* Desc() { return "isn't equal to"; }
- static const char* NegatedDesc() { return "is equal to"; }
- };
- template <typename Rhs>
- class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {
- public:
- explicit LtMatcher(const Rhs& rhs)
- : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { }
- static const char* Desc() { return "is <"; }
- static const char* NegatedDesc() { return "isn't <"; }
- };
- template <typename Rhs>
- class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {
- public:
- explicit GtMatcher(const Rhs& rhs)
- : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { }
- static const char* Desc() { return "is >"; }
- static const char* NegatedDesc() { return "isn't >"; }
- };
- template <typename Rhs>
- class LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {
- public:
- explicit LeMatcher(const Rhs& rhs)
- : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { }
- static const char* Desc() { return "is <="; }
- static const char* NegatedDesc() { return "isn't <="; }
- };
- template <typename Rhs>
- class GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {
- public:
- explicit GeMatcher(const Rhs& rhs)
- : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { }
- static const char* Desc() { return "is >="; }
- static const char* NegatedDesc() { return "isn't >="; }
- };
- template <typename T, typename = typename std::enable_if<
- std::is_constructible<std::string, T>::value>::type>
- using StringLike = T;
- // Implements polymorphic matchers MatchesRegex(regex) and
- // ContainsRegex(regex), which can be used as a Matcher<T> as long as
- // T can be converted to a string.
- class MatchesRegexMatcher {
- public:
- MatchesRegexMatcher(const RE* regex, bool full_match)
- : regex_(regex), full_match_(full_match) {}
- #if GTEST_INTERNAL_HAS_STRING_VIEW
- bool MatchAndExplain(const internal::StringView& s,
- MatchResultListener* listener) const {
- return MatchAndExplain(std::string(s), listener);
- }
- #endif // GTEST_INTERNAL_HAS_STRING_VIEW
- // Accepts pointer types, particularly:
- // const char*
- // char*
- // const wchar_t*
- // wchar_t*
- template <typename CharType>
- bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
- return s != nullptr && MatchAndExplain(std::string(s), listener);
- }
- // Matches anything that can convert to std::string.
- //
- // This is a template, not just a plain function with const std::string&,
- // because absl::string_view has some interfering non-explicit constructors.
- template <class MatcheeStringType>
- bool MatchAndExplain(const MatcheeStringType& s,
- MatchResultListener* /* listener */) const {
- const std::string& s2(s);
- return full_match_ ? RE::FullMatch(s2, *regex_)
- : RE::PartialMatch(s2, *regex_);
- }
- void DescribeTo(::std::ostream* os) const {
- *os << (full_match_ ? "matches" : "contains") << " regular expression ";
- UniversalPrinter<std::string>::Print(regex_->pattern(), os);
- }
- void DescribeNegationTo(::std::ostream* os) const {
- *os << "doesn't " << (full_match_ ? "match" : "contain")
- << " regular expression ";
- UniversalPrinter<std::string>::Print(regex_->pattern(), os);
- }
- private:
- const std::shared_ptr<const RE> regex_;
- const bool full_match_;
- };
- } // namespace internal
- // Matches a string that fully matches regular expression 'regex'.
- // The matcher takes ownership of 'regex'.
- inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
- const internal::RE* regex) {
- return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));
- }
- template <typename T = std::string>
- PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
- const internal::StringLike<T>& regex) {
- return MatchesRegex(new internal::RE(std::string(regex)));
- }
- // Matches a string that contains regular expression 'regex'.
- // The matcher takes ownership of 'regex'.
- inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
- const internal::RE* regex) {
- return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));
- }
- template <typename T = std::string>
- PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
- const internal::StringLike<T>& regex) {
- return ContainsRegex(new internal::RE(std::string(regex)));
- }
- // Creates a polymorphic matcher that matches anything equal to x.
- // Note: if the parameter of Eq() were declared as const T&, Eq("foo")
- // wouldn't compile.
- template <typename T>
- inline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }
- // Constructs a Matcher<T> from a 'value' of type T. The constructed
- // matcher matches any value that's equal to 'value'.
- template <typename T>
- Matcher<T>::Matcher(T value) { *this = Eq(value); }
- // Creates a monomorphic matcher that matches anything with type Lhs
- // and equal to rhs. A user may need to use this instead of Eq(...)
- // in order to resolve an overloading ambiguity.
- //
- // TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))
- // or Matcher<T>(x), but more readable than the latter.
- //
- // We could define similar monomorphic matchers for other comparison
- // operations (e.g. TypedLt, TypedGe, and etc), but decided not to do
- // it yet as those are used much less than Eq() in practice. A user
- // can always write Matcher<T>(Lt(5)) to be explicit about the type,
- // for example.
- template <typename Lhs, typename Rhs>
- inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }
- // Creates a polymorphic matcher that matches anything >= x.
- template <typename Rhs>
- inline internal::GeMatcher<Rhs> Ge(Rhs x) {
- return internal::GeMatcher<Rhs>(x);
- }
- // Creates a polymorphic matcher that matches anything > x.
- template <typename Rhs>
- inline internal::GtMatcher<Rhs> Gt(Rhs x) {
- return internal::GtMatcher<Rhs>(x);
- }
- // Creates a polymorphic matcher that matches anything <= x.
- template <typename Rhs>
- inline internal::LeMatcher<Rhs> Le(Rhs x) {
- return internal::LeMatcher<Rhs>(x);
- }
- // Creates a polymorphic matcher that matches anything < x.
- template <typename Rhs>
- inline internal::LtMatcher<Rhs> Lt(Rhs x) {
- return internal::LtMatcher<Rhs>(x);
- }
- // Creates a polymorphic matcher that matches anything != x.
- template <typename Rhs>
- inline internal::NeMatcher<Rhs> Ne(Rhs x) {
- return internal::NeMatcher<Rhs>(x);
- }
- } // namespace testing
- GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
- #include <stdio.h>
- #include <memory>
- namespace testing {
- namespace internal {
- GTEST_DECLARE_string_(internal_run_death_test);
- // Names of the flags (needed for parsing Google Test flags).
- const char kDeathTestStyleFlag[] = "death_test_style";
- const char kDeathTestUseFork[] = "death_test_use_fork";
- const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
- #if GTEST_HAS_DEATH_TEST
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
- /* class A needs to have dll-interface to be used by clients of class B */)
- // DeathTest is a class that hides much of the complexity of the
- // GTEST_DEATH_TEST_ macro. It is abstract; its static Create method
- // returns a concrete class that depends on the prevailing death test
- // style, as defined by the --gtest_death_test_style and/or
- // --gtest_internal_run_death_test flags.
- // In describing the results of death tests, these terms are used with
- // the corresponding definitions:
- //
- // exit status: The integer exit information in the format specified
- // by wait(2)
- // exit code: The integer code passed to exit(3), _exit(2), or
- // returned from main()
- class GTEST_API_ DeathTest {
- public:
- // Create returns false if there was an error determining the
- // appropriate action to take for the current death test; for example,
- // if the gtest_death_test_style flag is set to an invalid value.
- // The LastMessage method will return a more detailed message in that
- // case. Otherwise, the DeathTest pointer pointed to by the "test"
- // argument is set. If the death test should be skipped, the pointer
- // is set to NULL; otherwise, it is set to the address of a new concrete
- // DeathTest object that controls the execution of the current test.
- static bool Create(const char* statement, Matcher<const std::string&> matcher,
- const char* file, int line, DeathTest** test);
- DeathTest();
- virtual ~DeathTest() { }
- // A helper class that aborts a death test when it's deleted.
- class ReturnSentinel {
- public:
- explicit ReturnSentinel(DeathTest* test) : test_(test) { }
- ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
- private:
- DeathTest* const test_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
- } GTEST_ATTRIBUTE_UNUSED_;
- // An enumeration of possible roles that may be taken when a death
- // test is encountered. EXECUTE means that the death test logic should
- // be executed immediately. OVERSEE means that the program should prepare
- // the appropriate environment for a child process to execute the death
- // test, then wait for it to complete.
- enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
- // An enumeration of the three reasons that a test might be aborted.
- enum AbortReason {
- TEST_ENCOUNTERED_RETURN_STATEMENT,
- TEST_THREW_EXCEPTION,
- TEST_DID_NOT_DIE
- };
- // Assumes one of the above roles.
- virtual TestRole AssumeRole() = 0;
- // Waits for the death test to finish and returns its status.
- virtual int Wait() = 0;
- // Returns true if the death test passed; that is, the test process
- // exited during the test, its exit status matches a user-supplied
- // predicate, and its stderr output matches a user-supplied regular
- // expression.
- // The user-supplied predicate may be a macro expression rather
- // than a function pointer or functor, or else Wait and Passed could
- // be combined.
- virtual bool Passed(bool exit_status_ok) = 0;
- // Signals that the death test did not die as expected.
- virtual void Abort(AbortReason reason) = 0;
- // Returns a human-readable outcome message regarding the outcome of
- // the last death test.
- static const char* LastMessage();
- static void set_last_death_test_message(const std::string& message);
- private:
- // A string containing a description of the outcome of the last death test.
- static std::string last_death_test_message_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
- };
- GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
- // Factory interface for death tests. May be mocked out for testing.
- class DeathTestFactory {
- public:
- virtual ~DeathTestFactory() { }
- virtual bool Create(const char* statement,
- Matcher<const std::string&> matcher, const char* file,
- int line, DeathTest** test) = 0;
- };
- // A concrete DeathTestFactory implementation for normal use.
- class DefaultDeathTestFactory : public DeathTestFactory {
- public:
- bool Create(const char* statement, Matcher<const std::string&> matcher,
- const char* file, int line, DeathTest** test) override;
- };
- // Returns true if exit_status describes a process that was terminated
- // by a signal, or exited normally with a nonzero exit code.
- GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
- // A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads
- // and interpreted as a regex (rather than an Eq matcher) for legacy
- // compatibility.
- inline Matcher<const ::std::string&> MakeDeathTestMatcher(
- ::testing::internal::RE regex) {
- return ContainsRegex(regex.pattern());
- }
- inline Matcher<const ::std::string&> MakeDeathTestMatcher(const char* regex) {
- return ContainsRegex(regex);
- }
- inline Matcher<const ::std::string&> MakeDeathTestMatcher(
- const ::std::string& regex) {
- return ContainsRegex(regex);
- }
- // If a Matcher<const ::std::string&> is passed to EXPECT_DEATH (etc.), it's
- // used directly.
- inline Matcher<const ::std::string&> MakeDeathTestMatcher(
- Matcher<const ::std::string&> matcher) {
- return matcher;
- }
- // Traps C++ exceptions escaping statement and reports them as test
- // failures. Note that trapping SEH exceptions is not implemented here.
- # if GTEST_HAS_EXCEPTIONS
- # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } catch (const ::std::exception& gtest_exception) { \
- fprintf(\
- stderr, \
- "\n%s: Caught std::exception-derived exception escaping the " \
- "death test statement. Exception message: %s\n", \
- ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
- gtest_exception.what()); \
- fflush(stderr); \
- death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
- } catch (...) { \
- death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
- }
- # else
- # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
- # endif
- // This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
- // ASSERT_EXIT*, and EXPECT_EXIT*.
- #define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- ::testing::internal::DeathTest* gtest_dt; \
- if (!::testing::internal::DeathTest::Create( \
- #statement, \
- ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \
- __FILE__, __LINE__, >est_dt)) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
- } \
- if (gtest_dt != nullptr) { \
- std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \
- switch (gtest_dt->AssumeRole()) { \
- case ::testing::internal::DeathTest::OVERSEE_TEST: \
- if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
- } \
- break; \
- case ::testing::internal::DeathTest::EXECUTE_TEST: { \
- ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \
- gtest_dt); \
- GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
- gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
- break; \
- } \
- default: \
- break; \
- } \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \
- : fail(::testing::internal::DeathTest::LastMessage())
- // The symbol "fail" here expands to something into which a message
- // can be streamed.
- // This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
- // NDEBUG mode. In this case we need the statements to be executed and the macro
- // must accept a streamed message even though the message is never printed.
- // The regex object is not evaluated, but it is used to prevent "unused"
- // warnings and to avoid an expression that doesn't compile in debug mode.
- #define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } else if (!::testing::internal::AlwaysTrue()) { \
- ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \
- } else \
- ::testing::Message()
- // A class representing the parsed contents of the
- // --gtest_internal_run_death_test flag, as it existed when
- // RUN_ALL_TESTS was called.
- class InternalRunDeathTestFlag {
- public:
- InternalRunDeathTestFlag(const std::string& a_file,
- int a_line,
- int an_index,
- int a_write_fd)
- : file_(a_file), line_(a_line), index_(an_index),
- write_fd_(a_write_fd) {}
- ~InternalRunDeathTestFlag() {
- if (write_fd_ >= 0)
- posix::Close(write_fd_);
- }
- const std::string& file() const { return file_; }
- int line() const { return line_; }
- int index() const { return index_; }
- int write_fd() const { return write_fd_; }
- private:
- std::string file_;
- int line_;
- int index_;
- int write_fd_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
- };
- // Returns a newly created InternalRunDeathTestFlag object with fields
- // initialized from the GTEST_FLAG(internal_run_death_test) flag if
- // the flag is specified; otherwise returns NULL.
- InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
- #endif // GTEST_HAS_DEATH_TEST
- } // namespace internal
- } // namespace testing
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
- namespace testing {
- // This flag controls the style of death tests. Valid values are "threadsafe",
- // meaning that the death test child process will re-execute the test binary
- // from the start, running only a single death test, or "fast",
- // meaning that the child process will execute the test logic immediately
- // after forking.
- GTEST_DECLARE_string_(death_test_style);
- #if GTEST_HAS_DEATH_TEST
- namespace internal {
- // Returns a Boolean value indicating whether the caller is currently
- // executing in the context of the death test child process. Tools such as
- // Valgrind heap checkers may need this to modify their behavior in death
- // tests. IMPORTANT: This is an internal utility. Using it may break the
- // implementation of death tests. User code MUST NOT use it.
- GTEST_API_ bool InDeathTestChild();
- } // namespace internal
- // The following macros are useful for writing death tests.
- // Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
- // executed:
- //
- // 1. It generates a warning if there is more than one active
- // thread. This is because it's safe to fork() or clone() only
- // when there is a single thread.
- //
- // 2. The parent process clone()s a sub-process and runs the death
- // test in it; the sub-process exits with code 0 at the end of the
- // death test, if it hasn't exited already.
- //
- // 3. The parent process waits for the sub-process to terminate.
- //
- // 4. The parent process checks the exit code and error message of
- // the sub-process.
- //
- // Examples:
- //
- // ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
- // for (int i = 0; i < 5; i++) {
- // EXPECT_DEATH(server.ProcessRequest(i),
- // "Invalid request .* in ProcessRequest()")
- // << "Failed to die on request " << i;
- // }
- //
- // ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
- //
- // bool KilledBySIGHUP(int exit_code) {
- // return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
- // }
- //
- // ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
- //
- // The final parameter to each of these macros is a matcher applied to any data
- // the sub-process wrote to stderr. For compatibility with existing tests, a
- // bare string is interpreted as a regular expression matcher.
- //
- // On the regular expressions used in death tests:
- //
- // GOOGLETEST_CM0005 DO NOT DELETE
- // On POSIX-compliant systems (*nix), we use the <regex.h> library,
- // which uses the POSIX extended regex syntax.
- //
- // On other platforms (e.g. Windows or Mac), we only support a simple regex
- // syntax implemented as part of Google Test. This limited
- // implementation should be enough most of the time when writing
- // death tests; though it lacks many features you can find in PCRE
- // or POSIX extended regex syntax. For example, we don't support
- // union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
- // repetition count ("x{5,7}"), among others.
- //
- // Below is the syntax that we do support. We chose it to be a
- // subset of both PCRE and POSIX extended regex, so it's easy to
- // learn wherever you come from. In the following: 'A' denotes a
- // literal character, period (.), or a single \\ escape sequence;
- // 'x' and 'y' denote regular expressions; 'm' and 'n' are for
- // natural numbers.
- //
- // c matches any literal character c
- // \\d matches any decimal digit
- // \\D matches any character that's not a decimal digit
- // \\f matches \f
- // \\n matches \n
- // \\r matches \r
- // \\s matches any ASCII whitespace, including \n
- // \\S matches any character that's not a whitespace
- // \\t matches \t
- // \\v matches \v
- // \\w matches any letter, _, or decimal digit
- // \\W matches any character that \\w doesn't match
- // \\c matches any literal character c, which must be a punctuation
- // . matches any single character except \n
- // A? matches 0 or 1 occurrences of A
- // A* matches 0 or many occurrences of A
- // A+ matches 1 or many occurrences of A
- // ^ matches the beginning of a string (not that of each line)
- // $ matches the end of a string (not that of each line)
- // xy matches x followed by y
- //
- // If you accidentally use PCRE or POSIX extended regex features
- // not implemented by us, you will get a run-time failure. In that
- // case, please try to rewrite your regular expression within the
- // above syntax.
- //
- // This implementation is *not* meant to be as highly tuned or robust
- // as a compiled regex library, but should perform well enough for a
- // death test, which already incurs significant overhead by launching
- // a child process.
- //
- // Known caveats:
- //
- // A "threadsafe" style death test obtains the path to the test
- // program from argv[0] and re-executes it in the sub-process. For
- // simplicity, the current implementation doesn't search the PATH
- // when launching the sub-process. This means that the user must
- // invoke the test program via a path that contains at least one
- // path separator (e.g. path/to/foo_test and
- // /absolute/path/to/bar_test are fine, but foo_test is not). This
- // is rarely a problem as people usually don't put the test binary
- // directory in PATH.
- //
- // Asserts that a given `statement` causes the program to exit, with an
- // integer exit status that satisfies `predicate`, and emitting error output
- // that matches `matcher`.
- # define ASSERT_EXIT(statement, predicate, matcher) \
- GTEST_DEATH_TEST_(statement, predicate, matcher, GTEST_FATAL_FAILURE_)
- // Like `ASSERT_EXIT`, but continues on to successive tests in the
- // test suite, if any:
- # define EXPECT_EXIT(statement, predicate, matcher) \
- GTEST_DEATH_TEST_(statement, predicate, matcher, GTEST_NONFATAL_FAILURE_)
- // Asserts that a given `statement` causes the program to exit, either by
- // explicitly exiting with a nonzero exit code or being killed by a
- // signal, and emitting error output that matches `matcher`.
- # define ASSERT_DEATH(statement, matcher) \
- ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, matcher)
- // Like `ASSERT_DEATH`, but continues on to successive tests in the
- // test suite, if any:
- # define EXPECT_DEATH(statement, matcher) \
- EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, matcher)
- // Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
- // Tests that an exit code describes a normal exit with a given exit code.
- class GTEST_API_ ExitedWithCode {
- public:
- explicit ExitedWithCode(int exit_code);
- ExitedWithCode(const ExitedWithCode&) = default;
- void operator=(const ExitedWithCode& other) = delete;
- bool operator()(int exit_status) const;
- private:
- const int exit_code_;
- };
- # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
- // Tests that an exit code describes an exit due to termination by a
- // given signal.
- // GOOGLETEST_CM0006 DO NOT DELETE
- class GTEST_API_ KilledBySignal {
- public:
- explicit KilledBySignal(int signum);
- bool operator()(int exit_status) const;
- private:
- const int signum_;
- };
- # endif // !GTEST_OS_WINDOWS
- // EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
- // The death testing framework causes this to have interesting semantics,
- // since the sideeffects of the call are only visible in opt mode, and not
- // in debug mode.
- //
- // In practice, this can be used to test functions that utilize the
- // LOG(DFATAL) macro using the following style:
- //
- // int DieInDebugOr12(int* sideeffect) {
- // if (sideeffect) {
- // *sideeffect = 12;
- // }
- // LOG(DFATAL) << "death";
- // return 12;
- // }
- //
- // TEST(TestSuite, TestDieOr12WorksInDgbAndOpt) {
- // int sideeffect = 0;
- // // Only asserts in dbg.
- // EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
- //
- // #ifdef NDEBUG
- // // opt-mode has sideeffect visible.
- // EXPECT_EQ(12, sideeffect);
- // #else
- // // dbg-mode no visible sideeffect.
- // EXPECT_EQ(0, sideeffect);
- // #endif
- // }
- //
- // This will assert that DieInDebugReturn12InOpt() crashes in debug
- // mode, usually due to a DCHECK or LOG(DFATAL), but returns the
- // appropriate fallback value (12 in this case) in opt mode. If you
- // need to test that a function has appropriate side-effects in opt
- // mode, include assertions against the side-effects. A general
- // pattern for this is:
- //
- // EXPECT_DEBUG_DEATH({
- // // Side-effects here will have an effect after this statement in
- // // opt mode, but none in debug mode.
- // EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
- // }, "death");
- //
- # ifdef NDEBUG
- # define EXPECT_DEBUG_DEATH(statement, regex) \
- GTEST_EXECUTE_STATEMENT_(statement, regex)
- # define ASSERT_DEBUG_DEATH(statement, regex) \
- GTEST_EXECUTE_STATEMENT_(statement, regex)
- # else
- # define EXPECT_DEBUG_DEATH(statement, regex) \
- EXPECT_DEATH(statement, regex)
- # define ASSERT_DEBUG_DEATH(statement, regex) \
- ASSERT_DEATH(statement, regex)
- # endif // NDEBUG for EXPECT_DEBUG_DEATH
- #endif // GTEST_HAS_DEATH_TEST
- // This macro is used for implementing macros such as
- // EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
- // death tests are not supported. Those macros must compile on such systems
- // if and only if EXPECT_DEATH and ASSERT_DEATH compile with the same parameters
- // on systems that support death tests. This allows one to write such a macro on
- // a system that does not support death tests and be sure that it will compile
- // on a death-test supporting system. It is exposed publicly so that systems
- // that have death-tests with stricter requirements than GTEST_HAS_DEATH_TEST
- // can write their own equivalent of EXPECT_DEATH_IF_SUPPORTED and
- // ASSERT_DEATH_IF_SUPPORTED.
- //
- // Parameters:
- // statement - A statement that a macro such as EXPECT_DEATH would test
- // for program termination. This macro has to make sure this
- // statement is compiled but not executed, to ensure that
- // EXPECT_DEATH_IF_SUPPORTED compiles with a certain
- // parameter if and only if EXPECT_DEATH compiles with it.
- // regex - A regex that a macro such as EXPECT_DEATH would use to test
- // the output of statement. This parameter has to be
- // compiled but not evaluated by this macro, to ensure that
- // this macro only accepts expressions that a macro such as
- // EXPECT_DEATH would accept.
- // terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
- // and a return statement for ASSERT_DEATH_IF_SUPPORTED.
- // This ensures that ASSERT_DEATH_IF_SUPPORTED will not
- // compile inside functions where ASSERT_DEATH doesn't
- // compile.
- //
- // The branch that has an always false condition is used to ensure that
- // statement and regex are compiled (and thus syntactically correct) but
- // never executed. The unreachable code macro protects the terminator
- // statement from generating an 'unreachable code' warning in case
- // statement unconditionally returns or throws. The Message constructor at
- // the end allows the syntax of streaming additional messages into the
- // macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
- # define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- GTEST_LOG_(WARNING) \
- << "Death tests are not supported on this platform.\n" \
- << "Statement '" #statement "' cannot be verified."; \
- } else if (::testing::internal::AlwaysFalse()) { \
- ::testing::internal::RE::PartialMatch(".*", (regex)); \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- terminator; \
- } else \
- ::testing::Message()
- // EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
- // ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
- // death tests are supported; otherwise they just issue a warning. This is
- // useful when you are combining death test assertions with normal test
- // assertions in one test.
- #if GTEST_HAS_DEATH_TEST
- # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
- EXPECT_DEATH(statement, regex)
- # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
- ASSERT_DEATH(statement, regex)
- #else
- # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
- GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, )
- # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
- GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return)
- #endif
- } // namespace testing
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
- // Copyright 2008, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // Macros and functions for implementing parameterized tests
- // in Google C++ Testing and Mocking Framework (Google Test)
- //
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
- // Value-parameterized tests allow you to test your code with different
- // parameters without writing multiple copies of the same test.
- //
- // Here is how you use value-parameterized tests:
- #if 0
- // To write value-parameterized tests, first you should define a fixture
- // class. It is usually derived from testing::TestWithParam<T> (see below for
- // another inheritance scheme that's sometimes useful in more complicated
- // class hierarchies), where the type of your parameter values.
- // TestWithParam<T> is itself derived from testing::Test. T can be any
- // copyable type. If it's a raw pointer, you are responsible for managing the
- // lifespan of the pointed values.
- class FooTest : public ::testing::TestWithParam<const char*> {
- // You can implement all the usual class fixture members here.
- };
- // Then, use the TEST_P macro to define as many parameterized tests
- // for this fixture as you want. The _P suffix is for "parameterized"
- // or "pattern", whichever you prefer to think.
- TEST_P(FooTest, DoesBlah) {
- // Inside a test, access the test parameter with the GetParam() method
- // of the TestWithParam<T> class:
- EXPECT_TRUE(foo.Blah(GetParam()));
- ...
- }
- TEST_P(FooTest, HasBlahBlah) {
- ...
- }
- // Finally, you can use INSTANTIATE_TEST_SUITE_P to instantiate the test
- // case with any set of parameters you want. Google Test defines a number
- // of functions for generating test parameters. They return what we call
- // (surprise!) parameter generators. Here is a summary of them, which
- // are all in the testing namespace:
- //
- //
- // Range(begin, end [, step]) - Yields values {begin, begin+step,
- // begin+step+step, ...}. The values do not
- // include end. step defaults to 1.
- // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
- // ValuesIn(container) - Yields values from a C-style array, an STL
- // ValuesIn(begin,end) container, or an iterator range [begin, end).
- // Bool() - Yields sequence {false, true}.
- // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
- // for the math savvy) of the values generated
- // by the N generators.
- //
- // For more details, see comments at the definitions of these functions below
- // in this file.
- //
- // The following statement will instantiate tests from the FooTest test suite
- // each with parameter values "meeny", "miny", and "moe".
- INSTANTIATE_TEST_SUITE_P(InstantiationName,
- FooTest,
- Values("meeny", "miny", "moe"));
- // To distinguish different instances of the pattern, (yes, you
- // can instantiate it more than once) the first argument to the
- // INSTANTIATE_TEST_SUITE_P macro is a prefix that will be added to the
- // actual test suite name. Remember to pick unique prefixes for different
- // instantiations. The tests from the instantiation above will have
- // these names:
- //
- // * InstantiationName/FooTest.DoesBlah/0 for "meeny"
- // * InstantiationName/FooTest.DoesBlah/1 for "miny"
- // * InstantiationName/FooTest.DoesBlah/2 for "moe"
- // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
- // * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
- // * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
- //
- // You can use these names in --gtest_filter.
- //
- // This statement will instantiate all tests from FooTest again, each
- // with parameter values "cat" and "dog":
- const char* pets[] = {"cat", "dog"};
- INSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
- // The tests from the instantiation above will have these names:
- //
- // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
- // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
- // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
- // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
- //
- // Please note that INSTANTIATE_TEST_SUITE_P will instantiate all tests
- // in the given test suite, whether their definitions come before or
- // AFTER the INSTANTIATE_TEST_SUITE_P statement.
- //
- // Please also note that generator expressions (including parameters to the
- // generators) are evaluated in InitGoogleTest(), after main() has started.
- // This allows the user on one hand, to adjust generator parameters in order
- // to dynamically determine a set of tests to run and on the other hand,
- // give the user a chance to inspect the generated tests with Google Test
- // reflection API before RUN_ALL_TESTS() is executed.
- //
- // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
- // for more examples.
- //
- // In the future, we plan to publish the API for defining new parameter
- // generators. But for now this interface remains part of the internal
- // implementation and is subject to change.
- //
- //
- // A parameterized test fixture must be derived from testing::Test and from
- // testing::WithParamInterface<T>, where T is the type of the parameter
- // values. Inheriting from TestWithParam<T> satisfies that requirement because
- // TestWithParam<T> inherits from both Test and WithParamInterface. In more
- // complicated hierarchies, however, it is occasionally useful to inherit
- // separately from Test and WithParamInterface. For example:
- class BaseTest : public ::testing::Test {
- // You can inherit all the usual members for a non-parameterized test
- // fixture here.
- };
- class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
- // The usual test fixture members go here too.
- };
- TEST_F(BaseTest, HasFoo) {
- // This is an ordinary non-parameterized test.
- }
- TEST_P(DerivedTest, DoesBlah) {
- // GetParam works just the same here as if you inherit from TestWithParam.
- EXPECT_TRUE(foo.Blah(GetParam()));
- }
- #endif // 0
- #include <iterator>
- #include <utility>
- // Copyright 2008 Google Inc.
- // All Rights Reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- // Type and function utilities for implementing parameterized tests.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
- #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
- #include <ctype.h>
- #include <cassert>
- #include <iterator>
- #include <memory>
- #include <set>
- #include <tuple>
- #include <type_traits>
- #include <utility>
- #include <vector>
- // Copyright 2008, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
- #include <iosfwd>
- #include <vector>
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
- /* class A needs to have dll-interface to be used by clients of class B */)
- namespace testing {
- // A copyable object representing the result of a test part (i.e. an
- // assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
- //
- // Don't inherit from TestPartResult as its destructor is not virtual.
- class GTEST_API_ TestPartResult {
- public:
- // The possible outcomes of a test part (i.e. an assertion or an
- // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
- enum Type {
- kSuccess, // Succeeded.
- kNonFatalFailure, // Failed but the test can continue.
- kFatalFailure, // Failed and the test should be terminated.
- kSkip // Skipped.
- };
- // C'tor. TestPartResult does NOT have a default constructor.
- // Always use this constructor (with parameters) to create a
- // TestPartResult object.
- TestPartResult(Type a_type, const char* a_file_name, int a_line_number,
- const char* a_message)
- : type_(a_type),
- file_name_(a_file_name == nullptr ? "" : a_file_name),
- line_number_(a_line_number),
- summary_(ExtractSummary(a_message)),
- message_(a_message) {}
- // Gets the outcome of the test part.
- Type type() const { return type_; }
- // Gets the name of the source file where the test part took place, or
- // NULL if it's unknown.
- const char* file_name() const {
- return file_name_.empty() ? nullptr : file_name_.c_str();
- }
- // Gets the line in the source file where the test part took place,
- // or -1 if it's unknown.
- int line_number() const { return line_number_; }
- // Gets the summary of the failure message.
- const char* summary() const { return summary_.c_str(); }
- // Gets the message associated with the test part.
- const char* message() const { return message_.c_str(); }
- // Returns true if and only if the test part was skipped.
- bool skipped() const { return type_ == kSkip; }
- // Returns true if and only if the test part passed.
- bool passed() const { return type_ == kSuccess; }
- // Returns true if and only if the test part non-fatally failed.
- bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
- // Returns true if and only if the test part fatally failed.
- bool fatally_failed() const { return type_ == kFatalFailure; }
- // Returns true if and only if the test part failed.
- bool failed() const { return fatally_failed() || nonfatally_failed(); }
- private:
- Type type_;
- // Gets the summary of the failure message by omitting the stack
- // trace in it.
- static std::string ExtractSummary(const char* message);
- // The name of the source file where the test part took place, or
- // "" if the source file is unknown.
- std::string file_name_;
- // The line in the source file where the test part took place, or -1
- // if the line number is unknown.
- int line_number_;
- std::string summary_; // The test failure summary.
- std::string message_; // The test failure message.
- };
- // Prints a TestPartResult object.
- std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
- // An array of TestPartResult objects.
- //
- // Don't inherit from TestPartResultArray as its destructor is not
- // virtual.
- class GTEST_API_ TestPartResultArray {
- public:
- TestPartResultArray() {}
- // Appends the given TestPartResult to the array.
- void Append(const TestPartResult& result);
- // Returns the TestPartResult at the given index (0-based).
- const TestPartResult& GetTestPartResult(int index) const;
- // Returns the number of TestPartResult objects in the array.
- int size() const;
- private:
- std::vector<TestPartResult> array_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
- };
- // This interface knows how to report a test part result.
- class GTEST_API_ TestPartResultReporterInterface {
- public:
- virtual ~TestPartResultReporterInterface() {}
- virtual void ReportTestPartResult(const TestPartResult& result) = 0;
- };
- namespace internal {
- // This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
- // statement generates new fatal failures. To do so it registers itself as the
- // current test part result reporter. Besides checking if fatal failures were
- // reported, it only delegates the reporting to the former result reporter.
- // The original result reporter is restored in the destructor.
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- class GTEST_API_ HasNewFatalFailureHelper
- : public TestPartResultReporterInterface {
- public:
- HasNewFatalFailureHelper();
- ~HasNewFatalFailureHelper() override;
- void ReportTestPartResult(const TestPartResult& result) override;
- bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
- private:
- bool has_new_fatal_failure_;
- TestPartResultReporterInterface* original_reporter_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
- };
- } // namespace internal
- } // namespace testing
- GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
- namespace testing {
- // Input to a parameterized test name generator, describing a test parameter.
- // Consists of the parameter value and the integer parameter index.
- template <class ParamType>
- struct TestParamInfo {
- TestParamInfo(const ParamType& a_param, size_t an_index) :
- param(a_param),
- index(an_index) {}
- ParamType param;
- size_t index;
- };
- // A builtin parameterized test name generator which returns the result of
- // testing::PrintToString.
- struct PrintToStringParamName {
- template <class ParamType>
- std::string operator()(const TestParamInfo<ParamType>& info) const {
- return PrintToString(info.param);
- }
- };
- namespace internal {
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- // Utility Functions
- // Outputs a message explaining invalid registration of different
- // fixture class for the same test suite. This may happen when
- // TEST_P macro is used to define two tests with the same name
- // but in different namespaces.
- GTEST_API_ void ReportInvalidTestSuiteType(const char* test_suite_name,
- CodeLocation code_location);
- template <typename> class ParamGeneratorInterface;
- template <typename> class ParamGenerator;
- // Interface for iterating over elements provided by an implementation
- // of ParamGeneratorInterface<T>.
- template <typename T>
- class ParamIteratorInterface {
- public:
- virtual ~ParamIteratorInterface() {}
- // A pointer to the base generator instance.
- // Used only for the purposes of iterator comparison
- // to make sure that two iterators belong to the same generator.
- virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
- // Advances iterator to point to the next element
- // provided by the generator. The caller is responsible
- // for not calling Advance() on an iterator equal to
- // BaseGenerator()->End().
- virtual void Advance() = 0;
- // Clones the iterator object. Used for implementing copy semantics
- // of ParamIterator<T>.
- virtual ParamIteratorInterface* Clone() const = 0;
- // Dereferences the current iterator and provides (read-only) access
- // to the pointed value. It is the caller's responsibility not to call
- // Current() on an iterator equal to BaseGenerator()->End().
- // Used for implementing ParamGenerator<T>::operator*().
- virtual const T* Current() const = 0;
- // Determines whether the given iterator and other point to the same
- // element in the sequence generated by the generator.
- // Used for implementing ParamGenerator<T>::operator==().
- virtual bool Equals(const ParamIteratorInterface& other) const = 0;
- };
- // Class iterating over elements provided by an implementation of
- // ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
- // and implements the const forward iterator concept.
- template <typename T>
- class ParamIterator {
- public:
- typedef T value_type;
- typedef const T& reference;
- typedef ptrdiff_t difference_type;
- // ParamIterator assumes ownership of the impl_ pointer.
- ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
- ParamIterator& operator=(const ParamIterator& other) {
- if (this != &other)
- impl_.reset(other.impl_->Clone());
- return *this;
- }
- const T& operator*() const { return *impl_->Current(); }
- const T* operator->() const { return impl_->Current(); }
- // Prefix version of operator++.
- ParamIterator& operator++() {
- impl_->Advance();
- return *this;
- }
- // Postfix version of operator++.
- ParamIterator operator++(int /*unused*/) {
- ParamIteratorInterface<T>* clone = impl_->Clone();
- impl_->Advance();
- return ParamIterator(clone);
- }
- bool operator==(const ParamIterator& other) const {
- return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
- }
- bool operator!=(const ParamIterator& other) const {
- return !(*this == other);
- }
- private:
- friend class ParamGenerator<T>;
- explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
- std::unique_ptr<ParamIteratorInterface<T> > impl_;
- };
- // ParamGeneratorInterface<T> is the binary interface to access generators
- // defined in other translation units.
- template <typename T>
- class ParamGeneratorInterface {
- public:
- typedef T ParamType;
- virtual ~ParamGeneratorInterface() {}
- // Generator interface definition
- virtual ParamIteratorInterface<T>* Begin() const = 0;
- virtual ParamIteratorInterface<T>* End() const = 0;
- };
- // Wraps ParamGeneratorInterface<T> and provides general generator syntax
- // compatible with the STL Container concept.
- // This class implements copy initialization semantics and the contained
- // ParamGeneratorInterface<T> instance is shared among all copies
- // of the original object. This is possible because that instance is immutable.
- template<typename T>
- class ParamGenerator {
- public:
- typedef ParamIterator<T> iterator;
- explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
- ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
- ParamGenerator& operator=(const ParamGenerator& other) {
- impl_ = other.impl_;
- return *this;
- }
- iterator begin() const { return iterator(impl_->Begin()); }
- iterator end() const { return iterator(impl_->End()); }
- private:
- std::shared_ptr<const ParamGeneratorInterface<T> > impl_;
- };
- // Generates values from a range of two comparable values. Can be used to
- // generate sequences of user-defined types that implement operator+() and
- // operator<().
- // This class is used in the Range() function.
- template <typename T, typename IncrementT>
- class RangeGenerator : public ParamGeneratorInterface<T> {
- public:
- RangeGenerator(T begin, T end, IncrementT step)
- : begin_(begin), end_(end),
- step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
- ~RangeGenerator() override {}
- ParamIteratorInterface<T>* Begin() const override {
- return new Iterator(this, begin_, 0, step_);
- }
- ParamIteratorInterface<T>* End() const override {
- return new Iterator(this, end_, end_index_, step_);
- }
- private:
- class Iterator : public ParamIteratorInterface<T> {
- public:
- Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
- IncrementT step)
- : base_(base), value_(value), index_(index), step_(step) {}
- ~Iterator() override {}
- const ParamGeneratorInterface<T>* BaseGenerator() const override {
- return base_;
- }
- void Advance() override {
- value_ = static_cast<T>(value_ + step_);
- index_++;
- }
- ParamIteratorInterface<T>* Clone() const override {
- return new Iterator(*this);
- }
- const T* Current() const override { return &value_; }
- bool Equals(const ParamIteratorInterface<T>& other) const override {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const int other_index =
- CheckedDowncastToActualType<const Iterator>(&other)->index_;
- return index_ == other_index;
- }
- private:
- Iterator(const Iterator& other)
- : ParamIteratorInterface<T>(),
- base_(other.base_), value_(other.value_), index_(other.index_),
- step_(other.step_) {}
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
- const ParamGeneratorInterface<T>* const base_;
- T value_;
- int index_;
- const IncrementT step_;
- }; // class RangeGenerator::Iterator
- static int CalculateEndIndex(const T& begin,
- const T& end,
- const IncrementT& step) {
- int end_index = 0;
- for (T i = begin; i < end; i = static_cast<T>(i + step))
- end_index++;
- return end_index;
- }
- // No implementation - assignment is unsupported.
- void operator=(const RangeGenerator& other);
- const T begin_;
- const T end_;
- const IncrementT step_;
- // The index for the end() iterator. All the elements in the generated
- // sequence are indexed (0-based) to aid iterator comparison.
- const int end_index_;
- }; // class RangeGenerator
- // Generates values from a pair of STL-style iterators. Used in the
- // ValuesIn() function. The elements are copied from the source range
- // since the source can be located on the stack, and the generator
- // is likely to persist beyond that stack frame.
- template <typename T>
- class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
- public:
- template <typename ForwardIterator>
- ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
- : container_(begin, end) {}
- ~ValuesInIteratorRangeGenerator() override {}
- ParamIteratorInterface<T>* Begin() const override {
- return new Iterator(this, container_.begin());
- }
- ParamIteratorInterface<T>* End() const override {
- return new Iterator(this, container_.end());
- }
- private:
- typedef typename ::std::vector<T> ContainerType;
- class Iterator : public ParamIteratorInterface<T> {
- public:
- Iterator(const ParamGeneratorInterface<T>* base,
- typename ContainerType::const_iterator iterator)
- : base_(base), iterator_(iterator) {}
- ~Iterator() override {}
- const ParamGeneratorInterface<T>* BaseGenerator() const override {
- return base_;
- }
- void Advance() override {
- ++iterator_;
- value_.reset();
- }
- ParamIteratorInterface<T>* Clone() const override {
- return new Iterator(*this);
- }
- // We need to use cached value referenced by iterator_ because *iterator_
- // can return a temporary object (and of type other then T), so just
- // having "return &*iterator_;" doesn't work.
- // value_ is updated here and not in Advance() because Advance()
- // can advance iterator_ beyond the end of the range, and we cannot
- // detect that fact. The client code, on the other hand, is
- // responsible for not calling Current() on an out-of-range iterator.
- const T* Current() const override {
- if (value_.get() == nullptr) value_.reset(new T(*iterator_));
- return value_.get();
- }
- bool Equals(const ParamIteratorInterface<T>& other) const override {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- return iterator_ ==
- CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
- }
- private:
- Iterator(const Iterator& other)
- // The explicit constructor call suppresses a false warning
- // emitted by gcc when supplied with the -Wextra option.
- : ParamIteratorInterface<T>(),
- base_(other.base_),
- iterator_(other.iterator_) {}
- const ParamGeneratorInterface<T>* const base_;
- typename ContainerType::const_iterator iterator_;
- // A cached value of *iterator_. We keep it here to allow access by
- // pointer in the wrapping iterator's operator->().
- // value_ needs to be mutable to be accessed in Current().
- // Use of std::unique_ptr helps manage cached value's lifetime,
- // which is bound by the lifespan of the iterator itself.
- mutable std::unique_ptr<const T> value_;
- }; // class ValuesInIteratorRangeGenerator::Iterator
- // No implementation - assignment is unsupported.
- void operator=(const ValuesInIteratorRangeGenerator& other);
- const ContainerType container_;
- }; // class ValuesInIteratorRangeGenerator
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // Default parameterized test name generator, returns a string containing the
- // integer test parameter index.
- template <class ParamType>
- std::string DefaultParamName(const TestParamInfo<ParamType>& info) {
- Message name_stream;
- name_stream << info.index;
- return name_stream.GetString();
- }
- template <typename T = int>
- void TestNotEmpty() {
- static_assert(sizeof(T) == 0, "Empty arguments are not allowed.");
- }
- template <typename T = int>
- void TestNotEmpty(const T&) {}
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // Stores a parameter value and later creates tests parameterized with that
- // value.
- template <class TestClass>
- class ParameterizedTestFactory : public TestFactoryBase {
- public:
- typedef typename TestClass::ParamType ParamType;
- explicit ParameterizedTestFactory(ParamType parameter) :
- parameter_(parameter) {}
- Test* CreateTest() override {
- TestClass::SetParam(¶meter_);
- return new TestClass();
- }
- private:
- const ParamType parameter_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
- };
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // TestMetaFactoryBase is a base class for meta-factories that create
- // test factories for passing into MakeAndRegisterTestInfo function.
- template <class ParamType>
- class TestMetaFactoryBase {
- public:
- virtual ~TestMetaFactoryBase() {}
- virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
- };
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // TestMetaFactory creates test factories for passing into
- // MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
- // ownership of test factory pointer, same factory object cannot be passed
- // into that method twice. But ParameterizedTestSuiteInfo is going to call
- // it for each Test/Parameter value combination. Thus it needs meta factory
- // creator class.
- template <class TestSuite>
- class TestMetaFactory
- : public TestMetaFactoryBase<typename TestSuite::ParamType> {
- public:
- using ParamType = typename TestSuite::ParamType;
- TestMetaFactory() {}
- TestFactoryBase* CreateTestFactory(ParamType parameter) override {
- return new ParameterizedTestFactory<TestSuite>(parameter);
- }
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
- };
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // ParameterizedTestSuiteInfoBase is a generic interface
- // to ParameterizedTestSuiteInfo classes. ParameterizedTestSuiteInfoBase
- // accumulates test information provided by TEST_P macro invocations
- // and generators provided by INSTANTIATE_TEST_SUITE_P macro invocations
- // and uses that information to register all resulting test instances
- // in RegisterTests method. The ParameterizeTestSuiteRegistry class holds
- // a collection of pointers to the ParameterizedTestSuiteInfo objects
- // and calls RegisterTests() on each of them when asked.
- class ParameterizedTestSuiteInfoBase {
- public:
- virtual ~ParameterizedTestSuiteInfoBase() {}
- // Base part of test suite name for display purposes.
- virtual const std::string& GetTestSuiteName() const = 0;
- // Test suite id to verify identity.
- virtual TypeId GetTestSuiteTypeId() const = 0;
- // UnitTest class invokes this method to register tests in this
- // test suite right before running them in RUN_ALL_TESTS macro.
- // This method should not be called more than once on any single
- // instance of a ParameterizedTestSuiteInfoBase derived class.
- virtual void RegisterTests() = 0;
- protected:
- ParameterizedTestSuiteInfoBase() {}
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase);
- };
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // Report a the name of a test_suit as safe to ignore
- // as the side effect of construction of this type.
- struct GTEST_API_ MarkAsIgnored {
- explicit MarkAsIgnored(const char* test_suite);
- };
- GTEST_API_ void InsertSyntheticTestCase(const std::string& name,
- CodeLocation location, bool has_test_p);
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P
- // macro invocations for a particular test suite and generators
- // obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that
- // test suite. It registers tests with all values generated by all
- // generators when asked.
- template <class TestSuite>
- class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase {
- public:
- // ParamType and GeneratorCreationFunc are private types but are required
- // for declarations of public methods AddTestPattern() and
- // AddTestSuiteInstantiation().
- using ParamType = typename TestSuite::ParamType;
- // A function that returns an instance of appropriate generator type.
- typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
- using ParamNameGeneratorFunc = std::string(const TestParamInfo<ParamType>&);
- explicit ParameterizedTestSuiteInfo(const char* name,
- CodeLocation code_location)
- : test_suite_name_(name), code_location_(code_location) {}
- // Test suite base name for display purposes.
- const std::string& GetTestSuiteName() const override {
- return test_suite_name_;
- }
- // Test suite id to verify identity.
- TypeId GetTestSuiteTypeId() const override { return GetTypeId<TestSuite>(); }
- // TEST_P macro uses AddTestPattern() to record information
- // about a single test in a LocalTestInfo structure.
- // test_suite_name is the base name of the test suite (without invocation
- // prefix). test_base_name is the name of an individual test without
- // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
- // test suite base name and DoBar is test base name.
- void AddTestPattern(const char* test_suite_name, const char* test_base_name,
- TestMetaFactoryBase<ParamType>* meta_factory,
- CodeLocation code_location) {
- tests_.push_back(std::shared_ptr<TestInfo>(new TestInfo(
- test_suite_name, test_base_name, meta_factory, code_location)));
- }
- // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information
- // about a generator.
- int AddTestSuiteInstantiation(const std::string& instantiation_name,
- GeneratorCreationFunc* func,
- ParamNameGeneratorFunc* name_func,
- const char* file, int line) {
- instantiations_.push_back(
- InstantiationInfo(instantiation_name, func, name_func, file, line));
- return 0; // Return value used only to run this method in namespace scope.
- }
- // UnitTest class invokes this method to register tests in this test suite
- // right before running tests in RUN_ALL_TESTS macro.
- // This method should not be called more than once on any single
- // instance of a ParameterizedTestSuiteInfoBase derived class.
- // UnitTest has a guard to prevent from calling this method more than once.
- void RegisterTests() override {
- bool generated_instantiations = false;
- for (typename TestInfoContainer::iterator test_it = tests_.begin();
- test_it != tests_.end(); ++test_it) {
- std::shared_ptr<TestInfo> test_info = *test_it;
- for (typename InstantiationContainer::iterator gen_it =
- instantiations_.begin(); gen_it != instantiations_.end();
- ++gen_it) {
- const std::string& instantiation_name = gen_it->name;
- ParamGenerator<ParamType> generator((*gen_it->generator)());
- ParamNameGeneratorFunc* name_func = gen_it->name_func;
- const char* file = gen_it->file;
- int line = gen_it->line;
- std::string test_suite_name;
- if ( !instantiation_name.empty() )
- test_suite_name = instantiation_name + "/";
- test_suite_name += test_info->test_suite_base_name;
- size_t i = 0;
- std::set<std::string> test_param_names;
- for (typename ParamGenerator<ParamType>::iterator param_it =
- generator.begin();
- param_it != generator.end(); ++param_it, ++i) {
- generated_instantiations = true;
- Message test_name_stream;
- std::string param_name = name_func(
- TestParamInfo<ParamType>(*param_it, i));
- GTEST_CHECK_(IsValidParamName(param_name))
- << "Parameterized test name '" << param_name
- << "' is invalid, in " << file
- << " line " << line << std::endl;
- GTEST_CHECK_(test_param_names.count(param_name) == 0)
- << "Duplicate parameterized test name '" << param_name
- << "', in " << file << " line " << line << std::endl;
- test_param_names.insert(param_name);
- if (!test_info->test_base_name.empty()) {
- test_name_stream << test_info->test_base_name << "/";
- }
- test_name_stream << param_name;
- MakeAndRegisterTestInfo(
- test_suite_name.c_str(), test_name_stream.GetString().c_str(),
- nullptr, // No type parameter.
- PrintToString(*param_it).c_str(), test_info->code_location,
- GetTestSuiteTypeId(),
- SuiteApiResolver<TestSuite>::GetSetUpCaseOrSuite(file, line),
- SuiteApiResolver<TestSuite>::GetTearDownCaseOrSuite(file, line),
- test_info->test_meta_factory->CreateTestFactory(*param_it));
- } // for param_it
- } // for gen_it
- } // for test_it
- if (!generated_instantiations) {
- // There are no generaotrs, or they all generate nothing ...
- InsertSyntheticTestCase(GetTestSuiteName(), code_location_,
- !tests_.empty());
- }
- } // RegisterTests
- private:
- // LocalTestInfo structure keeps information about a single test registered
- // with TEST_P macro.
- struct TestInfo {
- TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name,
- TestMetaFactoryBase<ParamType>* a_test_meta_factory,
- CodeLocation a_code_location)
- : test_suite_base_name(a_test_suite_base_name),
- test_base_name(a_test_base_name),
- test_meta_factory(a_test_meta_factory),
- code_location(a_code_location) {}
- const std::string test_suite_base_name;
- const std::string test_base_name;
- const std::unique_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
- const CodeLocation code_location;
- };
- using TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo> >;
- // Records data received from INSTANTIATE_TEST_SUITE_P macros:
- // <Instantiation name, Sequence generator creation function,
- // Name generator function, Source file, Source line>
- struct InstantiationInfo {
- InstantiationInfo(const std::string &name_in,
- GeneratorCreationFunc* generator_in,
- ParamNameGeneratorFunc* name_func_in,
- const char* file_in,
- int line_in)
- : name(name_in),
- generator(generator_in),
- name_func(name_func_in),
- file(file_in),
- line(line_in) {}
- std::string name;
- GeneratorCreationFunc* generator;
- ParamNameGeneratorFunc* name_func;
- const char* file;
- int line;
- };
- typedef ::std::vector<InstantiationInfo> InstantiationContainer;
- static bool IsValidParamName(const std::string& name) {
- // Check for empty string
- if (name.empty())
- return false;
- // Check for invalid characters
- for (std::string::size_type index = 0; index < name.size(); ++index) {
- if (!IsAlNum(name[index]) && name[index] != '_')
- return false;
- }
- return true;
- }
- const std::string test_suite_name_;
- CodeLocation code_location_;
- TestInfoContainer tests_;
- InstantiationContainer instantiations_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo);
- }; // class ParameterizedTestSuiteInfo
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- template <class TestCase>
- using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo<TestCase>;
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // ParameterizedTestSuiteRegistry contains a map of
- // ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P
- // and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding
- // ParameterizedTestSuiteInfo descriptors.
- class ParameterizedTestSuiteRegistry {
- public:
- ParameterizedTestSuiteRegistry() {}
- ~ParameterizedTestSuiteRegistry() {
- for (auto& test_suite_info : test_suite_infos_) {
- delete test_suite_info;
- }
- }
- // Looks up or creates and returns a structure containing information about
- // tests and instantiations of a particular test suite.
- template <class TestSuite>
- ParameterizedTestSuiteInfo<TestSuite>* GetTestSuitePatternHolder(
- const char* test_suite_name, CodeLocation code_location) {
- ParameterizedTestSuiteInfo<TestSuite>* typed_test_info = nullptr;
- for (auto& test_suite_info : test_suite_infos_) {
- if (test_suite_info->GetTestSuiteName() == test_suite_name) {
- if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {
- // Complain about incorrect usage of Google Test facilities
- // and terminate the program since we cannot guaranty correct
- // test suite setup and tear-down in this case.
- ReportInvalidTestSuiteType(test_suite_name, code_location);
- posix::Abort();
- } else {
- // At this point we are sure that the object we found is of the same
- // type we are looking for, so we downcast it to that type
- // without further checks.
- typed_test_info = CheckedDowncastToActualType<
- ParameterizedTestSuiteInfo<TestSuite> >(test_suite_info);
- }
- break;
- }
- }
- if (typed_test_info == nullptr) {
- typed_test_info = new ParameterizedTestSuiteInfo<TestSuite>(
- test_suite_name, code_location);
- test_suite_infos_.push_back(typed_test_info);
- }
- return typed_test_info;
- }
- void RegisterTests() {
- for (auto& test_suite_info : test_suite_infos_) {
- test_suite_info->RegisterTests();
- }
- }
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- template <class TestCase>
- ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
- const char* test_case_name, CodeLocation code_location) {
- return GetTestSuitePatternHolder<TestCase>(test_case_name, code_location);
- }
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- private:
- using TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>;
- TestSuiteInfoContainer test_suite_infos_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry);
- };
- // Keep track of what type-parameterized test suite are defined and
- // where as well as which are intatiated. This allows susequently
- // identifying suits that are defined but never used.
- class TypeParameterizedTestSuiteRegistry {
- public:
- // Add a suite definition
- void RegisterTestSuite(const char* test_suite_name,
- CodeLocation code_location);
- // Add an instantiation of a suit.
- void RegisterInstantiation(const char* test_suite_name);
- // For each suit repored as defined but not reported as instantiation,
- // emit a test that reports that fact (configurably, as an error).
- void CheckForInstantiations();
- private:
- struct TypeParameterizedTestSuiteInfo {
- explicit TypeParameterizedTestSuiteInfo(CodeLocation c)
- : code_location(c), instantiated(false) {}
- CodeLocation code_location;
- bool instantiated;
- };
- std::map<std::string, TypeParameterizedTestSuiteInfo> suites_;
- };
- } // namespace internal
- // Forward declarations of ValuesIn(), which is implemented in
- // include/gtest/gtest-param-test.h.
- template <class Container>
- internal::ParamGenerator<typename Container::value_type> ValuesIn(
- const Container& container);
- namespace internal {
- // Used in the Values() function to provide polymorphic capabilities.
- #ifdef _MSC_VER
- #pragma warning(push)
- #pragma warning(disable : 4100)
- #endif
- template <typename... Ts>
- class ValueArray {
- public:
- explicit ValueArray(Ts... v) : v_(FlatTupleConstructTag{}, std::move(v)...) {}
- template <typename T>
- operator ParamGenerator<T>() const { // NOLINT
- return ValuesIn(MakeVector<T>(MakeIndexSequence<sizeof...(Ts)>()));
- }
- private:
- template <typename T, size_t... I>
- std::vector<T> MakeVector(IndexSequence<I...>) const {
- return std::vector<T>{static_cast<T>(v_.template Get<I>())...};
- }
- FlatTuple<Ts...> v_;
- };
- #ifdef _MSC_VER
- #pragma warning(pop)
- #endif
- template <typename... T>
- class CartesianProductGenerator
- : public ParamGeneratorInterface<::std::tuple<T...>> {
- public:
- typedef ::std::tuple<T...> ParamType;
- CartesianProductGenerator(const std::tuple<ParamGenerator<T>...>& g)
- : generators_(g) {}
- ~CartesianProductGenerator() override {}
- ParamIteratorInterface<ParamType>* Begin() const override {
- return new Iterator(this, generators_, false);
- }
- ParamIteratorInterface<ParamType>* End() const override {
- return new Iterator(this, generators_, true);
- }
- private:
- template <class I>
- class IteratorImpl;
- template <size_t... I>
- class IteratorImpl<IndexSequence<I...>>
- : public ParamIteratorInterface<ParamType> {
- public:
- IteratorImpl(const ParamGeneratorInterface<ParamType>* base,
- const std::tuple<ParamGenerator<T>...>& generators, bool is_end)
- : base_(base),
- begin_(std::get<I>(generators).begin()...),
- end_(std::get<I>(generators).end()...),
- current_(is_end ? end_ : begin_) {
- ComputeCurrentValue();
- }
- ~IteratorImpl() override {}
- const ParamGeneratorInterface<ParamType>* BaseGenerator() const override {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- void Advance() override {
- assert(!AtEnd());
- // Advance the last iterator.
- ++std::get<sizeof...(T) - 1>(current_);
- // if that reaches end, propagate that up.
- AdvanceIfEnd<sizeof...(T) - 1>();
- ComputeCurrentValue();
- }
- ParamIteratorInterface<ParamType>* Clone() const override {
- return new IteratorImpl(*this);
- }
- const ParamType* Current() const override { return current_value_.get(); }
- bool Equals(const ParamIteratorInterface<ParamType>& other) const override {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const IteratorImpl* typed_other =
- CheckedDowncastToActualType<const IteratorImpl>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- if (AtEnd() && typed_other->AtEnd()) return true;
- bool same = true;
- bool dummy[] = {
- (same = same && std::get<I>(current_) ==
- std::get<I>(typed_other->current_))...};
- (void)dummy;
- return same;
- }
- private:
- template <size_t ThisI>
- void AdvanceIfEnd() {
- if (std::get<ThisI>(current_) != std::get<ThisI>(end_)) return;
- bool last = ThisI == 0;
- if (last) {
- // We are done. Nothing else to propagate.
- return;
- }
- constexpr size_t NextI = ThisI - (ThisI != 0);
- std::get<ThisI>(current_) = std::get<ThisI>(begin_);
- ++std::get<NextI>(current_);
- AdvanceIfEnd<NextI>();
- }
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = std::make_shared<ParamType>(*std::get<I>(current_)...);
- }
- bool AtEnd() const {
- bool at_end = false;
- bool dummy[] = {
- (at_end = at_end || std::get<I>(current_) == std::get<I>(end_))...};
- (void)dummy;
- return at_end;
- }
- const ParamGeneratorInterface<ParamType>* const base_;
- std::tuple<typename ParamGenerator<T>::iterator...> begin_;
- std::tuple<typename ParamGenerator<T>::iterator...> end_;
- std::tuple<typename ParamGenerator<T>::iterator...> current_;
- std::shared_ptr<ParamType> current_value_;
- };
- using Iterator = IteratorImpl<typename MakeIndexSequence<sizeof...(T)>::type>;
- std::tuple<ParamGenerator<T>...> generators_;
- };
- template <class... Gen>
- class CartesianProductHolder {
- public:
- CartesianProductHolder(const Gen&... g) : generators_(g...) {}
- template <typename... T>
- operator ParamGenerator<::std::tuple<T...>>() const {
- return ParamGenerator<::std::tuple<T...>>(
- new CartesianProductGenerator<T...>(generators_));
- }
- private:
- std::tuple<Gen...> generators_;
- };
- } // namespace internal
- } // namespace testing
- #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
- namespace testing {
- // Functions producing parameter generators.
- //
- // Google Test uses these generators to produce parameters for value-
- // parameterized tests. When a parameterized test suite is instantiated
- // with a particular generator, Google Test creates and runs tests
- // for each element in the sequence produced by the generator.
- //
- // In the following sample, tests from test suite FooTest are instantiated
- // each three times with parameter values 3, 5, and 8:
- //
- // class FooTest : public TestWithParam<int> { ... };
- //
- // TEST_P(FooTest, TestThis) {
- // }
- // TEST_P(FooTest, TestThat) {
- // }
- // INSTANTIATE_TEST_SUITE_P(TestSequence, FooTest, Values(3, 5, 8));
- //
- // Range() returns generators providing sequences of values in a range.
- //
- // Synopsis:
- // Range(start, end)
- // - returns a generator producing a sequence of values {start, start+1,
- // start+2, ..., }.
- // Range(start, end, step)
- // - returns a generator producing a sequence of values {start, start+step,
- // start+step+step, ..., }.
- // Notes:
- // * The generated sequences never include end. For example, Range(1, 5)
- // returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
- // returns a generator producing {1, 3, 5, 7}.
- // * start and end must have the same type. That type may be any integral or
- // floating-point type or a user defined type satisfying these conditions:
- // * It must be assignable (have operator=() defined).
- // * It must have operator+() (operator+(int-compatible type) for
- // two-operand version).
- // * It must have operator<() defined.
- // Elements in the resulting sequences will also have that type.
- // * Condition start < end must be satisfied in order for resulting sequences
- // to contain any elements.
- //
- template <typename T, typename IncrementT>
- internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
- return internal::ParamGenerator<T>(
- new internal::RangeGenerator<T, IncrementT>(start, end, step));
- }
- template <typename T>
- internal::ParamGenerator<T> Range(T start, T end) {
- return Range(start, end, 1);
- }
- // ValuesIn() function allows generation of tests with parameters coming from
- // a container.
- //
- // Synopsis:
- // ValuesIn(const T (&array)[N])
- // - returns a generator producing sequences with elements from
- // a C-style array.
- // ValuesIn(const Container& container)
- // - returns a generator producing sequences with elements from
- // an STL-style container.
- // ValuesIn(Iterator begin, Iterator end)
- // - returns a generator producing sequences with elements from
- // a range [begin, end) defined by a pair of STL-style iterators. These
- // iterators can also be plain C pointers.
- //
- // Please note that ValuesIn copies the values from the containers
- // passed in and keeps them to generate tests in RUN_ALL_TESTS().
- //
- // Examples:
- //
- // This instantiates tests from test suite StringTest
- // each with C-string values of "foo", "bar", and "baz":
- //
- // const char* strings[] = {"foo", "bar", "baz"};
- // INSTANTIATE_TEST_SUITE_P(StringSequence, StringTest, ValuesIn(strings));
- //
- // This instantiates tests from test suite StlStringTest
- // each with STL strings with values "a" and "b":
- //
- // ::std::vector< ::std::string> GetParameterStrings() {
- // ::std::vector< ::std::string> v;
- // v.push_back("a");
- // v.push_back("b");
- // return v;
- // }
- //
- // INSTANTIATE_TEST_SUITE_P(CharSequence,
- // StlStringTest,
- // ValuesIn(GetParameterStrings()));
- //
- //
- // This will also instantiate tests from CharTest
- // each with parameter values 'a' and 'b':
- //
- // ::std::list<char> GetParameterChars() {
- // ::std::list<char> list;
- // list.push_back('a');
- // list.push_back('b');
- // return list;
- // }
- // ::std::list<char> l = GetParameterChars();
- // INSTANTIATE_TEST_SUITE_P(CharSequence2,
- // CharTest,
- // ValuesIn(l.begin(), l.end()));
- //
- template <typename ForwardIterator>
- internal::ParamGenerator<
- typename std::iterator_traits<ForwardIterator>::value_type>
- ValuesIn(ForwardIterator begin, ForwardIterator end) {
- typedef typename std::iterator_traits<ForwardIterator>::value_type ParamType;
- return internal::ParamGenerator<ParamType>(
- new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
- }
- template <typename T, size_t N>
- internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
- return ValuesIn(array, array + N);
- }
- template <class Container>
- internal::ParamGenerator<typename Container::value_type> ValuesIn(
- const Container& container) {
- return ValuesIn(container.begin(), container.end());
- }
- // Values() allows generating tests from explicitly specified list of
- // parameters.
- //
- // Synopsis:
- // Values(T v1, T v2, ..., T vN)
- // - returns a generator producing sequences with elements v1, v2, ..., vN.
- //
- // For example, this instantiates tests from test suite BarTest each
- // with values "one", "two", and "three":
- //
- // INSTANTIATE_TEST_SUITE_P(NumSequence,
- // BarTest,
- // Values("one", "two", "three"));
- //
- // This instantiates tests from test suite BazTest each with values 1, 2, 3.5.
- // The exact type of values will depend on the type of parameter in BazTest.
- //
- // INSTANTIATE_TEST_SUITE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
- //
- //
- template <typename... T>
- internal::ValueArray<T...> Values(T... v) {
- return internal::ValueArray<T...>(std::move(v)...);
- }
- // Bool() allows generating tests with parameters in a set of (false, true).
- //
- // Synopsis:
- // Bool()
- // - returns a generator producing sequences with elements {false, true}.
- //
- // It is useful when testing code that depends on Boolean flags. Combinations
- // of multiple flags can be tested when several Bool()'s are combined using
- // Combine() function.
- //
- // In the following example all tests in the test suite FlagDependentTest
- // will be instantiated twice with parameters false and true.
- //
- // class FlagDependentTest : public testing::TestWithParam<bool> {
- // virtual void SetUp() {
- // external_flag = GetParam();
- // }
- // }
- // INSTANTIATE_TEST_SUITE_P(BoolSequence, FlagDependentTest, Bool());
- //
- inline internal::ParamGenerator<bool> Bool() {
- return Values(false, true);
- }
- // Combine() allows the user to combine two or more sequences to produce
- // values of a Cartesian product of those sequences' elements.
- //
- // Synopsis:
- // Combine(gen1, gen2, ..., genN)
- // - returns a generator producing sequences with elements coming from
- // the Cartesian product of elements from the sequences generated by
- // gen1, gen2, ..., genN. The sequence elements will have a type of
- // std::tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
- // of elements from sequences produces by gen1, gen2, ..., genN.
- //
- // Example:
- //
- // This will instantiate tests in test suite AnimalTest each one with
- // the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
- // tuple("dog", BLACK), and tuple("dog", WHITE):
- //
- // enum Color { BLACK, GRAY, WHITE };
- // class AnimalTest
- // : public testing::TestWithParam<std::tuple<const char*, Color> > {...};
- //
- // TEST_P(AnimalTest, AnimalLooksNice) {...}
- //
- // INSTANTIATE_TEST_SUITE_P(AnimalVariations, AnimalTest,
- // Combine(Values("cat", "dog"),
- // Values(BLACK, WHITE)));
- //
- // This will instantiate tests in FlagDependentTest with all variations of two
- // Boolean flags:
- //
- // class FlagDependentTest
- // : public testing::TestWithParam<std::tuple<bool, bool> > {
- // virtual void SetUp() {
- // // Assigns external_flag_1 and external_flag_2 values from the tuple.
- // std::tie(external_flag_1, external_flag_2) = GetParam();
- // }
- // };
- //
- // TEST_P(FlagDependentTest, TestFeature1) {
- // // Test your code using external_flag_1 and external_flag_2 here.
- // }
- // INSTANTIATE_TEST_SUITE_P(TwoBoolSequence, FlagDependentTest,
- // Combine(Bool(), Bool()));
- //
- template <typename... Generator>
- internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) {
- return internal::CartesianProductHolder<Generator...>(g...);
- }
- #define TEST_P(test_suite_name, test_name) \
- class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \
- : public test_suite_name { \
- public: \
- GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \
- void TestBody() override; \
- \
- private: \
- static int AddToRegistry() { \
- ::testing::UnitTest::GetInstance() \
- ->parameterized_test_registry() \
- .GetTestSuitePatternHolder<test_suite_name>( \
- GTEST_STRINGIFY_(test_suite_name), \
- ::testing::internal::CodeLocation(__FILE__, __LINE__)) \
- ->AddTestPattern( \
- GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name), \
- new ::testing::internal::TestMetaFactory<GTEST_TEST_CLASS_NAME_( \
- test_suite_name, test_name)>(), \
- ::testing::internal::CodeLocation(__FILE__, __LINE__)); \
- return 0; \
- } \
- static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
- test_name)); \
- }; \
- int GTEST_TEST_CLASS_NAME_(test_suite_name, \
- test_name)::gtest_registering_dummy_ = \
- GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \
- void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()
- // The last argument to INSTANTIATE_TEST_SUITE_P allows the user to specify
- // generator and an optional function or functor that generates custom test name
- // suffixes based on the test parameters. Such a function or functor should
- // accept one argument of type testing::TestParamInfo<class ParamType>, and
- // return std::string.
- //
- // testing::PrintToStringParamName is a builtin test suffix generator that
- // returns the value of testing::PrintToString(GetParam()).
- //
- // Note: test names must be non-empty, unique, and may only contain ASCII
- // alphanumeric characters or underscore. Because PrintToString adds quotes
- // to std::string and C strings, it won't work for these types.
- #define GTEST_EXPAND_(arg) arg
- #define GTEST_GET_FIRST_(first, ...) first
- #define GTEST_GET_SECOND_(first, second, ...) second
- #define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \
- static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \
- gtest_##prefix##test_suite_name##_EvalGenerator_() { \
- return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_)); \
- } \
- static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \
- const ::testing::TestParamInfo<test_suite_name::ParamType>& info) { \
- if (::testing::internal::AlwaysFalse()) { \
- ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_( \
- __VA_ARGS__, \
- ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \
- DUMMY_PARAM_))); \
- auto t = std::make_tuple(__VA_ARGS__); \
- static_assert(std::tuple_size<decltype(t)>::value <= 2, \
- "Too Many Args!"); \
- } \
- return ((GTEST_EXPAND_(GTEST_GET_SECOND_( \
- __VA_ARGS__, \
- ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \
- DUMMY_PARAM_))))(info); \
- } \
- static int gtest_##prefix##test_suite_name##_dummy_ \
- GTEST_ATTRIBUTE_UNUSED_ = \
- ::testing::UnitTest::GetInstance() \
- ->parameterized_test_registry() \
- .GetTestSuitePatternHolder<test_suite_name>( \
- GTEST_STRINGIFY_(test_suite_name), \
- ::testing::internal::CodeLocation(__FILE__, __LINE__)) \
- ->AddTestSuiteInstantiation( \
- GTEST_STRINGIFY_(prefix), \
- >est_##prefix##test_suite_name##_EvalGenerator_, \
- >est_##prefix##test_suite_name##_EvalGenerateName_, \
- __FILE__, __LINE__)
- // Allow Marking a Parameterized test class as not needing to be instantiated.
- #define GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(T) \
- namespace gtest_do_not_use_outside_namespace_scope {} \
- static const ::testing::internal::MarkAsIgnored gtest_allow_ignore_##T( \
- GTEST_STRINGIFY_(T))
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- #define INSTANTIATE_TEST_CASE_P \
- static_assert(::testing::internal::InstantiateTestCase_P_IsDeprecated(), \
- ""); \
- INSTANTIATE_TEST_SUITE_P
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- } // namespace testing
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
- // Copyright 2006, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // Google C++ Testing and Mocking Framework definitions useful in production code.
- // GOOGLETEST_CM0003 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_
- // When you need to test the private or protected members of a class,
- // use the FRIEND_TEST macro to declare your tests as friends of the
- // class. For example:
- //
- // class MyClass {
- // private:
- // void PrivateMethod();
- // FRIEND_TEST(MyClassTest, PrivateMethodWorks);
- // };
- //
- // class MyClassTest : public testing::Test {
- // // ...
- // };
- //
- // TEST_F(MyClassTest, PrivateMethodWorks) {
- // // Can call MyClass::PrivateMethod() here.
- // }
- //
- // Note: The test class must be in the same namespace as the class being tested.
- // For example, putting MyClassTest in an anonymous namespace will not work.
- #define FRIEND_TEST(test_case_name, test_name)\
- friend class test_case_name##_##test_name##_Test
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PROD_H_
- // Copyright 2008 Google Inc.
- // All Rights Reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
- // This header implements typed tests and type-parameterized tests.
- // Typed (aka type-driven) tests repeat the same test for types in a
- // list. You must know which types you want to test with when writing
- // typed tests. Here's how you do it:
- #if 0
- // First, define a fixture class template. It should be parameterized
- // by a type. Remember to derive it from testing::Test.
- template <typename T>
- class FooTest : public testing::Test {
- public:
- ...
- typedef std::list<T> List;
- static T shared_;
- T value_;
- };
- // Next, associate a list of types with the test suite, which will be
- // repeated for each type in the list. The typedef is necessary for
- // the macro to parse correctly.
- typedef testing::Types<char, int, unsigned int> MyTypes;
- TYPED_TEST_SUITE(FooTest, MyTypes);
- // If the type list contains only one type, you can write that type
- // directly without Types<...>:
- // TYPED_TEST_SUITE(FooTest, int);
- // Then, use TYPED_TEST() instead of TEST_F() to define as many typed
- // tests for this test suite as you want.
- TYPED_TEST(FooTest, DoesBlah) {
- // Inside a test, refer to the special name TypeParam to get the type
- // parameter. Since we are inside a derived class template, C++ requires
- // us to visit the members of FooTest via 'this'.
- TypeParam n = this->value_;
- // To visit static members of the fixture, add the TestFixture::
- // prefix.
- n += TestFixture::shared_;
- // To refer to typedefs in the fixture, add the "typename
- // TestFixture::" prefix.
- typename TestFixture::List values;
- values.push_back(n);
- ...
- }
- TYPED_TEST(FooTest, HasPropertyA) { ... }
- // TYPED_TEST_SUITE takes an optional third argument which allows to specify a
- // class that generates custom test name suffixes based on the type. This should
- // be a class which has a static template function GetName(int index) returning
- // a string for each type. The provided integer index equals the index of the
- // type in the provided type list. In many cases the index can be ignored.
- //
- // For example:
- // class MyTypeNames {
- // public:
- // template <typename T>
- // static std::string GetName(int) {
- // if (std::is_same<T, char>()) return "char";
- // if (std::is_same<T, int>()) return "int";
- // if (std::is_same<T, unsigned int>()) return "unsignedInt";
- // }
- // };
- // TYPED_TEST_SUITE(FooTest, MyTypes, MyTypeNames);
- #endif // 0
- // Type-parameterized tests are abstract test patterns parameterized
- // by a type. Compared with typed tests, type-parameterized tests
- // allow you to define the test pattern without knowing what the type
- // parameters are. The defined pattern can be instantiated with
- // different types any number of times, in any number of translation
- // units.
- //
- // If you are designing an interface or concept, you can define a
- // suite of type-parameterized tests to verify properties that any
- // valid implementation of the interface/concept should have. Then,
- // each implementation can easily instantiate the test suite to verify
- // that it conforms to the requirements, without having to write
- // similar tests repeatedly. Here's an example:
- #if 0
- // First, define a fixture class template. It should be parameterized
- // by a type. Remember to derive it from testing::Test.
- template <typename T>
- class FooTest : public testing::Test {
- ...
- };
- // Next, declare that you will define a type-parameterized test suite
- // (the _P suffix is for "parameterized" or "pattern", whichever you
- // prefer):
- TYPED_TEST_SUITE_P(FooTest);
- // Then, use TYPED_TEST_P() to define as many type-parameterized tests
- // for this type-parameterized test suite as you want.
- TYPED_TEST_P(FooTest, DoesBlah) {
- // Inside a test, refer to TypeParam to get the type parameter.
- TypeParam n = 0;
- ...
- }
- TYPED_TEST_P(FooTest, HasPropertyA) { ... }
- // Now the tricky part: you need to register all test patterns before
- // you can instantiate them. The first argument of the macro is the
- // test suite name; the rest are the names of the tests in this test
- // case.
- REGISTER_TYPED_TEST_SUITE_P(FooTest,
- DoesBlah, HasPropertyA);
- // Finally, you are free to instantiate the pattern with the types you
- // want. If you put the above code in a header file, you can #include
- // it in multiple C++ source files and instantiate it multiple times.
- //
- // To distinguish different instances of the pattern, the first
- // argument to the INSTANTIATE_* macro is a prefix that will be added
- // to the actual test suite name. Remember to pick unique prefixes for
- // different instances.
- typedef testing::Types<char, int, unsigned int> MyTypes;
- INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
- // If the type list contains only one type, you can write that type
- // directly without Types<...>:
- // INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int);
- //
- // Similar to the optional argument of TYPED_TEST_SUITE above,
- // INSTANTIATE_TEST_SUITE_P takes an optional fourth argument which allows to
- // generate custom names.
- // INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes, MyTypeNames);
- #endif // 0
- // Implements typed tests.
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // Expands to the name of the typedef for the type parameters of the
- // given test suite.
- #define GTEST_TYPE_PARAMS_(TestSuiteName) gtest_type_params_##TestSuiteName##_
- // Expands to the name of the typedef for the NameGenerator, responsible for
- // creating the suffixes of the name.
- #define GTEST_NAME_GENERATOR_(TestSuiteName) \
- gtest_type_params_##TestSuiteName##_NameGenerator
- #define TYPED_TEST_SUITE(CaseName, Types, ...) \
- typedef ::testing::internal::GenerateTypeList<Types>::type \
- GTEST_TYPE_PARAMS_(CaseName); \
- typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \
- GTEST_NAME_GENERATOR_(CaseName)
- #define TYPED_TEST(CaseName, TestName) \
- static_assert(sizeof(GTEST_STRINGIFY_(TestName)) > 1, \
- "test-name must not be empty"); \
- template <typename gtest_TypeParam_> \
- class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
- : public CaseName<gtest_TypeParam_> { \
- private: \
- typedef CaseName<gtest_TypeParam_> TestFixture; \
- typedef gtest_TypeParam_ TypeParam; \
- void TestBody() override; \
- }; \
- static bool gtest_##CaseName##_##TestName##_registered_ \
- GTEST_ATTRIBUTE_UNUSED_ = ::testing::internal::TypeParameterizedTest< \
- CaseName, \
- ::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \
- TestName)>, \
- GTEST_TYPE_PARAMS_( \
- CaseName)>::Register("", \
- ::testing::internal::CodeLocation( \
- __FILE__, __LINE__), \
- GTEST_STRINGIFY_(CaseName), \
- GTEST_STRINGIFY_(TestName), 0, \
- ::testing::internal::GenerateNames< \
- GTEST_NAME_GENERATOR_(CaseName), \
- GTEST_TYPE_PARAMS_(CaseName)>()); \
- template <typename gtest_TypeParam_> \
- void GTEST_TEST_CLASS_NAME_(CaseName, \
- TestName)<gtest_TypeParam_>::TestBody()
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- #define TYPED_TEST_CASE \
- static_assert(::testing::internal::TypedTestCaseIsDeprecated(), ""); \
- TYPED_TEST_SUITE
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- // Implements type-parameterized tests.
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // Expands to the namespace name that the type-parameterized tests for
- // the given type-parameterized test suite are defined in. The exact
- // name of the namespace is subject to change without notice.
- #define GTEST_SUITE_NAMESPACE_(TestSuiteName) gtest_suite_##TestSuiteName##_
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- //
- // Expands to the name of the variable used to remember the names of
- // the defined tests in the given test suite.
- #define GTEST_TYPED_TEST_SUITE_P_STATE_(TestSuiteName) \
- gtest_typed_test_suite_p_state_##TestSuiteName##_
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
- //
- // Expands to the name of the variable used to remember the names of
- // the registered tests in the given test suite.
- #define GTEST_REGISTERED_TEST_NAMES_(TestSuiteName) \
- gtest_registered_test_names_##TestSuiteName##_
- // The variables defined in the type-parameterized test macros are
- // static as typically these macros are used in a .h file that can be
- // #included in multiple translation units linked together.
- #define TYPED_TEST_SUITE_P(SuiteName) \
- static ::testing::internal::TypedTestSuitePState \
- GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName)
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- #define TYPED_TEST_CASE_P \
- static_assert(::testing::internal::TypedTestCase_P_IsDeprecated(), ""); \
- TYPED_TEST_SUITE_P
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- #define TYPED_TEST_P(SuiteName, TestName) \
- namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \
- template <typename gtest_TypeParam_> \
- class TestName : public SuiteName<gtest_TypeParam_> { \
- private: \
- typedef SuiteName<gtest_TypeParam_> TestFixture; \
- typedef gtest_TypeParam_ TypeParam; \
- void TestBody() override; \
- }; \
- static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
- GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \
- __FILE__, __LINE__, GTEST_STRINGIFY_(SuiteName), \
- GTEST_STRINGIFY_(TestName)); \
- } \
- template <typename gtest_TypeParam_> \
- void GTEST_SUITE_NAMESPACE_( \
- SuiteName)::TestName<gtest_TypeParam_>::TestBody()
- // Note: this won't work correctly if the trailing arguments are macros.
- #define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \
- namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \
- typedef ::testing::internal::Templates<__VA_ARGS__> gtest_AllTests_; \
- } \
- static const char* const GTEST_REGISTERED_TEST_NAMES_( \
- SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \
- GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \
- GTEST_STRINGIFY_(SuiteName), __FILE__, __LINE__, #__VA_ARGS__)
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- #define REGISTER_TYPED_TEST_CASE_P \
- static_assert(::testing::internal::RegisterTypedTestCase_P_IsDeprecated(), \
- ""); \
- REGISTER_TYPED_TEST_SUITE_P
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- #define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \
- static_assert(sizeof(GTEST_STRINGIFY_(Prefix)) > 1, \
- "test-suit-prefix must not be empty"); \
- static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \
- ::testing::internal::TypeParameterizedTestSuite< \
- SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \
- ::testing::internal::GenerateTypeList<Types>::type>:: \
- Register(GTEST_STRINGIFY_(Prefix), \
- ::testing::internal::CodeLocation(__FILE__, __LINE__), \
- >EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), \
- GTEST_STRINGIFY_(SuiteName), \
- GTEST_REGISTERED_TEST_NAMES_(SuiteName), \
- ::testing::internal::GenerateNames< \
- ::testing::internal::NameGeneratorSelector< \
- __VA_ARGS__>::type, \
- ::testing::internal::GenerateTypeList<Types>::type>())
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- #define INSTANTIATE_TYPED_TEST_CASE_P \
- static_assert( \
- ::testing::internal::InstantiateTypedTestCase_P_IsDeprecated(), ""); \
- INSTANTIATE_TYPED_TEST_SUITE_P
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
- /* class A needs to have dll-interface to be used by clients of class B */)
- namespace testing {
- // Silence C4100 (unreferenced formal parameter) and 4805
- // unsafe mix of type 'const int' and type 'const bool'
- #ifdef _MSC_VER
- # pragma warning(push)
- # pragma warning(disable:4805)
- # pragma warning(disable:4100)
- #endif
- // Declares the flags.
- // This flag temporary enables the disabled tests.
- GTEST_DECLARE_bool_(also_run_disabled_tests);
- // This flag brings the debugger on an assertion failure.
- GTEST_DECLARE_bool_(break_on_failure);
- // This flag controls whether Google Test catches all test-thrown exceptions
- // and logs them as failures.
- GTEST_DECLARE_bool_(catch_exceptions);
- // This flag enables using colors in terminal output. Available values are
- // "yes" to enable colors, "no" (disable colors), or "auto" (the default)
- // to let Google Test decide.
- GTEST_DECLARE_string_(color);
- // This flag controls whether the test runner should continue execution past
- // first failure.
- GTEST_DECLARE_bool_(fail_fast);
- // This flag sets up the filter to select by name using a glob pattern
- // the tests to run. If the filter is not given all tests are executed.
- GTEST_DECLARE_string_(filter);
- // This flag controls whether Google Test installs a signal handler that dumps
- // debugging information when fatal signals are raised.
- GTEST_DECLARE_bool_(install_failure_signal_handler);
- // This flag causes the Google Test to list tests. None of the tests listed
- // are actually run if the flag is provided.
- GTEST_DECLARE_bool_(list_tests);
- // This flag controls whether Google Test emits a detailed XML report to a file
- // in addition to its normal textual output.
- GTEST_DECLARE_string_(output);
- // This flags control whether Google Test prints only test failures.
- GTEST_DECLARE_bool_(brief);
- // This flags control whether Google Test prints the elapsed time for each
- // test.
- GTEST_DECLARE_bool_(print_time);
- // This flags control whether Google Test prints UTF8 characters as text.
- GTEST_DECLARE_bool_(print_utf8);
- // This flag specifies the random number seed.
- GTEST_DECLARE_int32_(random_seed);
- // This flag sets how many times the tests are repeated. The default value
- // is 1. If the value is -1 the tests are repeating forever.
- GTEST_DECLARE_int32_(repeat);
- // This flag controls whether Google Test includes Google Test internal
- // stack frames in failure stack traces.
- GTEST_DECLARE_bool_(show_internal_stack_frames);
- // When this flag is specified, tests' order is randomized on every iteration.
- GTEST_DECLARE_bool_(shuffle);
- // This flag specifies the maximum number of stack frames to be
- // printed in a failure message.
- GTEST_DECLARE_int32_(stack_trace_depth);
- // When this flag is specified, a failed assertion will throw an
- // exception if exceptions are enabled, or exit the program with a
- // non-zero code otherwise. For use with an external test framework.
- GTEST_DECLARE_bool_(throw_on_failure);
- // When this flag is set with a "host:port" string, on supported
- // platforms test results are streamed to the specified port on
- // the specified host machine.
- GTEST_DECLARE_string_(stream_result_to);
- #if GTEST_USE_OWN_FLAGFILE_FLAG_
- GTEST_DECLARE_string_(flagfile);
- #endif // GTEST_USE_OWN_FLAGFILE_FLAG_
- // The upper limit for valid stack trace depths.
- const int kMaxStackTraceDepth = 100;
- namespace internal {
- class AssertHelper;
- class DefaultGlobalTestPartResultReporter;
- class ExecDeathTest;
- class NoExecDeathTest;
- class FinalSuccessChecker;
- class GTestFlagSaver;
- class StreamingListenerTest;
- class TestResultAccessor;
- class TestEventListenersAccessor;
- class TestEventRepeater;
- class UnitTestRecordPropertyTestHelper;
- class WindowsDeathTest;
- class FuchsiaDeathTest;
- class UnitTestImpl* GetUnitTestImpl();
- void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
- const std::string& message);
- std::set<std::string>* GetIgnoredParameterizedTestSuites();
- } // namespace internal
- // The friend relationship of some of these classes is cyclic.
- // If we don't forward declare them the compiler might confuse the classes
- // in friendship clauses with same named classes on the scope.
- class Test;
- class TestSuite;
- // Old API is still available but deprecated
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- using TestCase = TestSuite;
- #endif
- class TestInfo;
- class UnitTest;
- // A class for indicating whether an assertion was successful. When
- // the assertion wasn't successful, the AssertionResult object
- // remembers a non-empty message that describes how it failed.
- //
- // To create an instance of this class, use one of the factory functions
- // (AssertionSuccess() and AssertionFailure()).
- //
- // This class is useful for two purposes:
- // 1. Defining predicate functions to be used with Boolean test assertions
- // EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
- // 2. Defining predicate-format functions to be
- // used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
- //
- // For example, if you define IsEven predicate:
- //
- // testing::AssertionResult IsEven(int n) {
- // if ((n % 2) == 0)
- // return testing::AssertionSuccess();
- // else
- // return testing::AssertionFailure() << n << " is odd";
- // }
- //
- // Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
- // will print the message
- //
- // Value of: IsEven(Fib(5))
- // Actual: false (5 is odd)
- // Expected: true
- //
- // instead of a more opaque
- //
- // Value of: IsEven(Fib(5))
- // Actual: false
- // Expected: true
- //
- // in case IsEven is a simple Boolean predicate.
- //
- // If you expect your predicate to be reused and want to support informative
- // messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
- // about half as often as positive ones in our tests), supply messages for
- // both success and failure cases:
- //
- // testing::AssertionResult IsEven(int n) {
- // if ((n % 2) == 0)
- // return testing::AssertionSuccess() << n << " is even";
- // else
- // return testing::AssertionFailure() << n << " is odd";
- // }
- //
- // Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
- //
- // Value of: IsEven(Fib(6))
- // Actual: true (8 is even)
- // Expected: false
- //
- // NB: Predicates that support negative Boolean assertions have reduced
- // performance in positive ones so be careful not to use them in tests
- // that have lots (tens of thousands) of positive Boolean assertions.
- //
- // To use this class with EXPECT_PRED_FORMAT assertions such as:
- //
- // // Verifies that Foo() returns an even number.
- // EXPECT_PRED_FORMAT1(IsEven, Foo());
- //
- // you need to define:
- //
- // testing::AssertionResult IsEven(const char* expr, int n) {
- // if ((n % 2) == 0)
- // return testing::AssertionSuccess();
- // else
- // return testing::AssertionFailure()
- // << "Expected: " << expr << " is even\n Actual: it's " << n;
- // }
- //
- // If Foo() returns 5, you will see the following message:
- //
- // Expected: Foo() is even
- // Actual: it's 5
- //
- class GTEST_API_ AssertionResult {
- public:
- // Copy constructor.
- // Used in EXPECT_TRUE/FALSE(assertion_result).
- AssertionResult(const AssertionResult& other);
- // C4800 is a level 3 warning in Visual Studio 2015 and earlier.
- // This warning is not emitted in Visual Studio 2017.
- // This warning is off by default starting in Visual Studio 2019 but can be
- // enabled with command-line options.
- #if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920)
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */)
- #endif
- // Used in the EXPECT_TRUE/FALSE(bool_expression).
- //
- // T must be contextually convertible to bool.
- //
- // The second parameter prevents this overload from being considered if
- // the argument is implicitly convertible to AssertionResult. In that case
- // we want AssertionResult's copy constructor to be used.
- template <typename T>
- explicit AssertionResult(
- const T& success,
- typename std::enable_if<
- !std::is_convertible<T, AssertionResult>::value>::type*
- /*enabler*/
- = nullptr)
- : success_(success) {}
- #if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920)
- GTEST_DISABLE_MSC_WARNINGS_POP_()
- #endif
- // Assignment operator.
- AssertionResult& operator=(AssertionResult other) {
- swap(other);
- return *this;
- }
- // Returns true if and only if the assertion succeeded.
- operator bool() const { return success_; } // NOLINT
- // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
- AssertionResult operator!() const;
- // Returns the text streamed into this AssertionResult. Test assertions
- // use it when they fail (i.e., the predicate's outcome doesn't match the
- // assertion's expectation). When nothing has been streamed into the
- // object, returns an empty string.
- const char* message() const {
- return message_.get() != nullptr ? message_->c_str() : "";
- }
- // Deprecated; please use message() instead.
- const char* failure_message() const { return message(); }
- // Streams a custom failure message into this object.
- template <typename T> AssertionResult& operator<<(const T& value) {
- AppendMessage(Message() << value);
- return *this;
- }
- // Allows streaming basic output manipulators such as endl or flush into
- // this object.
- AssertionResult& operator<<(
- ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
- AppendMessage(Message() << basic_manipulator);
- return *this;
- }
- private:
- // Appends the contents of message to message_.
- void AppendMessage(const Message& a_message) {
- if (message_.get() == nullptr) message_.reset(new ::std::string);
- message_->append(a_message.GetString().c_str());
- }
- // Swap the contents of this AssertionResult with other.
- void swap(AssertionResult& other);
- // Stores result of the assertion predicate.
- bool success_;
- // Stores the message describing the condition in case the expectation
- // construct is not satisfied with the predicate's outcome.
- // Referenced via a pointer to avoid taking too much stack frame space
- // with test assertions.
- std::unique_ptr< ::std::string> message_;
- };
- // Makes a successful assertion result.
- GTEST_API_ AssertionResult AssertionSuccess();
- // Makes a failed assertion result.
- GTEST_API_ AssertionResult AssertionFailure();
- // Makes a failed assertion result with the given failure message.
- // Deprecated; use AssertionFailure() << msg.
- GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
- } // namespace testing
- // Includes the auto-generated header that implements a family of generic
- // predicate assertion macros. This include comes late because it relies on
- // APIs declared above.
- // Copyright 2006, Google Inc.
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- // This file is AUTOMATICALLY GENERATED on 01/02/2019 by command
- // 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
- //
- // Implements a family of generic predicate assertion macros.
- // GOOGLETEST_CM0001 DO NOT DELETE
- #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
- #define GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
- namespace testing {
- // This header implements a family of generic predicate assertion
- // macros:
- //
- // ASSERT_PRED_FORMAT1(pred_format, v1)
- // ASSERT_PRED_FORMAT2(pred_format, v1, v2)
- // ...
- //
- // where pred_format is a function or functor that takes n (in the
- // case of ASSERT_PRED_FORMATn) values and their source expression
- // text, and returns a testing::AssertionResult. See the definition
- // of ASSERT_EQ in gtest.h for an example.
- //
- // If you don't care about formatting, you can use the more
- // restrictive version:
- //
- // ASSERT_PRED1(pred, v1)
- // ASSERT_PRED2(pred, v1, v2)
- // ...
- //
- // where pred is an n-ary function or functor that returns bool,
- // and the values v1, v2, ..., must support the << operator for
- // streaming to std::ostream.
- //
- // We also define the EXPECT_* variations.
- //
- // For now we only support predicates whose arity is at most 5.
- // Please email googletestframework@googlegroups.com if you need
- // support for higher arities.
- // GTEST_ASSERT_ is the basic statement to which all of the assertions
- // in this file reduce. Don't use this in your code.
- #define GTEST_ASSERT_(expression, on_failure) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (const ::testing::AssertionResult gtest_ar = (expression)) \
- ; \
- else \
- on_failure(gtest_ar.failure_message())
- // Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use
- // this in your code.
- template <typename Pred,
- typename T1>
- AssertionResult AssertPred1Helper(const char* pred_text,
- const char* e1,
- Pred pred,
- const T1& v1) {
- if (pred(v1)) return AssertionSuccess();
- return AssertionFailure()
- << pred_text << "(" << e1 << ") evaluates to false, where"
- << "\n"
- << e1 << " evaluates to " << ::testing::PrintToString(v1);
- }
- // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
- // Don't use this in your code.
- #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, v1), \
- on_failure)
- // Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use
- // this in your code.
- #define GTEST_PRED1_(pred, v1, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
- #v1, \
- pred, \
- v1), on_failure)
- // Unary predicate assertion macros.
- #define EXPECT_PRED_FORMAT1(pred_format, v1) \
- GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
- #define EXPECT_PRED1(pred, v1) \
- GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
- #define ASSERT_PRED_FORMAT1(pred_format, v1) \
- GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
- #define ASSERT_PRED1(pred, v1) \
- GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
- // Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use
- // this in your code.
- template <typename Pred,
- typename T1,
- typename T2>
- AssertionResult AssertPred2Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- Pred pred,
- const T1& v1,
- const T2& v2) {
- if (pred(v1, v2)) return AssertionSuccess();
- return AssertionFailure()
- << pred_text << "(" << e1 << ", " << e2
- << ") evaluates to false, where"
- << "\n"
- << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"
- << e2 << " evaluates to " << ::testing::PrintToString(v2);
- }
- // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
- // Don't use this in your code.
- #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
- on_failure)
- // Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use
- // this in your code.
- #define GTEST_PRED2_(pred, v1, v2, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
- #v1, \
- #v2, \
- pred, \
- v1, \
- v2), on_failure)
- // Binary predicate assertion macros.
- #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
- GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
- #define EXPECT_PRED2(pred, v1, v2) \
- GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
- #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
- GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
- #define ASSERT_PRED2(pred, v1, v2) \
- GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
- // Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use
- // this in your code.
- template <typename Pred,
- typename T1,
- typename T2,
- typename T3>
- AssertionResult AssertPred3Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- const char* e3,
- Pred pred,
- const T1& v1,
- const T2& v2,
- const T3& v3) {
- if (pred(v1, v2, v3)) return AssertionSuccess();
- return AssertionFailure()
- << pred_text << "(" << e1 << ", " << e2 << ", " << e3
- << ") evaluates to false, where"
- << "\n"
- << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"
- << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n"
- << e3 << " evaluates to " << ::testing::PrintToString(v3);
- }
- // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
- // Don't use this in your code.
- #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
- on_failure)
- // Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use
- // this in your code.
- #define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
- #v1, \
- #v2, \
- #v3, \
- pred, \
- v1, \
- v2, \
- v3), on_failure)
- // Ternary predicate assertion macros.
- #define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
- GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
- #define EXPECT_PRED3(pred, v1, v2, v3) \
- GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
- #define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
- GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
- #define ASSERT_PRED3(pred, v1, v2, v3) \
- GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
- // Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use
- // this in your code.
- template <typename Pred,
- typename T1,
- typename T2,
- typename T3,
- typename T4>
- AssertionResult AssertPred4Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- const char* e3,
- const char* e4,
- Pred pred,
- const T1& v1,
- const T2& v2,
- const T3& v3,
- const T4& v4) {
- if (pred(v1, v2, v3, v4)) return AssertionSuccess();
- return AssertionFailure()
- << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4
- << ") evaluates to false, where"
- << "\n"
- << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"
- << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n"
- << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n"
- << e4 << " evaluates to " << ::testing::PrintToString(v4);
- }
- // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
- // Don't use this in your code.
- #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
- on_failure)
- // Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use
- // this in your code.
- #define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
- #v1, \
- #v2, \
- #v3, \
- #v4, \
- pred, \
- v1, \
- v2, \
- v3, \
- v4), on_failure)
- // 4-ary predicate assertion macros.
- #define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
- GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
- #define EXPECT_PRED4(pred, v1, v2, v3, v4) \
- GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
- #define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
- GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
- #define ASSERT_PRED4(pred, v1, v2, v3, v4) \
- GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
- // Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use
- // this in your code.
- template <typename Pred,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5>
- AssertionResult AssertPred5Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- const char* e3,
- const char* e4,
- const char* e5,
- Pred pred,
- const T1& v1,
- const T2& v2,
- const T3& v3,
- const T4& v4,
- const T5& v5) {
- if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
- return AssertionFailure()
- << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4
- << ", " << e5 << ") evaluates to false, where"
- << "\n"
- << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"
- << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n"
- << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n"
- << e4 << " evaluates to " << ::testing::PrintToString(v4) << "\n"
- << e5 << " evaluates to " << ::testing::PrintToString(v5);
- }
- // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
- // Don't use this in your code.
- #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
- on_failure)
- // Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use
- // this in your code.
- #define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
- #v1, \
- #v2, \
- #v3, \
- #v4, \
- #v5, \
- pred, \
- v1, \
- v2, \
- v3, \
- v4, \
- v5), on_failure)
- // 5-ary predicate assertion macros.
- #define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
- GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
- #define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
- GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
- #define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
- GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
- #define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
- GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
- } // namespace testing
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
- namespace testing {
- // The abstract class that all tests inherit from.
- //
- // In Google Test, a unit test program contains one or many TestSuites, and
- // each TestSuite contains one or many Tests.
- //
- // When you define a test using the TEST macro, you don't need to
- // explicitly derive from Test - the TEST macro automatically does
- // this for you.
- //
- // The only time you derive from Test is when defining a test fixture
- // to be used in a TEST_F. For example:
- //
- // class FooTest : public testing::Test {
- // protected:
- // void SetUp() override { ... }
- // void TearDown() override { ... }
- // ...
- // };
- //
- // TEST_F(FooTest, Bar) { ... }
- // TEST_F(FooTest, Baz) { ... }
- //
- // Test is not copyable.
- class GTEST_API_ Test {
- public:
- friend class TestInfo;
- // The d'tor is virtual as we intend to inherit from Test.
- virtual ~Test();
- // Sets up the stuff shared by all tests in this test suite.
- //
- // Google Test will call Foo::SetUpTestSuite() before running the first
- // test in test suite Foo. Hence a sub-class can define its own
- // SetUpTestSuite() method to shadow the one defined in the super
- // class.
- static void SetUpTestSuite() {}
- // Tears down the stuff shared by all tests in this test suite.
- //
- // Google Test will call Foo::TearDownTestSuite() after running the last
- // test in test suite Foo. Hence a sub-class can define its own
- // TearDownTestSuite() method to shadow the one defined in the super
- // class.
- static void TearDownTestSuite() {}
- // Legacy API is deprecated but still available. Use SetUpTestSuite and
- // TearDownTestSuite instead.
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- static void TearDownTestCase() {}
- static void SetUpTestCase() {}
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- // Returns true if and only if the current test has a fatal failure.
- static bool HasFatalFailure();
- // Returns true if and only if the current test has a non-fatal failure.
- static bool HasNonfatalFailure();
- // Returns true if and only if the current test was skipped.
- static bool IsSkipped();
- // Returns true if and only if the current test has a (either fatal or
- // non-fatal) failure.
- static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
- // Logs a property for the current test, test suite, or for the entire
- // invocation of the test program when used outside of the context of a
- // test suite. Only the last value for a given key is remembered. These
- // are public static so they can be called from utility functions that are
- // not members of the test fixture. Calls to RecordProperty made during
- // lifespan of the test (from the moment its constructor starts to the
- // moment its destructor finishes) will be output in XML as attributes of
- // the <testcase> element. Properties recorded from fixture's
- // SetUpTestSuite or TearDownTestSuite are logged as attributes of the
- // corresponding <testsuite> element. Calls to RecordProperty made in the
- // global context (before or after invocation of RUN_ALL_TESTS and from
- // SetUp/TearDown method of Environment objects registered with Google
- // Test) will be output as attributes of the <testsuites> element.
- static void RecordProperty(const std::string& key, const std::string& value);
- static void RecordProperty(const std::string& key, int value);
- protected:
- // Creates a Test object.
- Test();
- // Sets up the test fixture.
- virtual void SetUp();
- // Tears down the test fixture.
- virtual void TearDown();
- private:
- // Returns true if and only if the current test has the same fixture class
- // as the first test in the current test suite.
- static bool HasSameFixtureClass();
- // Runs the test after the test fixture has been set up.
- //
- // A sub-class must implement this to define the test logic.
- //
- // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
- // Instead, use the TEST or TEST_F macro.
- virtual void TestBody() = 0;
- // Sets up, executes, and tears down the test.
- void Run();
- // Deletes self. We deliberately pick an unusual name for this
- // internal method to avoid clashing with names used in user TESTs.
- void DeleteSelf_() { delete this; }
- const std::unique_ptr<GTEST_FLAG_SAVER_> gtest_flag_saver_;
- // Often a user misspells SetUp() as Setup() and spends a long time
- // wondering why it is never called by Google Test. The declaration of
- // the following method is solely for catching such an error at
- // compile time:
- //
- // - The return type is deliberately chosen to be not void, so it
- // will be a conflict if void Setup() is declared in the user's
- // test fixture.
- //
- // - This method is private, so it will be another compiler error
- // if the method is called from the user's test fixture.
- //
- // DO NOT OVERRIDE THIS FUNCTION.
- //
- // If you see an error about overriding the following function or
- // about it being private, you have mis-spelled SetUp() as Setup().
- struct Setup_should_be_spelled_SetUp {};
- virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; }
- // We disallow copying Tests.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
- };
- typedef internal::TimeInMillis TimeInMillis;
- // A copyable object representing a user specified test property which can be
- // output as a key/value string pair.
- //
- // Don't inherit from TestProperty as its destructor is not virtual.
- class TestProperty {
- public:
- // C'tor. TestProperty does NOT have a default constructor.
- // Always use this constructor (with parameters) to create a
- // TestProperty object.
- TestProperty(const std::string& a_key, const std::string& a_value) :
- key_(a_key), value_(a_value) {
- }
- // Gets the user supplied key.
- const char* key() const {
- return key_.c_str();
- }
- // Gets the user supplied value.
- const char* value() const {
- return value_.c_str();
- }
- // Sets a new value, overriding the one supplied in the constructor.
- void SetValue(const std::string& new_value) {
- value_ = new_value;
- }
- private:
- // The key supplied by the user.
- std::string key_;
- // The value supplied by the user.
- std::string value_;
- };
- // The result of a single Test. This includes a list of
- // TestPartResults, a list of TestProperties, a count of how many
- // death tests there are in the Test, and how much time it took to run
- // the Test.
- //
- // TestResult is not copyable.
- class GTEST_API_ TestResult {
- public:
- // Creates an empty TestResult.
- TestResult();
- // D'tor. Do not inherit from TestResult.
- ~TestResult();
- // Gets the number of all test parts. This is the sum of the number
- // of successful test parts and the number of failed test parts.
- int total_part_count() const;
- // Returns the number of the test properties.
- int test_property_count() const;
- // Returns true if and only if the test passed (i.e. no test part failed).
- bool Passed() const { return !Skipped() && !Failed(); }
- // Returns true if and only if the test was skipped.
- bool Skipped() const;
- // Returns true if and only if the test failed.
- bool Failed() const;
- // Returns true if and only if the test fatally failed.
- bool HasFatalFailure() const;
- // Returns true if and only if the test has a non-fatal failure.
- bool HasNonfatalFailure() const;
- // Returns the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const { return elapsed_time_; }
- // Gets the time of the test case start, in ms from the start of the
- // UNIX epoch.
- TimeInMillis start_timestamp() const { return start_timestamp_; }
- // Returns the i-th test part result among all the results. i can range from 0
- // to total_part_count() - 1. If i is not in that range, aborts the program.
- const TestPartResult& GetTestPartResult(int i) const;
- // Returns the i-th test property. i can range from 0 to
- // test_property_count() - 1. If i is not in that range, aborts the
- // program.
- const TestProperty& GetTestProperty(int i) const;
- private:
- friend class TestInfo;
- friend class TestSuite;
- friend class UnitTest;
- friend class internal::DefaultGlobalTestPartResultReporter;
- friend class internal::ExecDeathTest;
- friend class internal::TestResultAccessor;
- friend class internal::UnitTestImpl;
- friend class internal::WindowsDeathTest;
- friend class internal::FuchsiaDeathTest;
- // Gets the vector of TestPartResults.
- const std::vector<TestPartResult>& test_part_results() const {
- return test_part_results_;
- }
- // Gets the vector of TestProperties.
- const std::vector<TestProperty>& test_properties() const {
- return test_properties_;
- }
- // Sets the start time.
- void set_start_timestamp(TimeInMillis start) { start_timestamp_ = start; }
- // Sets the elapsed time.
- void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
- // Adds a test property to the list. The property is validated and may add
- // a non-fatal failure if invalid (e.g., if it conflicts with reserved
- // key names). If a property is already recorded for the same key, the
- // value will be updated, rather than storing multiple values for the same
- // key. xml_element specifies the element for which the property is being
- // recorded and is used for validation.
- void RecordProperty(const std::string& xml_element,
- const TestProperty& test_property);
- // Adds a failure if the key is a reserved attribute of Google Test
- // testsuite tags. Returns true if the property is valid.
- // FIXME: Validate attribute names are legal and human readable.
- static bool ValidateTestProperty(const std::string& xml_element,
- const TestProperty& test_property);
- // Adds a test part result to the list.
- void AddTestPartResult(const TestPartResult& test_part_result);
- // Returns the death test count.
- int death_test_count() const { return death_test_count_; }
- // Increments the death test count, returning the new count.
- int increment_death_test_count() { return ++death_test_count_; }
- // Clears the test part results.
- void ClearTestPartResults();
- // Clears the object.
- void Clear();
- // Protects mutable state of the property vector and of owned
- // properties, whose values may be updated.
- internal::Mutex test_properties_mutex_;
- // The vector of TestPartResults
- std::vector<TestPartResult> test_part_results_;
- // The vector of TestProperties
- std::vector<TestProperty> test_properties_;
- // Running count of death tests.
- int death_test_count_;
- // The start time, in milliseconds since UNIX Epoch.
- TimeInMillis start_timestamp_;
- // The elapsed time, in milliseconds.
- TimeInMillis elapsed_time_;
- // We disallow copying TestResult.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
- }; // class TestResult
- // A TestInfo object stores the following information about a test:
- //
- // Test suite name
- // Test name
- // Whether the test should be run
- // A function pointer that creates the test object when invoked
- // Test result
- //
- // The constructor of TestInfo registers itself with the UnitTest
- // singleton such that the RUN_ALL_TESTS() macro knows which tests to
- // run.
- class GTEST_API_ TestInfo {
- public:
- // Destructs a TestInfo object. This function is not virtual, so
- // don't inherit from TestInfo.
- ~TestInfo();
- // Returns the test suite name.
- const char* test_suite_name() const { return test_suite_name_.c_str(); }
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- const char* test_case_name() const { return test_suite_name(); }
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- // Returns the test name.
- const char* name() const { return name_.c_str(); }
- // Returns the name of the parameter type, or NULL if this is not a typed
- // or a type-parameterized test.
- const char* type_param() const {
- if (type_param_.get() != nullptr) return type_param_->c_str();
- return nullptr;
- }
- // Returns the text representation of the value parameter, or NULL if this
- // is not a value-parameterized test.
- const char* value_param() const {
- if (value_param_.get() != nullptr) return value_param_->c_str();
- return nullptr;
- }
- // Returns the file name where this test is defined.
- const char* file() const { return location_.file.c_str(); }
- // Returns the line where this test is defined.
- int line() const { return location_.line; }
- // Return true if this test should not be run because it's in another shard.
- bool is_in_another_shard() const { return is_in_another_shard_; }
- // Returns true if this test should run, that is if the test is not
- // disabled (or it is disabled but the also_run_disabled_tests flag has
- // been specified) and its full name matches the user-specified filter.
- //
- // Google Test allows the user to filter the tests by their full names.
- // The full name of a test Bar in test suite Foo is defined as
- // "Foo.Bar". Only the tests that match the filter will run.
- //
- // A filter is a colon-separated list of glob (not regex) patterns,
- // optionally followed by a '-' and a colon-separated list of
- // negative patterns (tests to exclude). A test is run if it
- // matches one of the positive patterns and does not match any of
- // the negative patterns.
- //
- // For example, *A*:Foo.* is a filter that matches any string that
- // contains the character 'A' or starts with "Foo.".
- bool should_run() const { return should_run_; }
- // Returns true if and only if this test will appear in the XML report.
- bool is_reportable() const {
- // The XML report includes tests matching the filter, excluding those
- // run in other shards.
- return matches_filter_ && !is_in_another_shard_;
- }
- // Returns the result of the test.
- const TestResult* result() const { return &result_; }
- private:
- #if GTEST_HAS_DEATH_TEST
- friend class internal::DefaultDeathTestFactory;
- #endif // GTEST_HAS_DEATH_TEST
- friend class Test;
- friend class TestSuite;
- friend class internal::UnitTestImpl;
- friend class internal::StreamingListenerTest;
- friend TestInfo* internal::MakeAndRegisterTestInfo(
- const char* test_suite_name, const char* name, const char* type_param,
- const char* value_param, internal::CodeLocation code_location,
- internal::TypeId fixture_class_id, internal::SetUpTestSuiteFunc set_up_tc,
- internal::TearDownTestSuiteFunc tear_down_tc,
- internal::TestFactoryBase* factory);
- // Constructs a TestInfo object. The newly constructed instance assumes
- // ownership of the factory object.
- TestInfo(const std::string& test_suite_name, const std::string& name,
- const char* a_type_param, // NULL if not a type-parameterized test
- const char* a_value_param, // NULL if not a value-parameterized test
- internal::CodeLocation a_code_location,
- internal::TypeId fixture_class_id,
- internal::TestFactoryBase* factory);
- // Increments the number of death tests encountered in this test so
- // far.
- int increment_death_test_count() {
- return result_.increment_death_test_count();
- }
- // Creates the test object, runs it, records its result, and then
- // deletes it.
- void Run();
- // Skip and records the test result for this object.
- void Skip();
- static void ClearTestResult(TestInfo* test_info) {
- test_info->result_.Clear();
- }
- // These fields are immutable properties of the test.
- const std::string test_suite_name_; // test suite name
- const std::string name_; // Test name
- // Name of the parameter type, or NULL if this is not a typed or a
- // type-parameterized test.
- const std::unique_ptr<const ::std::string> type_param_;
- // Text representation of the value parameter, or NULL if this is not a
- // value-parameterized test.
- const std::unique_ptr<const ::std::string> value_param_;
- internal::CodeLocation location_;
- const internal::TypeId fixture_class_id_; // ID of the test fixture class
- bool should_run_; // True if and only if this test should run
- bool is_disabled_; // True if and only if this test is disabled
- bool matches_filter_; // True if this test matches the
- // user-specified filter.
- bool is_in_another_shard_; // Will be run in another shard.
- internal::TestFactoryBase* const factory_; // The factory that creates
- // the test object
- // This field is mutable and needs to be reset before running the
- // test for the second time.
- TestResult result_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
- };
- // A test suite, which consists of a vector of TestInfos.
- //
- // TestSuite is not copyable.
- class GTEST_API_ TestSuite {
- public:
- // Creates a TestSuite with the given name.
- //
- // TestSuite does NOT have a default constructor. Always use this
- // constructor to create a TestSuite object.
- //
- // Arguments:
- //
- // name: name of the test suite
- // a_type_param: the name of the test's type parameter, or NULL if
- // this is not a type-parameterized test.
- // set_up_tc: pointer to the function that sets up the test suite
- // tear_down_tc: pointer to the function that tears down the test suite
- TestSuite(const char* name, const char* a_type_param,
- internal::SetUpTestSuiteFunc set_up_tc,
- internal::TearDownTestSuiteFunc tear_down_tc);
- // Destructor of TestSuite.
- virtual ~TestSuite();
- // Gets the name of the TestSuite.
- const char* name() const { return name_.c_str(); }
- // Returns the name of the parameter type, or NULL if this is not a
- // type-parameterized test suite.
- const char* type_param() const {
- if (type_param_.get() != nullptr) return type_param_->c_str();
- return nullptr;
- }
- // Returns true if any test in this test suite should run.
- bool should_run() const { return should_run_; }
- // Gets the number of successful tests in this test suite.
- int successful_test_count() const;
- // Gets the number of skipped tests in this test suite.
- int skipped_test_count() const;
- // Gets the number of failed tests in this test suite.
- int failed_test_count() const;
- // Gets the number of disabled tests that will be reported in the XML report.
- int reportable_disabled_test_count() const;
- // Gets the number of disabled tests in this test suite.
- int disabled_test_count() const;
- // Gets the number of tests to be printed in the XML report.
- int reportable_test_count() const;
- // Get the number of tests in this test suite that should run.
- int test_to_run_count() const;
- // Gets the number of all tests in this test suite.
- int total_test_count() const;
- // Returns true if and only if the test suite passed.
- bool Passed() const { return !Failed(); }
- // Returns true if and only if the test suite failed.
- bool Failed() const {
- return failed_test_count() > 0 || ad_hoc_test_result().Failed();
- }
- // Returns the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const { return elapsed_time_; }
- // Gets the time of the test suite start, in ms from the start of the
- // UNIX epoch.
- TimeInMillis start_timestamp() const { return start_timestamp_; }
- // Returns the i-th test among all the tests. i can range from 0 to
- // total_test_count() - 1. If i is not in that range, returns NULL.
- const TestInfo* GetTestInfo(int i) const;
- // Returns the TestResult that holds test properties recorded during
- // execution of SetUpTestSuite and TearDownTestSuite.
- const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
- private:
- friend class Test;
- friend class internal::UnitTestImpl;
- // Gets the (mutable) vector of TestInfos in this TestSuite.
- std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
- // Gets the (immutable) vector of TestInfos in this TestSuite.
- const std::vector<TestInfo*>& test_info_list() const {
- return test_info_list_;
- }
- // Returns the i-th test among all the tests. i can range from 0 to
- // total_test_count() - 1. If i is not in that range, returns NULL.
- TestInfo* GetMutableTestInfo(int i);
- // Sets the should_run member.
- void set_should_run(bool should) { should_run_ = should; }
- // Adds a TestInfo to this test suite. Will delete the TestInfo upon
- // destruction of the TestSuite object.
- void AddTestInfo(TestInfo * test_info);
- // Clears the results of all tests in this test suite.
- void ClearResult();
- // Clears the results of all tests in the given test suite.
- static void ClearTestSuiteResult(TestSuite* test_suite) {
- test_suite->ClearResult();
- }
- // Runs every test in this TestSuite.
- void Run();
- // Skips the execution of tests under this TestSuite
- void Skip();
- // Runs SetUpTestSuite() for this TestSuite. This wrapper is needed
- // for catching exceptions thrown from SetUpTestSuite().
- void RunSetUpTestSuite() {
- if (set_up_tc_ != nullptr) {
- (*set_up_tc_)();
- }
- }
- // Runs TearDownTestSuite() for this TestSuite. This wrapper is
- // needed for catching exceptions thrown from TearDownTestSuite().
- void RunTearDownTestSuite() {
- if (tear_down_tc_ != nullptr) {
- (*tear_down_tc_)();
- }
- }
- // Returns true if and only if test passed.
- static bool TestPassed(const TestInfo* test_info) {
- return test_info->should_run() && test_info->result()->Passed();
- }
- // Returns true if and only if test skipped.
- static bool TestSkipped(const TestInfo* test_info) {
- return test_info->should_run() && test_info->result()->Skipped();
- }
- // Returns true if and only if test failed.
- static bool TestFailed(const TestInfo* test_info) {
- return test_info->should_run() && test_info->result()->Failed();
- }
- // Returns true if and only if the test is disabled and will be reported in
- // the XML report.
- static bool TestReportableDisabled(const TestInfo* test_info) {
- return test_info->is_reportable() && test_info->is_disabled_;
- }
- // Returns true if and only if test is disabled.
- static bool TestDisabled(const TestInfo* test_info) {
- return test_info->is_disabled_;
- }
- // Returns true if and only if this test will appear in the XML report.
- static bool TestReportable(const TestInfo* test_info) {
- return test_info->is_reportable();
- }
- // Returns true if the given test should run.
- static bool ShouldRunTest(const TestInfo* test_info) {
- return test_info->should_run();
- }
- // Shuffles the tests in this test suite.
- void ShuffleTests(internal::Random* random);
- // Restores the test order to before the first shuffle.
- void UnshuffleTests();
- // Name of the test suite.
- std::string name_;
- // Name of the parameter type, or NULL if this is not a typed or a
- // type-parameterized test.
- const std::unique_ptr<const ::std::string> type_param_;
- // The vector of TestInfos in their original order. It owns the
- // elements in the vector.
- std::vector<TestInfo*> test_info_list_;
- // Provides a level of indirection for the test list to allow easy
- // shuffling and restoring the test order. The i-th element in this
- // vector is the index of the i-th test in the shuffled test list.
- std::vector<int> test_indices_;
- // Pointer to the function that sets up the test suite.
- internal::SetUpTestSuiteFunc set_up_tc_;
- // Pointer to the function that tears down the test suite.
- internal::TearDownTestSuiteFunc tear_down_tc_;
- // True if and only if any test in this test suite should run.
- bool should_run_;
- // The start time, in milliseconds since UNIX Epoch.
- TimeInMillis start_timestamp_;
- // Elapsed time, in milliseconds.
- TimeInMillis elapsed_time_;
- // Holds test properties recorded during execution of SetUpTestSuite and
- // TearDownTestSuite.
- TestResult ad_hoc_test_result_;
- // We disallow copying TestSuites.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestSuite);
- };
- // An Environment object is capable of setting up and tearing down an
- // environment. You should subclass this to define your own
- // environment(s).
- //
- // An Environment object does the set-up and tear-down in virtual
- // methods SetUp() and TearDown() instead of the constructor and the
- // destructor, as:
- //
- // 1. You cannot safely throw from a destructor. This is a problem
- // as in some cases Google Test is used where exceptions are enabled, and
- // we may want to implement ASSERT_* using exceptions where they are
- // available.
- // 2. You cannot use ASSERT_* directly in a constructor or
- // destructor.
- class Environment {
- public:
- // The d'tor is virtual as we need to subclass Environment.
- virtual ~Environment() {}
- // Override this to define how to set up the environment.
- virtual void SetUp() {}
- // Override this to define how to tear down the environment.
- virtual void TearDown() {}
- private:
- // If you see an error about overriding the following function or
- // about it being private, you have mis-spelled SetUp() as Setup().
- struct Setup_should_be_spelled_SetUp {};
- virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; }
- };
- #if GTEST_HAS_EXCEPTIONS
- // Exception which can be thrown from TestEventListener::OnTestPartResult.
- class GTEST_API_ AssertionException
- : public internal::GoogleTestFailureException {
- public:
- explicit AssertionException(const TestPartResult& result)
- : GoogleTestFailureException(result) {}
- };
- #endif // GTEST_HAS_EXCEPTIONS
- // The interface for tracing execution of tests. The methods are organized in
- // the order the corresponding events are fired.
- class TestEventListener {
- public:
- virtual ~TestEventListener() {}
- // Fired before any test activity starts.
- virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
- // Fired before each iteration of tests starts. There may be more than
- // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
- // index, starting from 0.
- virtual void OnTestIterationStart(const UnitTest& unit_test,
- int iteration) = 0;
- // Fired before environment set-up for each iteration of tests starts.
- virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
- // Fired after environment set-up for each iteration of tests ends.
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
- // Fired before the test suite starts.
- virtual void OnTestSuiteStart(const TestSuite& /*test_suite*/) {}
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- // Fired before the test starts.
- virtual void OnTestStart(const TestInfo& test_info) = 0;
- // Fired after a failed assertion or a SUCCEED() invocation.
- // If you want to throw an exception from this function to skip to the next
- // TEST, it must be AssertionException defined above, or inherited from it.
- virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
- // Fired after the test ends.
- virtual void OnTestEnd(const TestInfo& test_info) = 0;
- // Fired after the test suite ends.
- virtual void OnTestSuiteEnd(const TestSuite& /*test_suite*/) {}
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- // Fired before environment tear-down for each iteration of tests starts.
- virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
- // Fired after environment tear-down for each iteration of tests ends.
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
- // Fired after each iteration of tests finishes.
- virtual void OnTestIterationEnd(const UnitTest& unit_test,
- int iteration) = 0;
- // Fired after all test activities have ended.
- virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
- };
- // The convenience class for users who need to override just one or two
- // methods and are not concerned that a possible change to a signature of
- // the methods they override will not be caught during the build. For
- // comments about each method please see the definition of TestEventListener
- // above.
- class EmptyTestEventListener : public TestEventListener {
- public:
- void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}
- void OnTestIterationStart(const UnitTest& /*unit_test*/,
- int /*iteration*/) override {}
- void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {}
- void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}
- void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {}
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- void OnTestCaseStart(const TestCase& /*test_case*/) override {}
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- void OnTestStart(const TestInfo& /*test_info*/) override {}
- void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {}
- void OnTestEnd(const TestInfo& /*test_info*/) override {}
- void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- void OnTestCaseEnd(const TestCase& /*test_case*/) override {}
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {}
- void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}
- void OnTestIterationEnd(const UnitTest& /*unit_test*/,
- int /*iteration*/) override {}
- void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}
- };
- // TestEventListeners lets users add listeners to track events in Google Test.
- class GTEST_API_ TestEventListeners {
- public:
- TestEventListeners();
- ~TestEventListeners();
- // Appends an event listener to the end of the list. Google Test assumes
- // the ownership of the listener (i.e. it will delete the listener when
- // the test program finishes).
- void Append(TestEventListener* listener);
- // Removes the given event listener from the list and returns it. It then
- // becomes the caller's responsibility to delete the listener. Returns
- // NULL if the listener is not found in the list.
- TestEventListener* Release(TestEventListener* listener);
- // Returns the standard listener responsible for the default console
- // output. Can be removed from the listeners list to shut down default
- // console output. Note that removing this object from the listener list
- // with Release transfers its ownership to the caller and makes this
- // function return NULL the next time.
- TestEventListener* default_result_printer() const {
- return default_result_printer_;
- }
- // Returns the standard listener responsible for the default XML output
- // controlled by the --gtest_output=xml flag. Can be removed from the
- // listeners list by users who want to shut down the default XML output
- // controlled by this flag and substitute it with custom one. Note that
- // removing this object from the listener list with Release transfers its
- // ownership to the caller and makes this function return NULL the next
- // time.
- TestEventListener* default_xml_generator() const {
- return default_xml_generator_;
- }
- private:
- friend class TestSuite;
- friend class TestInfo;
- friend class internal::DefaultGlobalTestPartResultReporter;
- friend class internal::NoExecDeathTest;
- friend class internal::TestEventListenersAccessor;
- friend class internal::UnitTestImpl;
- // Returns repeater that broadcasts the TestEventListener events to all
- // subscribers.
- TestEventListener* repeater();
- // Sets the default_result_printer attribute to the provided listener.
- // The listener is also added to the listener list and previous
- // default_result_printer is removed from it and deleted. The listener can
- // also be NULL in which case it will not be added to the list. Does
- // nothing if the previous and the current listener objects are the same.
- void SetDefaultResultPrinter(TestEventListener* listener);
- // Sets the default_xml_generator attribute to the provided listener. The
- // listener is also added to the listener list and previous
- // default_xml_generator is removed from it and deleted. The listener can
- // also be NULL in which case it will not be added to the list. Does
- // nothing if the previous and the current listener objects are the same.
- void SetDefaultXmlGenerator(TestEventListener* listener);
- // Controls whether events will be forwarded by the repeater to the
- // listeners in the list.
- bool EventForwardingEnabled() const;
- void SuppressEventForwarding();
- // The actual list of listeners.
- internal::TestEventRepeater* repeater_;
- // Listener responsible for the standard result output.
- TestEventListener* default_result_printer_;
- // Listener responsible for the creation of the XML output file.
- TestEventListener* default_xml_generator_;
- // We disallow copying TestEventListeners.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
- };
- // A UnitTest consists of a vector of TestSuites.
- //
- // This is a singleton class. The only instance of UnitTest is
- // created when UnitTest::GetInstance() is first called. This
- // instance is never deleted.
- //
- // UnitTest is not copyable.
- //
- // This class is thread-safe as long as the methods are called
- // according to their specification.
- class GTEST_API_ UnitTest {
- public:
- // Gets the singleton UnitTest object. The first time this method
- // is called, a UnitTest object is constructed and returned.
- // Consecutive calls will return the same object.
- static UnitTest* GetInstance();
- // Runs all tests in this UnitTest object and prints the result.
- // Returns 0 if successful, or 1 otherwise.
- //
- // This method can only be called from the main thread.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- int Run() GTEST_MUST_USE_RESULT_;
- // Returns the working directory when the first TEST() or TEST_F()
- // was executed. The UnitTest object owns the string.
- const char* original_working_dir() const;
- // Returns the TestSuite object for the test that's currently running,
- // or NULL if no test is running.
- const TestSuite* current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_);
- // Legacy API is still available but deprecated
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- const TestCase* current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_);
- #endif
- // Returns the TestInfo object for the test that's currently running,
- // or NULL if no test is running.
- const TestInfo* current_test_info() const
- GTEST_LOCK_EXCLUDED_(mutex_);
- // Returns the random seed used at the start of the current test run.
- int random_seed() const;
- // Returns the ParameterizedTestSuiteRegistry object used to keep track of
- // value-parameterized tests and instantiate and register them.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- internal::ParameterizedTestSuiteRegistry& parameterized_test_registry()
- GTEST_LOCK_EXCLUDED_(mutex_);
- // Gets the number of successful test suites.
- int successful_test_suite_count() const;
- // Gets the number of failed test suites.
- int failed_test_suite_count() const;
- // Gets the number of all test suites.
- int total_test_suite_count() const;
- // Gets the number of all test suites that contain at least one test
- // that should run.
- int test_suite_to_run_count() const;
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- int successful_test_case_count() const;
- int failed_test_case_count() const;
- int total_test_case_count() const;
- int test_case_to_run_count() const;
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- // Gets the number of successful tests.
- int successful_test_count() const;
- // Gets the number of skipped tests.
- int skipped_test_count() const;
- // Gets the number of failed tests.
- int failed_test_count() const;
- // Gets the number of disabled tests that will be reported in the XML report.
- int reportable_disabled_test_count() const;
- // Gets the number of disabled tests.
- int disabled_test_count() const;
- // Gets the number of tests to be printed in the XML report.
- int reportable_test_count() const;
- // Gets the number of all tests.
- int total_test_count() const;
- // Gets the number of tests that should run.
- int test_to_run_count() const;
- // Gets the time of the test program start, in ms from the start of the
- // UNIX epoch.
- TimeInMillis start_timestamp() const;
- // Gets the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const;
- // Returns true if and only if the unit test passed (i.e. all test suites
- // passed).
- bool Passed() const;
- // Returns true if and only if the unit test failed (i.e. some test suite
- // failed or something outside of all tests failed).
- bool Failed() const;
- // Gets the i-th test suite among all the test suites. i can range from 0 to
- // total_test_suite_count() - 1. If i is not in that range, returns NULL.
- const TestSuite* GetTestSuite(int i) const;
- // Legacy API is deprecated but still available
- #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- const TestCase* GetTestCase(int i) const;
- #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
- // Returns the TestResult containing information on test failures and
- // properties logged outside of individual test suites.
- const TestResult& ad_hoc_test_result() const;
- // Returns the list of event listeners that can be used to track events
- // inside Google Test.
- TestEventListeners& listeners();
- private:
- // Registers and returns a global test environment. When a test
- // program is run, all global test environments will be set-up in
- // the order they were registered. After all tests in the program
- // have finished, all global test environments will be torn-down in
- // the *reverse* order they were registered.
- //
- // The UnitTest object takes ownership of the given environment.
- //
- // This method can only be called from the main thread.
- Environment* AddEnvironment(Environment* env);
- // Adds a TestPartResult to the current TestResult object. All
- // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
- // eventually call this to report their results. The user code
- // should use the assertion macros instead of calling this directly.
- void AddTestPartResult(TestPartResult::Type result_type,
- const char* file_name,
- int line_number,
- const std::string& message,
- const std::string& os_stack_trace)
- GTEST_LOCK_EXCLUDED_(mutex_);
- // Adds a TestProperty to the current TestResult object when invoked from
- // inside a test, to current TestSuite's ad_hoc_test_result_ when invoked
- // from SetUpTestSuite or TearDownTestSuite, or to the global property set
- // when invoked elsewhere. If the result already contains a property with
- // the same key, the value will be updated.
- void RecordProperty(const std::string& key, const std::string& value);
- // Gets the i-th test suite among all the test suites. i can range from 0 to
- // total_test_suite_count() - 1. If i is not in that range, returns NULL.
- TestSuite* GetMutableTestSuite(int i);
- // Accessors for the implementation object.
- internal::UnitTestImpl* impl() { return impl_; }
- const internal::UnitTestImpl* impl() const { return impl_; }
- // These classes and functions are friends as they need to access private
- // members of UnitTest.
- friend class ScopedTrace;
- friend class Test;
- friend class internal::AssertHelper;
- friend class internal::StreamingListenerTest;
- friend class internal::UnitTestRecordPropertyTestHelper;
- friend Environment* AddGlobalTestEnvironment(Environment* env);
- friend std::set<std::string>* internal::GetIgnoredParameterizedTestSuites();
- friend internal::UnitTestImpl* internal::GetUnitTestImpl();
- friend void internal::ReportFailureInUnknownLocation(
- TestPartResult::Type result_type,
- const std::string& message);
- // Creates an empty UnitTest.
- UnitTest();
- // D'tor
- virtual ~UnitTest();
- // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
- // Google Test trace stack.
- void PushGTestTrace(const internal::TraceInfo& trace)
- GTEST_LOCK_EXCLUDED_(mutex_);
- // Pops a trace from the per-thread Google Test trace stack.
- void PopGTestTrace()
- GTEST_LOCK_EXCLUDED_(mutex_);
- // Protects mutable state in *impl_. This is mutable as some const
- // methods need to lock it too.
- mutable internal::Mutex mutex_;
- // Opaque implementation object. This field is never changed once
- // the object is constructed. We don't mark it as const here, as
- // doing so will cause a warning in the constructor of UnitTest.
- // Mutable state in *impl_ is protected by mutex_.
- internal::UnitTestImpl* impl_;
- // We disallow copying UnitTest.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
- };
- // A convenient wrapper for adding an environment for the test
- // program.
- //
- // You should call this before RUN_ALL_TESTS() is called, probably in
- // main(). If you use gtest_main, you need to call this before main()
- // starts for it to take effect. For example, you can define a global
- // variable like this:
- //
- // testing::Environment* const foo_env =
- // testing::AddGlobalTestEnvironment(new FooEnvironment);
- //
- // However, we strongly recommend you to write your own main() and
- // call AddGlobalTestEnvironment() there, as relying on initialization
- // of global variables makes the code harder to read and may cause
- // problems when you register multiple environments from different
- // translation units and the environments have dependencies among them
- // (remember that the compiler doesn't guarantee the order in which
- // global variables from different translation units are initialized).
- inline Environment* AddGlobalTestEnvironment(Environment* env) {
- return UnitTest::GetInstance()->AddEnvironment(env);
- }
- // Initializes Google Test. This must be called before calling
- // RUN_ALL_TESTS(). In particular, it parses a command line for the
- // flags that Google Test recognizes. Whenever a Google Test flag is
- // seen, it is removed from argv, and *argc is decremented.
- //
- // No value is returned. Instead, the Google Test flag variables are
- // updated.
- //
- // Calling the function for the second time has no user-visible effect.
- GTEST_API_ void InitGoogleTest(int* argc, char** argv);
- // This overloaded version can be used in Windows programs compiled in
- // UNICODE mode.
- GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
- // This overloaded version can be used on Arduino/embedded platforms where
- // there is no argc/argv.
- GTEST_API_ void InitGoogleTest();
- namespace internal {
- // Separate the error generating code from the code path to reduce the stack
- // frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers
- // when calling EXPECT_* in a tight loop.
- template <typename T1, typename T2>
- AssertionResult CmpHelperEQFailure(const char* lhs_expression,
- const char* rhs_expression,
- const T1& lhs, const T2& rhs) {
- return EqFailure(lhs_expression,
- rhs_expression,
- FormatForComparisonFailureMessage(lhs, rhs),
- FormatForComparisonFailureMessage(rhs, lhs),
- false);
- }
- // This block of code defines operator==/!=
- // to block lexical scope lookup.
- // It prevents using invalid operator==/!= defined at namespace scope.
- struct faketype {};
- inline bool operator==(faketype, faketype) { return true; }
- inline bool operator!=(faketype, faketype) { return false; }
- // The helper function for {ASSERT|EXPECT}_EQ.
- template <typename T1, typename T2>
- AssertionResult CmpHelperEQ(const char* lhs_expression,
- const char* rhs_expression,
- const T1& lhs,
- const T2& rhs) {
- if (lhs == rhs) {
- return AssertionSuccess();
- }
- return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
- }
- class EqHelper {
- public:
- // This templatized version is for the general case.
- template <
- typename T1, typename T2,
- // Disable this overload for cases where one argument is a pointer
- // and the other is the null pointer constant.
- typename std::enable_if<!std::is_integral<T1>::value ||
- !std::is_pointer<T2>::value>::type* = nullptr>
- static AssertionResult Compare(const char* lhs_expression,
- const char* rhs_expression, const T1& lhs,
- const T2& rhs) {
- return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
- }
- // With this overloaded version, we allow anonymous enums to be used
- // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
- // enums can be implicitly cast to BiggestInt.
- //
- // Even though its body looks the same as the above version, we
- // cannot merge the two, as it will make anonymous enums unhappy.
- static AssertionResult Compare(const char* lhs_expression,
- const char* rhs_expression,
- BiggestInt lhs,
- BiggestInt rhs) {
- return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
- }
- template <typename T>
- static AssertionResult Compare(
- const char* lhs_expression, const char* rhs_expression,
- // Handle cases where '0' is used as a null pointer literal.
- std::nullptr_t /* lhs */, T* rhs) {
- // We already know that 'lhs' is a null pointer.
- return CmpHelperEQ(lhs_expression, rhs_expression, static_cast<T*>(nullptr),
- rhs);
- }
- };
- // Separate the error generating code from the code path to reduce the stack
- // frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers
- // when calling EXPECT_OP in a tight loop.
- template <typename T1, typename T2>
- AssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2,
- const T1& val1, const T2& val2,
- const char* op) {
- return AssertionFailure()
- << "Expected: (" << expr1 << ") " << op << " (" << expr2
- << "), actual: " << FormatForComparisonFailureMessage(val1, val2)
- << " vs " << FormatForComparisonFailureMessage(val2, val1);
- }
- // A macro for implementing the helper functions needed to implement
- // ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste
- // of similar code.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- #define GTEST_IMPL_CMP_HELPER_(op_name, op)\
- template <typename T1, typename T2>\
- AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
- const T1& val1, const T2& val2) {\
- if (val1 op val2) {\
- return AssertionSuccess();\
- } else {\
- return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\
- }\
- }
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- // Implements the helper function for {ASSERT|EXPECT}_NE
- GTEST_IMPL_CMP_HELPER_(NE, !=)
- // Implements the helper function for {ASSERT|EXPECT}_LE
- GTEST_IMPL_CMP_HELPER_(LE, <=)
- // Implements the helper function for {ASSERT|EXPECT}_LT
- GTEST_IMPL_CMP_HELPER_(LT, <)
- // Implements the helper function for {ASSERT|EXPECT}_GE
- GTEST_IMPL_CMP_HELPER_(GE, >=)
- // Implements the helper function for {ASSERT|EXPECT}_GT
- GTEST_IMPL_CMP_HELPER_(GT, >)
- #undef GTEST_IMPL_CMP_HELPER_
- // The helper function for {ASSERT|EXPECT}_STREQ.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2);
- // The helper function for {ASSERT|EXPECT}_STRCASEEQ.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2);
- // The helper function for {ASSERT|EXPECT}_STRNE.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2);
- // The helper function for {ASSERT|EXPECT}_STRCASENE.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2);
- // Helper function for *_STREQ on wide strings.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,
- const char* s2_expression,
- const wchar_t* s1,
- const wchar_t* s2);
- // Helper function for *_STRNE on wide strings.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const wchar_t* s1,
- const wchar_t* s2);
- } // namespace internal
- // IsSubstring() and IsNotSubstring() are intended to be used as the
- // first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
- // themselves. They check whether needle is a substring of haystack
- // (NULL is considered a substring of itself only), and return an
- // appropriate error message when they fail.
- //
- // The {needle,haystack}_expr arguments are the stringified
- // expressions that generated the two real arguments.
- GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack);
- GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack);
- GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack);
- GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack);
- GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack);
- GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack);
- #if GTEST_HAS_STD_WSTRING
- GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack);
- GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack);
- #endif // GTEST_HAS_STD_WSTRING
- namespace internal {
- // Helper template function for comparing floating-points.
- //
- // Template parameter:
- //
- // RawType: the raw floating-point type (either float or double)
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- template <typename RawType>
- AssertionResult CmpHelperFloatingPointEQ(const char* lhs_expression,
- const char* rhs_expression,
- RawType lhs_value,
- RawType rhs_value) {
- const FloatingPoint<RawType> lhs(lhs_value), rhs(rhs_value);
- if (lhs.AlmostEquals(rhs)) {
- return AssertionSuccess();
- }
- ::std::stringstream lhs_ss;
- lhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << lhs_value;
- ::std::stringstream rhs_ss;
- rhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << rhs_value;
- return EqFailure(lhs_expression,
- rhs_expression,
- StringStreamToString(&lhs_ss),
- StringStreamToString(&rhs_ss),
- false);
- }
- // Helper function for implementing ASSERT_NEAR.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
- const char* expr2,
- const char* abs_error_expr,
- double val1,
- double val2,
- double abs_error);
- // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
- // A class that enables one to stream messages to assertion macros
- class GTEST_API_ AssertHelper {
- public:
- // Constructor.
- AssertHelper(TestPartResult::Type type,
- const char* file,
- int line,
- const char* message);
- ~AssertHelper();
- // Message assignment is a semantic trick to enable assertion
- // streaming; see the GTEST_MESSAGE_ macro below.
- void operator=(const Message& message) const;
- private:
- // We put our data in a struct so that the size of the AssertHelper class can
- // be as small as possible. This is important because gcc is incapable of
- // re-using stack space even for temporary variables, so every EXPECT_EQ
- // reserves stack space for another AssertHelper.
- struct AssertHelperData {
- AssertHelperData(TestPartResult::Type t,
- const char* srcfile,
- int line_num,
- const char* msg)
- : type(t), file(srcfile), line(line_num), message(msg) { }
- TestPartResult::Type const type;
- const char* const file;
- int const line;
- std::string const message;
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
- };
- AssertHelperData* const data_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
- };
- } // namespace internal
- // The pure interface class that all value-parameterized tests inherit from.
- // A value-parameterized class must inherit from both ::testing::Test and
- // ::testing::WithParamInterface. In most cases that just means inheriting
- // from ::testing::TestWithParam, but more complicated test hierarchies
- // may need to inherit from Test and WithParamInterface at different levels.
- //
- // This interface has support for accessing the test parameter value via
- // the GetParam() method.
- //
- // Use it with one of the parameter generator defining functions, like Range(),
- // Values(), ValuesIn(), Bool(), and Combine().
- //
- // class FooTest : public ::testing::TestWithParam<int> {
- // protected:
- // FooTest() {
- // // Can use GetParam() here.
- // }
- // ~FooTest() override {
- // // Can use GetParam() here.
- // }
- // void SetUp() override {
- // // Can use GetParam() here.
- // }
- // void TearDown override {
- // // Can use GetParam() here.
- // }
- // };
- // TEST_P(FooTest, DoesBar) {
- // // Can use GetParam() method here.
- // Foo foo;
- // ASSERT_TRUE(foo.DoesBar(GetParam()));
- // }
- // INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
- template <typename T>
- class WithParamInterface {
- public:
- typedef T ParamType;
- virtual ~WithParamInterface() {}
- // The current parameter value. Is also available in the test fixture's
- // constructor.
- static const ParamType& GetParam() {
- GTEST_CHECK_(parameter_ != nullptr)
- << "GetParam() can only be called inside a value-parameterized test "
- << "-- did you intend to write TEST_P instead of TEST_F?";
- return *parameter_;
- }
- private:
- // Sets parameter value. The caller is responsible for making sure the value
- // remains alive and unchanged throughout the current test.
- static void SetParam(const ParamType* parameter) {
- parameter_ = parameter;
- }
- // Static value used for accessing parameter during a test lifetime.
- static const ParamType* parameter_;
- // TestClass must be a subclass of WithParamInterface<T> and Test.
- template <class TestClass> friend class internal::ParameterizedTestFactory;
- };
- template <typename T>
- const T* WithParamInterface<T>::parameter_ = nullptr;
- // Most value-parameterized classes can ignore the existence of
- // WithParamInterface, and can just inherit from ::testing::TestWithParam.
- template <typename T>
- class TestWithParam : public Test, public WithParamInterface<T> {
- };
- // Macros for indicating success/failure in test code.
- // Skips test in runtime.
- // Skipping test aborts current function.
- // Skipped tests are neither successful nor failed.
- #define GTEST_SKIP() GTEST_SKIP_("")
- // ADD_FAILURE unconditionally adds a failure to the current test.
- // SUCCEED generates a success - it doesn't automatically make the
- // current test successful, as a test is only successful when it has
- // no failure.
- //
- // EXPECT_* verifies that a certain condition is satisfied. If not,
- // it behaves like ADD_FAILURE. In particular:
- //
- // EXPECT_TRUE verifies that a Boolean condition is true.
- // EXPECT_FALSE verifies that a Boolean condition is false.
- //
- // FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
- // that they will also abort the current function on failure. People
- // usually want the fail-fast behavior of FAIL and ASSERT_*, but those
- // writing data-driven tests often find themselves using ADD_FAILURE
- // and EXPECT_* more.
- // Generates a nonfatal failure with a generic message.
- #define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
- // Generates a nonfatal failure at the given source file location with
- // a generic message.
- #define ADD_FAILURE_AT(file, line) \
- GTEST_MESSAGE_AT_(file, line, "Failed", \
- ::testing::TestPartResult::kNonFatalFailure)
- // Generates a fatal failure with a generic message.
- #define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
- // Like GTEST_FAIL(), but at the given source file location.
- #define GTEST_FAIL_AT(file, line) \
- GTEST_MESSAGE_AT_(file, line, "Failed", \
- ::testing::TestPartResult::kFatalFailure)
- // Define this macro to 1 to omit the definition of FAIL(), which is a
- // generic name and clashes with some other libraries.
- #if !GTEST_DONT_DEFINE_FAIL
- # define FAIL() GTEST_FAIL()
- #endif
- // Generates a success with a generic message.
- #define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
- // Define this macro to 1 to omit the definition of SUCCEED(), which
- // is a generic name and clashes with some other libraries.
- #if !GTEST_DONT_DEFINE_SUCCEED
- # define SUCCEED() GTEST_SUCCEED()
- #endif
- // Macros for testing exceptions.
- //
- // * {ASSERT|EXPECT}_THROW(statement, expected_exception):
- // Tests that the statement throws the expected exception.
- // * {ASSERT|EXPECT}_NO_THROW(statement):
- // Tests that the statement doesn't throw any exception.
- // * {ASSERT|EXPECT}_ANY_THROW(statement):
- // Tests that the statement throws an exception.
- #define EXPECT_THROW(statement, expected_exception) \
- GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
- #define EXPECT_NO_THROW(statement) \
- GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
- #define EXPECT_ANY_THROW(statement) \
- GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
- #define ASSERT_THROW(statement, expected_exception) \
- GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
- #define ASSERT_NO_THROW(statement) \
- GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
- #define ASSERT_ANY_THROW(statement) \
- GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
- // Boolean assertions. Condition can be either a Boolean expression or an
- // AssertionResult. For more information on how to use AssertionResult with
- // these macros see comments on that class.
- #define GTEST_EXPECT_TRUE(condition) \
- GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
- GTEST_NONFATAL_FAILURE_)
- #define GTEST_EXPECT_FALSE(condition) \
- GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
- GTEST_NONFATAL_FAILURE_)
- #define GTEST_ASSERT_TRUE(condition) \
- GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
- GTEST_FATAL_FAILURE_)
- #define GTEST_ASSERT_FALSE(condition) \
- GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
- GTEST_FATAL_FAILURE_)
- // Define these macros to 1 to omit the definition of the corresponding
- // EXPECT or ASSERT, which clashes with some users' own code.
- #if !GTEST_DONT_DEFINE_EXPECT_TRUE
- #define EXPECT_TRUE(condition) GTEST_EXPECT_TRUE(condition)
- #endif
- #if !GTEST_DONT_DEFINE_EXPECT_FALSE
- #define EXPECT_FALSE(condition) GTEST_EXPECT_FALSE(condition)
- #endif
- #if !GTEST_DONT_DEFINE_ASSERT_TRUE
- #define ASSERT_TRUE(condition) GTEST_ASSERT_TRUE(condition)
- #endif
- #if !GTEST_DONT_DEFINE_ASSERT_FALSE
- #define ASSERT_FALSE(condition) GTEST_ASSERT_FALSE(condition)
- #endif
- // Macros for testing equalities and inequalities.
- //
- // * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2
- // * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2
- // * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2
- // * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2
- // * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2
- // * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2
- //
- // When they are not, Google Test prints both the tested expressions and
- // their actual values. The values must be compatible built-in types,
- // or you will get a compiler error. By "compatible" we mean that the
- // values can be compared by the respective operator.
- //
- // Note:
- //
- // 1. It is possible to make a user-defined type work with
- // {ASSERT|EXPECT}_??(), but that requires overloading the
- // comparison operators and is thus discouraged by the Google C++
- // Usage Guide. Therefore, you are advised to use the
- // {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
- // equal.
- //
- // 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
- // pointers (in particular, C strings). Therefore, if you use it
- // with two C strings, you are testing how their locations in memory
- // are related, not how their content is related. To compare two C
- // strings by content, use {ASSERT|EXPECT}_STR*().
- //
- // 3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to
- // {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you
- // what the actual value is when it fails, and similarly for the
- // other comparisons.
- //
- // 4. Do not depend on the order in which {ASSERT|EXPECT}_??()
- // evaluate their arguments, which is undefined.
- //
- // 5. These macros evaluate their arguments exactly once.
- //
- // Examples:
- //
- // EXPECT_NE(Foo(), 5);
- // EXPECT_EQ(a_pointer, NULL);
- // ASSERT_LT(i, array_size);
- // ASSERT_GT(records.size(), 0) << "There is no record left.";
- #define EXPECT_EQ(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2)
- #define EXPECT_NE(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
- #define EXPECT_LE(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
- #define EXPECT_LT(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
- #define EXPECT_GE(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
- #define EXPECT_GT(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
- #define GTEST_ASSERT_EQ(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2)
- #define GTEST_ASSERT_NE(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
- #define GTEST_ASSERT_LE(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
- #define GTEST_ASSERT_LT(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
- #define GTEST_ASSERT_GE(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
- #define GTEST_ASSERT_GT(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
- // Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
- // ASSERT_XY(), which clashes with some users' own code.
- #if !GTEST_DONT_DEFINE_ASSERT_EQ
- # define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
- #endif
- #if !GTEST_DONT_DEFINE_ASSERT_NE
- # define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
- #endif
- #if !GTEST_DONT_DEFINE_ASSERT_LE
- # define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
- #endif
- #if !GTEST_DONT_DEFINE_ASSERT_LT
- # define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
- #endif
- #if !GTEST_DONT_DEFINE_ASSERT_GE
- # define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
- #endif
- #if !GTEST_DONT_DEFINE_ASSERT_GT
- # define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
- #endif
- // C-string Comparisons. All tests treat NULL and any non-NULL string
- // as different. Two NULLs are equal.
- //
- // * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2
- // * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2
- // * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
- // * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
- //
- // For wide or narrow string objects, you can use the
- // {ASSERT|EXPECT}_??() macros.
- //
- // Don't depend on the order in which the arguments are evaluated,
- // which is undefined.
- //
- // These macros evaluate their arguments exactly once.
- #define EXPECT_STREQ(s1, s2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)
- #define EXPECT_STRNE(s1, s2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
- #define EXPECT_STRCASEEQ(s1, s2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)
- #define EXPECT_STRCASENE(s1, s2)\
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
- #define ASSERT_STREQ(s1, s2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)
- #define ASSERT_STRNE(s1, s2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
- #define ASSERT_STRCASEEQ(s1, s2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)
- #define ASSERT_STRCASENE(s1, s2)\
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
- // Macros for comparing floating-point numbers.
- //
- // * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2):
- // Tests that two float values are almost equal.
- // * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2):
- // Tests that two double values are almost equal.
- // * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
- // Tests that v1 and v2 are within the given distance to each other.
- //
- // Google Test uses ULP-based comparison to automatically pick a default
- // error bound that is appropriate for the operands. See the
- // FloatingPoint template class in gtest-internal.h if you are
- // interested in the implementation details.
- #define EXPECT_FLOAT_EQ(val1, val2)\
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
- val1, val2)
- #define EXPECT_DOUBLE_EQ(val1, val2)\
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
- val1, val2)
- #define ASSERT_FLOAT_EQ(val1, val2)\
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
- val1, val2)
- #define ASSERT_DOUBLE_EQ(val1, val2)\
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
- val1, val2)
- #define EXPECT_NEAR(val1, val2, abs_error)\
- EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
- val1, val2, abs_error)
- #define ASSERT_NEAR(val1, val2, abs_error)\
- ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
- val1, val2, abs_error)
- // These predicate format functions work on floating-point values, and
- // can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
- //
- // EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
- // Asserts that val1 is less than, or almost equal to, val2. Fails
- // otherwise. In particular, it fails if either val1 or val2 is NaN.
- GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
- float val1, float val2);
- GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
- double val1, double val2);
- #if GTEST_OS_WINDOWS
- // Macros that test for HRESULT failure and success, these are only useful
- // on Windows, and rely on Windows SDK macros and APIs to compile.
- //
- // * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
- //
- // When expr unexpectedly fails or succeeds, Google Test prints the
- // expected result and the actual result with both a human-readable
- // string representation of the error, if available, as well as the
- // hex result code.
- # define EXPECT_HRESULT_SUCCEEDED(expr) \
- EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
- # define ASSERT_HRESULT_SUCCEEDED(expr) \
- ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
- # define EXPECT_HRESULT_FAILED(expr) \
- EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
- # define ASSERT_HRESULT_FAILED(expr) \
- ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
- #endif // GTEST_OS_WINDOWS
- // Macros that execute statement and check that it doesn't generate new fatal
- // failures in the current thread.
- //
- // * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
- //
- // Examples:
- //
- // EXPECT_NO_FATAL_FAILURE(Process());
- // ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
- //
- #define ASSERT_NO_FATAL_FAILURE(statement) \
- GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
- #define EXPECT_NO_FATAL_FAILURE(statement) \
- GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
- // Causes a trace (including the given source file path and line number,
- // and the given message) to be included in every test failure message generated
- // by code in the scope of the lifetime of an instance of this class. The effect
- // is undone with the destruction of the instance.
- //
- // The message argument can be anything streamable to std::ostream.
- //
- // Example:
- // testing::ScopedTrace trace("file.cc", 123, "message");
- //
- class GTEST_API_ ScopedTrace {
- public:
- // The c'tor pushes the given source file location and message onto
- // a trace stack maintained by Google Test.
- // Template version. Uses Message() to convert the values into strings.
- // Slow, but flexible.
- template <typename T>
- ScopedTrace(const char* file, int line, const T& message) {
- PushTrace(file, line, (Message() << message).GetString());
- }
- // Optimize for some known types.
- ScopedTrace(const char* file, int line, const char* message) {
- PushTrace(file, line, message ? message : "(null)");
- }
- ScopedTrace(const char* file, int line, const std::string& message) {
- PushTrace(file, line, message);
- }
- // The d'tor pops the info pushed by the c'tor.
- //
- // Note that the d'tor is not virtual in order to be efficient.
- // Don't inherit from ScopedTrace!
- ~ScopedTrace();
- private:
- void PushTrace(const char* file, int line, std::string message);
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
- } GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its
- // c'tor and d'tor. Therefore it doesn't
- // need to be used otherwise.
- // Causes a trace (including the source file path, the current line
- // number, and the given message) to be included in every test failure
- // message generated by code in the current scope. The effect is
- // undone when the control leaves the current scope.
- //
- // The message argument can be anything streamable to std::ostream.
- //
- // In the implementation, we include the current line number as part
- // of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
- // to appear in the same block - as long as they are on different
- // lines.
- //
- // Assuming that each thread maintains its own stack of traces.
- // Therefore, a SCOPED_TRACE() would (correctly) only affect the
- // assertions in its own thread.
- #define SCOPED_TRACE(message) \
- ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
- __FILE__, __LINE__, (message))
- // Compile-time assertion for type equality.
- // StaticAssertTypeEq<type1, type2>() compiles if and only if type1 and type2
- // are the same type. The value it returns is not interesting.
- //
- // Instead of making StaticAssertTypeEq a class template, we make it a
- // function template that invokes a helper class template. This
- // prevents a user from misusing StaticAssertTypeEq<T1, T2> by
- // defining objects of that type.
- //
- // CAVEAT:
- //
- // When used inside a method of a class template,
- // StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
- // instantiated. For example, given:
- //
- // template <typename T> class Foo {
- // public:
- // void Bar() { testing::StaticAssertTypeEq<int, T>(); }
- // };
- //
- // the code:
- //
- // void Test1() { Foo<bool> foo; }
- //
- // will NOT generate a compiler error, as Foo<bool>::Bar() is never
- // actually instantiated. Instead, you need:
- //
- // void Test2() { Foo<bool> foo; foo.Bar(); }
- //
- // to cause a compiler error.
- template <typename T1, typename T2>
- constexpr bool StaticAssertTypeEq() noexcept {
- static_assert(std::is_same<T1, T2>::value, "T1 and T2 are not the same type");
- return true;
- }
- // Defines a test.
- //
- // The first parameter is the name of the test suite, and the second
- // parameter is the name of the test within the test suite.
- //
- // The convention is to end the test suite name with "Test". For
- // example, a test suite for the Foo class can be named FooTest.
- //
- // Test code should appear between braces after an invocation of
- // this macro. Example:
- //
- // TEST(FooTest, InitializesCorrectly) {
- // Foo foo;
- // EXPECT_TRUE(foo.StatusIsOK());
- // }
- // Note that we call GetTestTypeId() instead of GetTypeId<
- // ::testing::Test>() here to get the type ID of testing::Test. This
- // is to work around a suspected linker bug when using Google Test as
- // a framework on Mac OS X. The bug causes GetTypeId<
- // ::testing::Test>() to return different values depending on whether
- // the call is from the Google Test framework itself or from user test
- // code. GetTestTypeId() is guaranteed to always return the same
- // value, as it always calls GetTypeId<>() from the Google Test
- // framework.
- #define GTEST_TEST(test_suite_name, test_name) \
- GTEST_TEST_(test_suite_name, test_name, ::testing::Test, \
- ::testing::internal::GetTestTypeId())
- // Define this macro to 1 to omit the definition of TEST(), which
- // is a generic name and clashes with some other libraries.
- #if !GTEST_DONT_DEFINE_TEST
- #define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name)
- #endif
- // Defines a test that uses a test fixture.
- //
- // The first parameter is the name of the test fixture class, which
- // also doubles as the test suite name. The second parameter is the
- // name of the test within the test suite.
- //
- // A test fixture class must be declared earlier. The user should put
- // the test code between braces after using this macro. Example:
- //
- // class FooTest : public testing::Test {
- // protected:
- // void SetUp() override { b_.AddElement(3); }
- //
- // Foo a_;
- // Foo b_;
- // };
- //
- // TEST_F(FooTest, InitializesCorrectly) {
- // EXPECT_TRUE(a_.StatusIsOK());
- // }
- //
- // TEST_F(FooTest, ReturnsElementCountCorrectly) {
- // EXPECT_EQ(a_.size(), 0);
- // EXPECT_EQ(b_.size(), 1);
- // }
- //
- // GOOGLETEST_CM0011 DO NOT DELETE
- #if !GTEST_DONT_DEFINE_TEST
- #define TEST_F(test_fixture, test_name)\
- GTEST_TEST_(test_fixture, test_name, test_fixture, \
- ::testing::internal::GetTypeId<test_fixture>())
- #endif // !GTEST_DONT_DEFINE_TEST
- // Returns a path to temporary directory.
- // Tries to determine an appropriate directory for the platform.
- GTEST_API_ std::string TempDir();
- #ifdef _MSC_VER
- # pragma warning(pop)
- #endif
- // Dynamically registers a test with the framework.
- //
- // This is an advanced API only to be used when the `TEST` macros are
- // insufficient. The macros should be preferred when possible, as they avoid
- // most of the complexity of calling this function.
- //
- // The `factory` argument is a factory callable (move-constructible) object or
- // function pointer that creates a new instance of the Test object. It
- // handles ownership to the caller. The signature of the callable is
- // `Fixture*()`, where `Fixture` is the test fixture class for the test. All
- // tests registered with the same `test_suite_name` must return the same
- // fixture type. This is checked at runtime.
- //
- // The framework will infer the fixture class from the factory and will call
- // the `SetUpTestSuite` and `TearDownTestSuite` for it.
- //
- // Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is
- // undefined.
- //
- // Use case example:
- //
- // class MyFixture : public ::testing::Test {
- // public:
- // // All of these optional, just like in regular macro usage.
- // static void SetUpTestSuite() { ... }
- // static void TearDownTestSuite() { ... }
- // void SetUp() override { ... }
- // void TearDown() override { ... }
- // };
- //
- // class MyTest : public MyFixture {
- // public:
- // explicit MyTest(int data) : data_(data) {}
- // void TestBody() override { ... }
- //
- // private:
- // int data_;
- // };
- //
- // void RegisterMyTests(const std::vector<int>& values) {
- // for (int v : values) {
- // ::testing::RegisterTest(
- // "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr,
- // std::to_string(v).c_str(),
- // __FILE__, __LINE__,
- // // Important to use the fixture type as the return type here.
- // [=]() -> MyFixture* { return new MyTest(v); });
- // }
- // }
- // ...
- // int main(int argc, char** argv) {
- // std::vector<int> values_to_test = LoadValuesFromConfig();
- // RegisterMyTests(values_to_test);
- // ...
- // return RUN_ALL_TESTS();
- // }
- //
- template <int&... ExplicitParameterBarrier, typename Factory>
- TestInfo* RegisterTest(const char* test_suite_name, const char* test_name,
- const char* type_param, const char* value_param,
- const char* file, int line, Factory factory) {
- using TestT = typename std::remove_pointer<decltype(factory())>::type;
- class FactoryImpl : public internal::TestFactoryBase {
- public:
- explicit FactoryImpl(Factory f) : factory_(std::move(f)) {}
- Test* CreateTest() override { return factory_(); }
- private:
- Factory factory_;
- };
- return internal::MakeAndRegisterTestInfo(
- test_suite_name, test_name, type_param, value_param,
- internal::CodeLocation(file, line), internal::GetTypeId<TestT>(),
- internal::SuiteApiResolver<TestT>::GetSetUpCaseOrSuite(file, line),
- internal::SuiteApiResolver<TestT>::GetTearDownCaseOrSuite(file, line),
- new FactoryImpl{std::move(factory)});
- }
- } // namespace testing
- // Use this function in main() to run all tests. It returns 0 if all
- // tests are successful, or 1 otherwise.
- //
- // RUN_ALL_TESTS() should be invoked after the command line has been
- // parsed by InitGoogleTest().
- //
- // This function was formerly a macro; thus, it is in the global
- // namespace and has an all-caps name.
- int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
- inline int RUN_ALL_TESTS() {
- return ::testing::UnitTest::GetInstance()->Run();
- }
- GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
- #endif // GOOGLETEST_INCLUDE_GTEST_GTEST_H_
|